본문 바로가기
Spring/JPA

연관관계 - @ManyToMany

by YellowCow 2023. 3. 23.

JPA에서는 DB 테이블 간 관계를 매핑하기 위한 어노테이션들을 지원한다

 

이 페이지에서는 N:M 관계를 매핑하는 @ManyToMany 어노테이션에 대해 알아보겠다

 

Entity

Entity 상에서 아래와 같이 N:M 관계를 표현할 수 있다

 

DB

실제 테이블 에서는 N:M 관계를 표현할 수 없다

N:M관계를 표현하기 위해 중간에 연결 테이블을 두어 1:N과 N:1관계로 풀어서 표현한다

 

아래 그림에서 N:M관계인 Order와 Item의 관계를

연결 테이블인 OrderItem 테이블을 두어 1:N, N:1 관계로 풀어서 표현하는 것을 볼 수 있다

 

 

양방향 연관관계 적용 

1. N:M 관계에서 M의 관계인 Item에 Orders 참조변수 추가

 

2. ManyToMany 관계 설정 및 mappedBy 속성 추가

 

@ManyToMany 관계를 사용하면 안 되는 이유

연결 테이블이 연결만 하고 끝나지 않음

@ManyToMany 관계를 설정할 경우

JPA에서 아래 그림처럼 연결 테이블 ORDER_ITEM을 생성해준다

 

ORDER_ITEM에 ORDER와 ITEM 테이블을 연결하기 위한 키 값인 ORDER_ID, ITEM_ID 외에도

NUM_OF_ITEM(총 구매수량), TOTAL_PRICE(총 구매액)이 추가될 수도 있다

 

또한, 데이터를 CRUD할 때 쿼리가 복잡해 지는 문제가 있다

 

위 문제로 인해 실무에서는 잘 쓰이지 않기도 하고 사용을 권장하지 않는다

 

@ManyToMany 를 @ManyToOne과 @OneToMany로 표현해야 한다

ORDER_ITEM 테이블에 ORDER와 ITEM 테이블을 연결하기 위한 키 값인 ORDER_ID, ITEM_ID 외에도

NUM_OF_ITEM(총 구매수량), TOTAL_PRICE(총 구매액)이 추가될 수도 있기 때문에

 

아래와 같이 OrderItem Entity를 별도로 작성하고

Order와 Item 엔티티를 각각 @ManyToOne과 @OneToMany로 표현한다

'Spring > JPA' 카테고리의 다른 글

@MappedSuperclass  (0) 2023.03.24
상속관계 매핑  (0) 2023.03.24
연관관계 - @OneToOne  (0) 2023.03.22
연관관계 - @OneToMany  (0) 2023.03.18
연관관계 - @ManyToOne  (0) 2023.03.17

댓글