연관관계 매핑 시 고려사항 3가지
- 다중성(Multiplicity)
- N:1 @ManyToOne
- 1:N @OneToMany
- 1:1 @OneToOne
- N:M @ManyToMany
- 방향(Direction) : 단방향(한 쪽만 참조), 양방향(양쪽 서로 참조)
- 방향은 객체 관계에만 존재하고, 테이블은 항상 양방향이다.
- 연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리 주인을 정한다.
- mappedBy 속성으로 주인 필드 지정
N:M
- 관계형 DB 는 정규화된 테이블 2개로 N:M 관계를 표현할 수 없다.
- 중간 연결 테이블을 추가해서 1:N, N:1 관계로 풀어내야 한다.
- 하지만 객체는 컬렉션을 사용해서 객체 2개로 대다다 관계를 만들 수 있다.
다대다 매핑의 한계

- 회원은 여러 상품을 가질 수 있으며, 상품 또한 여러 회원을 포함할 수 있다.
- @ManyToMany 사용, @JoinTable 으로 연결 테이블 생성 가능
- 편리해 보이지만 실무에서는 사용하지 않는다.
- 주문 시간, 수량 같은 추가 데이터를 연결 테이블에 넣어서 사용 불가
다대다 한계 극복

- 연결 테이블용 엔티티를 추가한다.
- @ManyToMany → @OneToMany, @ManyToOne
- 위 그림에서는 Member_Product 의 MEMBER_ID 와 PRDUCT_ID 를 묶어서 PK로 사용했지만, 실제로는 아래처럼 독립적으로 Generated 되는 Id 를 사용하는 것을 권장한다.