다대다 매핑
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
중간에 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 한다.

이와 달리 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계를 표현할 수 있다.

Member는 productList를 가지고, Product는 memberList를 가진다.
다대다는 @ManyToMany를 사용하고, @JoinTable로 연결 테이블을 지정한다.
양쪽 테이블의 PK가 FK가 된다.
//Member.java
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT")
private List<Product> products = new ArrayList<>();
다대다 매핑도 단방향, 양방향 매핑이 모두 가능하다.
양방향 매핑을 하고 싶으면 아래 코드를 추가하면 된다.
//Product.java
@ManyToMany(mappedBy = "products")
private List<Member> members = new ArrayList<>();
다대다 매핑의 한계와 극복
한계
편리 보이지만 실무에서 사용하면 안된다.
다대다 연결 테이블에 매핑 정보만 들어가고, 추가 컬럼이 들어갈 수 없다.
실무에서는 연결 테이블이 단순히 연결만 하고 끝나지 않는다.
예를 들어 주문시간, 수량 같은 데이터가 추가로 들어올 수 있다.
극복
연결 테이블을 엔티티로 승격시킨다.
다대다 관계를 다대일, 일대다 관계로 풀어낸다.

중간 엔티티를 만들면 여러 필드를 추가할 수 있다.
//MemberProduct.java 엔티티명을 Orders로 변경할 수도 있음
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
//Member.java
@OneToMany(mappedBy = "member")
private MemberProduct memberProducts = new ArrayList<>():
//Product.java
@OneToMany(mappedBy = "product")
private List <MemberProduct> memberProducts = new ArrayList<>();
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자
www.inflearn.com