ERD

최종 erd.png

@Entity //(JPA)가 관리하는 객체
@Getter //MemberRecipe 객체의 필드에 접근 가능
public class MemberRecipe {
    @Id //PK역할
    @GeneratedValue(strategy = GenerationType.IDENTITY) //PK의 값을 자동으로 생성하는 전략
    private Long id;
    @ManyToOne
    private Member member;
    @ManyToOne
    private Recipe recipe;

    @Builder //생성자에 @Builder 적용
		// Lombok 어노테이션 , Member와 Recipe 객체를 전달하여 MemberRecipe 객체를 생성 가능
    public MemberRecipe(Member member, Recipe recipe) {
        this.member=member;
        this.recipe=recipe;
				//Member와 Recipe 객체간의 양방향 관계를 설정하기 위한 코드 
        member.getMemberRecipeList().add(this); (A)
        recipe.getMemberRecipeList().add(this); (B)
    }
}
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
**private List<MemberRecipe> memberRecipeList** = new ArrayList<>();
@OneToMany(mappedBy = "recipe")
**private List<MemberRecipe> memberRecipeList** = new ArrayList<>();
/** 이 Recipe 생성 후 RecipeIngredient의 인자로 넣기. 스크랩 할 때는 MemberRecipe의 인자로 넣기 */

<aside> 🔑 Member와 연관지어 생각해보기

(A)

Member와 Recipe 객체 간의 양방향 관계를 설정하기 위한 코드

Member 객체와 연결된 MemberRecipe객체를 Member의 MemberRecipeList에 추가

(B)

Member와 Recipe 객체 간의 양방향 관계를 설정하기 위한 코드

Recipe 객체와 연결된 MemberReipe객체를 Recipe의 MemberRcipeList에 추가

</aside>

JPA 1:N N:1 매핑에 대한 고민

memberRecipeList에 넣는방식이 아니라

status를 추가해서 status가 true인 것들을 반환하도록 하는 것은 어떨까?

짚고 넘어가야하는 점 (고민거리)

  1. MemberRecipeList에 [[user1, 1],[user1,2]’’’] 이런식으로 들어가는게 비효율적이지 않나요 ?
  2. 그렇다면, 차라리 이런 List보다는 entity에 status를 추가하는건 어떨까요 ?
    1. 스크랩 post단계 : status (default : false) 가 true가 됨
    2. 스크랩 delete단계 : status 가 false가 됨 ⇒ delete가 아니라 patch형식으로 가도 되지않을까요 ?

멘토링 및 질문 답변

Member와 Recipe 란 db 안에 MemberRecipe란 객체가 그대로 들어가는 형태임

양방향관계 Mapping을 할때는 1:N 을 2번이어서 중간 Entity를 만들어야 안전하다

스프링 JPA에서 양방향 매핑이 @ManyToMany가 있기는 한데 이게 좀 문제가 일으킬 가능성이 높아서 중간에 엔티티를 하나 생성해서 간접적으로 양방향 매핑을 구현한 느낌?으로 보시면 될 것 같아요!

보통 양방향 매핑은 이렇게 중간 엔티티를 생성해서 구현한다고 합니다!