Skip to content

Commit

Permalink
#310 Refactor: 와인 관련 엔티티 casecase, nullable 정리 (#317)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeongyun1206 authored Jan 9, 2025
2 parents 0e958db + 8236ed4 commit 1ff3b1f
Show file tree
Hide file tree
Showing 25 changed files with 127 additions and 227 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,14 @@
import com.drinkeg.drinkeg.domain.party.domain.Party;
import com.drinkeg.drinkeg.domain.recomment.domain.Recomment;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Comment extends BaseEntity {

@Id
Expand All @@ -36,11 +31,27 @@ public class Comment extends BaseEntity {
private String content;

@OneToMany(mappedBy = "comment", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Recomment> recomments = new ArrayList<>();
private List<Recomment> recomments;

@Builder.Default
private boolean isDeleted = false;

public static Comment create(Member member, Party party, String content) {
return Comment.builder()
.member(member)
.party(party)
.content(content)
.build();
}

@Builder
public Comment(Party party, Member member, String content, List<Recomment> recomments) {
this.party = party;
this.member = member;
this.content = content;
this.recomments = recomments != null ? recomments : new ArrayList<>();
this.isDeleted = false;
}

public void addRecomment(Recomment recomment) {
this.recomments.add(recomment);
recomment.setParentComment(this); // 자식의 참조도 설정
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@ public class CommentRequestDTO {


public static Comment toEntity(CommentRequestDTO commentRequest, Party party, Member member) {
return Comment.builder()
.party(party)
.member(member)
.content(commentRequest.getContent())
.isDeleted(false) // 기본값 설정
.build();
return Comment.create(member, party, commentRequest.getContent());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,9 @@ public static CommentResponseDTO fromEntity(Comment comment, String timeAgo, Str

public static Comment setDeleted(Comment comment) {
comment = Comment.builder()
.id(comment.getId())
.party(comment.getParty())
.member(comment.getMember())
.content("삭제된 댓글입니다.")
.isDeleted(true)
.build();
return comment;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,19 +64,19 @@ public class Member {

private boolean agreement;


// CascadeType.ALL: Member 엔티티가 삭제되면 연관된 TastingNote 엔티티도 삭제
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
@OneToMany(mappedBy = "member")
private List<TastingNote> tastingNotes = new ArrayList<>();

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
// CascadeType.REMOVE: Member 엔티티가 삭제되면 연관된 WineWishlist 엔티티도 삭제
@OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<WineWishlist> wineWishlists = new ArrayList<>();

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
// CascadeType.REMOVE: Member 엔티티가 삭제되면 연관된 MyWine 엔티티도 삭제
@OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<MyWine> myWines = new ArrayList<>();

@Builder
private Member(String name, String email, Role role, Provider provider, String username, String password,
public Member(String name, String email, Role role, Provider provider, String username, String password,
String region, Boolean isNewbie, Boolean isFirst, Long monthPriceMax,
List<String> wineSort, List<String> wineArea, boolean agreement, boolean isAdult) {
this.name = name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;

import java.time.LocalDate;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MyWineRequest {

@NotNull(message = "와인 id는 null 일 수 없습니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ public class MyWine {
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
@JoinColumn(name = "member_id", nullable = false)
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "wine_id")
@JoinColumn(name = "wine_id", nullable = false)
private Wine wine;

private LocalDate purchaseDate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,15 @@

import com.drinkeg.drinkeg.domain.myWine.domain.MyWine;
import com.drinkeg.drinkeg.domain.wine.domain.Wine;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MyWineResponse {
private Long myWineid;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,4 @@ public ApiResponse<String> deleteTastingNote(@AuthenticationPrincipal PrincipalD
return ApiResponse.onSuccess("노트 삭제 완료");
}

// 선택한 노트 보기
@GetMapping("/nose")
@Operation(summary = "사용자가 선택/직접입력 한 Nose List 보여주기", description = "사용자가 선택/집접입력 한 Noes List 보여주기")

public ApiResponse<List<Map<Long, String>>> showMemberNoseMapList(@AuthenticationPrincipal PrincipalDetail principalDetail) {

List<Map<Long, String>> noseMapList =
tastingNoteService.showMemberNoseMapList(principalDetail.getUsername());
return ApiResponse.onSuccess(noseMapList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
import com.drinkeg.drinkeg.domain.wine.domain.Wine;
import jakarta.persistence.*;
import lombok.*;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;

import static jakarta.persistence.FetchType.*;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Slf4j
public class TastingNote extends BaseEntity {

@Id
Expand Down Expand Up @@ -51,6 +53,25 @@ public class TastingNote extends BaseEntity {

private String review;

@Builder
public TastingNote(Member member, Wine wine, String color, LocalDate tasteDate,
int sugarContent, int acidity, int tannin, int body, int alcohol,
List<TastingNoteNose> noseList, float rating, String review) {
this.member = member;
this.wine = wine;
this.color = color;
this.tasteDate = tasteDate;
this.sugarContent = sugarContent;
this.acidity = acidity;
this.tannin = tannin;
this.body = body;
this.alcohol = alcohol;
this.noseList = noseList != null ? noseList : new ArrayList<>();
this.rating = rating;
this.review = review;
}

// TastingNote 생성 매서드
public static TastingNote create(Member member, Wine wine, TastingNoteRequest tastingNoteRequest) {
TastingNote tastingNote = TastingNote.builder()
.member(member)
Expand All @@ -65,9 +86,10 @@ public static TastingNote create(Member member, Wine wine, TastingNoteRequest ta
.rating(tastingNoteRequest.getRating())
.review(tastingNoteRequest.getReview())
.build();
for (String noseElement : tastingNoteRequest.getNose()){
tastingNote.addNoseElement(noseElement);
}

Set<String> uniqueNoseElements = new HashSet<>(tastingNoteRequest.getNose());
uniqueNoseElements.forEach(tastingNote::addNoseElement);

return tastingNote;
}

Expand All @@ -78,55 +100,33 @@ public TastingNote addNoseElement(String noseElement) {
return this;
}

public TastingNote removeTastingNoteNose(TastingNoteNose tastingNoteNose) {
noseList.remove(tastingNoteNose);
tastingNoteNose.updateTastingNote(null);
public TastingNote removeNose(TastingNoteNose nose) {
this.noseList.remove(nose);
nose.updateTastingNote(null);
return this;
}

public void updateColor(String color) {
this.color = color;
}
public void updateTasteDate(LocalDate tasteDate) {
this.tasteDate = tasteDate;
}
public void updateSugarContent(int sugarContent) {
this.sugarContent = sugarContent;
}
public void updateAcidity(int acidity) {
this.acidity = acidity;
}
public void updateTannin(int tannin) {
this.tannin = tannin;
}
public void updateBody(int body) {
this.body = body;
}
public void updateAlcohol(int alcohol) {
this.alcohol = alcohol;
}
public void updateRating(float rating) {
this.rating = rating;
}
public void updateReview(String review) {
this.review = review;

public void updateTastingNote(String color, LocalDate tasteDate,
Integer sugarContent, Integer acidity, Integer tannin, Integer body, Integer alcohol,
List<String> updateNoseList, Float rating, String review){
if (color != null) this.color = color;
if (tasteDate != null) this.tasteDate = tasteDate;
if (sugarContent != null) this.sugarContent = sugarContent;
if (acidity != null) this.acidity = acidity;
if (tannin != null) this.tannin = tannin;
if (body != null) this.body = body;
if (alcohol != null) this.alcohol = alcohol;
if (rating != null) this.rating = rating;
if (review != null) this.review = review;
if (updateNoseList != null) this.updateTastingNoteNoseList(updateNoseList);
}

@Builder
public TastingNote(Member member, Wine wine, String color, LocalDate tasteDate,
int sugarContent, int acidity, int tannin, int body, int alcohol,
List<TastingNoteNose> noseList, float rating, String review) {
this.member = member;
this.wine = wine;
this.color = color;
this.tasteDate = tasteDate;
this.sugarContent = sugarContent;
this.acidity = acidity;
this.tannin = tannin;
this.body = body;
this.alcohol = alcohol;
this.noseList = noseList != null ? noseList : new ArrayList<>();
this.rating = rating;
this.review = review;
public void updateTastingNoteNoseList(List<String> updateNoseList) {
// 기존 noseList 전체 삭제
noseList.forEach(this::removeNose);
// updateNoseList로 대체
Set<String> uniqueNoseElements = new HashSet<>(updateNoseList);
uniqueNoseElements.forEach(this::addNoseElement);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(
uniqueConstraints = @UniqueConstraint(columnNames = {"tasting_note_id", "nose_element"})
)
public class TastingNoteNose {

@Id
Expand All @@ -14,10 +17,11 @@ public class TastingNoteNose {

// TastingNote와의 다대일 관계 설정
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "tasting_note_id")
@JoinColumn(name = "tasting_note_id", nullable = false)
private TastingNote tastingNote;

// 향 요소
@Column(nullable = false)
private String noseElement;

public void updateTastingNote(TastingNote tastingNote) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.drinkeg.drinkeg.domain.tastingNote.dto.request;

import com.querydsl.core.annotations.QueryProjection;
import jakarta.validation.constraints.*;
import lombok.Builder;
import lombok.Getter;
import lombok.*;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TastingNoteRequest {

@NotNull(message = "와인 ID는 필수입니다.")
Expand All @@ -21,7 +20,6 @@ public class TastingNoteRequest {
@NotNull(message = "시음 날짜는 필수입니다")
private LocalDate tasteDate;


@NotNull(message = "당도 선택은 필수입니다.")
@Min(value = 0, message = "당도는 0 이상 100 이하의 정수 값이어야 합니다.")
@Max(value = 100, message = "당도는 0 이상 100 이하의 정수 값이어야 합니다.")
Expand Down Expand Up @@ -50,7 +48,6 @@ public class TastingNoteRequest {
@NotEmpty(message = "향 선택은 필수입니다.")
private List<String> nose = new ArrayList<>();


@NotNull(message = "만족도 선택은 필수입니다.")
@Min(value = 0, message = "만족도는 0 이상 5 이하의 실수 값이어야 합니다.")
@Max(value = 5, message = "만족도는 0 이상 5 이하의 실수 값이어야 합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ public class TastingNoteUpdateRequest {
@Max(value = 100, message = "알콜도는 0 이상 100 이하의 정수 값이어야 합니다.")
private Integer alcohol;

private final List<String> addNoseList = new ArrayList<>();
private final List<Long> removeNoseList = new ArrayList<>();
private final List<String> updateNoseList = new ArrayList<>();

@Min(0)
@Max(5)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.Builder;
import com.drinkeg.drinkeg.domain.wine.domain.Wine;
import com.querydsl.core.annotations.QueryProjection;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -16,7 +17,7 @@
import java.util.stream.Collectors;

@Getter
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TastingNoteResponse {

private Long noteId;
Expand Down
Loading

0 comments on commit 1ff3b1f

Please sign in to comment.