@ManyToMany & JoinTable vs @ManyToOne & 연결 테이블 & @OneToMany

일단 해볼게·2023년 3월 24일
0

Springboot

목록 보기
20/26

@ManyToMany & JoinTable

@Entity
public class Product {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private String name;

   @ManyToMany(mappedBy = "products")
   private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
  ...
   
   @ManyToMany
   @JoinTable(name = "member_product")
   private List<Product> products = new ArrayList<>();
   
  ...
}
  • JPA @ManyToMany 어노테이션을 사용하고
  • @JoinTable로 연결 테이블을 지정해줄 수 있다.

@ManyToMany & JoinTable의 한계

  • 편리해 보이지만 실무에서 사용하면 안된다.
  • 개발하다 보면, 연결 테이블이 단순히 연결만 하고 끝나지 않는다. 조인 테이블 자체에 주문시간, 수량 같은 추가 데이터가 많이 들어갈 수 있다.
  • 하지만, 매핑 정보만 넣는 것이 가능하고, 추가 정보를 넣는 것 자체가 불가능하다.
  • 그리고 중간 테이블이 숨겨져 있기 때문에 예상하지 못하는 쿼리들이 나간다.
  • 이런 문제점들 때문에 실무에서는 안쓰는게 맞다고 본다.

@ManyToMany & JoinTable의 한계 극복 → @ManyToOne & 연결 테이블 & @OneToMany

@Entity
public class Member {
  ...
       
   @OneToMany(mappedBy = "member")
   private List<MemberProduct> memberProducts = new ArrayList<>();

  ...
}
@Entity
@Getter
@Setter
public class MemberProduct {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @ManyToOne
   @JoinColumn(name = "member_id")
   private Member member;

   @ManyToOne
   @JoinColumn(name = "product_id")
   private Product product;
}
@Entity
public class Product {

  ...

   @OneToMany(mappedBy = "product")
   private List<MemberProduct> members = new ArrayList<>();
   
  ...
}
  • JPA가 만들어주는 숨겨진 매핑테이블의 존재를 바깥으로 꺼내는 것이다.

결론

  • 중간 테이블이 숨겨져 있기 때문에 예상하지 못하는 쿼리들이 나간다.
    • 매핑테이블을 밖으로 꺼낸다.
  • 매핑 테이블에 추가 데이터가 들어가는 경우가 발생할 수 있기 때문에 매핑 테이블을 분리하는게 좋다.
  • 현재 개발하고 있는 프로젝트에도 위의 예시처럼 member - 매핑 테이블 - task 로 분리할 예정이다.

참고
https://ict-nroo.tistory.com/127
자바 ORM 표준 JPA 프로그래밍

https://happyer16.tistory.com/entry/Spring-JPA-다대다-설정-및-주의-Many-To-Many

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글