개발자꿈나무

다양한 연관관계 - 다대다 본문

자바/JPA

다양한 연관관계 - 다대다

망재이 2023. 8. 17. 15:39

★ 다대다 [N:M]

- 정규화된 관계형 데이터베이스는 테이블 2개로 다대다 관계를 표현할 수 없고 연결 테이블을 생성해서 다대일 일대다 관계로 풀어야 한다.

- 하지만 객체는 양쪽에 컬렉션들을 참조해서 다대다 관계를 만들 수 있다.

 

 

  • 다대다 단방향

Member 엔티티

- @ManyToMany 어노테이션을 달아주고 @JoinColumn이 아니라 @JoinTable 어노테이션을 이용해 연결 테이블을 매핑해준다.

  • @JoinTable.name : 연결 테이블 이름을 지정한다.
  • @JoinTable.joinColumns : 현재 방향인 회원과 매핑할 조인 컬럼 정보를 지정한다.
  • @JoinTable.inverseJoinColumns : 반대 방향인 상품과 매핑할 조인 컬럼 정보를 지정한다.

- MEMBER 테이블과 PRODUCT 테이블 사이에 MEMBER_PRODUCT 테이블이 생긴 모습을 확인할 수 있다.

 

  • 다대다 양방향

Product 엔티티

- 연관관계 주인이 아닌 참조에 mappedBy 속성을 이용해 매핑해준다.

 

 

★ 다대다 매핑의 한계

- @ManyToMany 만으로 연결 테이블을 매핑하고 자동으로 처리해주므로 굉장히 편리하지만 실제 실무에서는 사용할 일이 거의 없다.

- MEMBER_PRODUCT 테이블만 생각해봐도 단순히 각각의 PK값만 들어오는게 아니라 주문 수량, 주문 시간 등 추가적인 정보가 필요하기 때문이다. 다대다 매핑만으로는 연결 테이블을 관리할 수 있는 방법이 없으므로 다대일, 일대다 관계로 풀어서 엔티티를 직접 관리해주어야 한다.

- 다대다 관계를 풀어내기 위해서는 Member와 Product 테이블과 식별 관계인 복합키를 가진 연결 테이블을 생성해서 관리해줘도 되고, 앞서 해왔던 방식처럼 고유의 PK 값을 생성해주고 다대일, 일대다 매핑을 통해 연결 테이블을 관리해줘도 된다.

새로운 PK 값을 지정해서 다른 값들을 지정해준 연결 테이블 모습

 

728x90