# 실전 예제 3 - 다양한 연관관계 매핑

**배송, 카테고리** 추가 - 엔티티

주문: 배송 = 1:1\
상품:카테고리 = N:M (@ManyToMany)\
여러개의 상품이 한 카테고리에 속할 수 있고, 한 상품은 여러개의 카테고리에 속할 수 있다.\
다대다 관계는 다대일, 일대다로 풀어내는 것이 좋지만 예시를 위해 다대다로 구현해본다.

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-Mehn_FxRw_UjqGomuek%2F-Mehnc8CpHNG7LXpMl1k%2F%E1%84%89%E1%85%B5%E1%86%AF%E1%84%8B%E1%85%A83%201st.png?alt=media\&token=2967e4ce-c6d8-45e1-8d13-0ceec048afea)

![ERD](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-Mehll942WCtGIC5KHt9%2F-MehnYar3mKZ8EWkctzC%2F%E1%84%89%E1%85%B5%E1%86%AF%E1%84%8B%E1%85%A83%20ERD.png?alt=media\&token=1c57ef7e-7a3c-4889-bd79-d65625285974)

주문-배송(1:1) 관계에서 주문을 주 테이블로 잡는다. 주문을 통해 배송을 조회하기 때문이다.

![엔티티 상세 설계 & 매핑](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-Mehnhh6Tw4BO4d3A1y3%2F-MehntkPHqf9Ud29wkkW%2F%E1%84%89%E1%85%B5%E1%86%AF%E1%84%8B%E1%85%A83%20%E1%84%8B%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B5%E1%84%90%E1%85%B5%20%E1%84%89%E1%85%A1%E1%86%BC%E1%84%89%E1%85%A6.png?alt=media\&token=9907d835-c21c-4520-8997-61afb325ef1d)

양방향 관계 매핑할 때 헷갈리는 점

**주테이블 또는 주인** : **@JoinColumn**(name = " NAME ")\
NAME 은 **참조하는 엔티티의 ID(상대 엔티티의 @Column의 name**이다! \
그러므로 A에서 B를 참조할 경우, B의 ID 이&#xB984;**@Column(name = "...")**&#xC744; 넣어주면 된다!

대상 테이블 또는 주인반대편 : @XtoY(**mappedBy** = " NAME ")\
매핑대상이 되는 엔티티는 mappedBy를 붙여주고 **주인 엔티티(주테이블)에서의 해당 엔티티 필드 변수명**을 넣어주면 된다!!!

다대다 관계

1. 한쪽을 주인으로 정하고, 주인 객체에서 중간 테이블을 생성한다.(@JoinTable)
2. 현재 객체의 매핑할 필드(칼럼)와 상대 객체의 매핑할 필드(칼럼)을 매핑한다!\
   @joinColumns = @JoinColumn(name = "현재 객체 매핑 필드"),\
   @inverseJoinColumns = @JoinColumn(name="상대 객체 매핑 필드")
3. 주인 반대편의 상대 객체는 @ManyToMany(mappedBy = "filed\_name")으로 해준다!

정리

N:M 관계는 1:N, N:1로(실전에서 @ManyToMany 사용❌)

* 중간에 엔티티를 하나 생성해서 1:N, N:1로 만든다!
* 실전에서는 중간 테이블이 단순하지 않다!!
* 제약 : 중간테이블에 필드 추가 불가, 엔티티 테이블 불일치

@ManyToOne 주요 속성\
특징 : mappedBy가 없다 => @ManyToOne은 주인이 되야한다.

| 속성            | 설명                                                                      | 기본값                                                                   |
| ------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------- |
| optional      | false로 설정하면 연관된 엔티티가 항상 있어야 함.                                          | TRUE                                                                  |
| **fetch⭐️**   | 글로벌 fetch 전략 설정                                                         | <p>@ManyToOne : FetchType.EAGER</p><p>@OneToMany : FetchType.LAZY</p> |
| **cascade⭐️** | 영속성 전이 기능 사용                                                            |                                                                       |
| targetEntity  | <p>연관된 엔티티의 타입 정보를 설정</p><p>컬렉션을 사용해도 제네릭으로 타입 정보 알 수 있기 때문에 거의 사용❌</p> |                                                                       |

**@JoinColumn : (주인 또는 주테이블이)외래 키를 매핑할 때 사용⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️**

![](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-Mec-F-0IQyKOyLDKNwU%2F-Mec-LepYrKWJE85P71C%2FScreen%20Shot%202021-07-15%20at%2011.31.28%20AM.png?alt=media\&token=0ccfba60-465c-4c58-a29b-3f62860e8b73)

@OneToMany 주요 속성

| 속성            | 설명                                                                      | 기본값                                                                   |
| ------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------- |
| **mappedBy**  | **연관관계의 주인 필드**를 선택한다!!!                                                |                                                                       |
| **fetch⭐️**   | 글로벌 fetch 전략 설정                                                         | <p>@ManyToOne : FetchType.EAGER</p><p>@OneToMany : FetchType.LAZY</p> |
| **cascade⭐️** | 영속성 전이 기능 사용                                                            |                                                                       |
| targetEntity  | <p>연관된 엔티티의 타입 정보를 설정</p><p>컬렉션을 사용해도 제네릭으로 타입 정보 알 수 있기 때문에 거의 사용❌</p> |                                                                       |
