[Spring] @OneToMany 와 @ManyToOne

@OneToMany,  @ManyToOne 

- JPA에서 엔티티 간의 양방향 관계를 매핑할 때 사용되는 어노테이션

 

1. @OneToMany

- 일(One) 쪽 엔티티에서 다(Many) 쪽 엔티티로의 관계를 정의

- 하나의 일(One) 엔티티가 여러 개의 다(Many) 엔티티와 관계를 맺고 있을 때 사용

- mappedBy: 양방향 매핑 시, 연관 관계의 주인이 되는 엔티티의 필드를 지정한다.

 

2. @ManyToOne

- 다(Many) 쪽 엔티티에서 일(One) 쪽 엔티티로의 관계를 정의

- 여러 개의 다(Many) 엔티티가 하나의 일(One) 엔티티와 관계를 맺고 있을 때 사용

- optional: 연관 엔티티가 항상 있어야 하는지 여부를 지정, 기본값은 true이며, false로 설정하면 NOT NULL 제약조건 설정

- fetch: 연관된 엔티티를 조회할 때 어떻게 가져올지 설정

          : 기본값은 FetchType.EAGER 즉시 로딩이며, FetchType.LAZY로 설정하면 지연 로딩이 된다.

 

3. 양방향 관계
- 양방향 관계를 매핑하려면 @OneToMany와 @ManyToOne를 함께 사용해야 한다

- 양방향 매핑에서 mappedBy 속성은 연관 관계의 주인이 되는 엔티티 필드를 지정한다.

 

4. ManyToMany는 사용을 지양해야한다. 

- 일대다 + 다대일로 구현

 

5. 모든 연관 관계는 지연로딩으로 설정 
- 모든 연관관계는 지연로딩으로 설정!
- 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.
- 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
- 연관된 엔티티를 함께 DB에서 조회해야 하면, Fetch Join 또는 엔티티 그래프 기능을 사용한다.
- @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다.

'Spring' 카테고리의 다른 글

[Spring] JWT(Java Web Token)  (0) 2023.12.24
[Spring] Cookie & Session  (0) 2023.12.24
[Spring] Entity  (0) 2023.12.21
[Spring] 스프링 객체 관리 / 빈(Bean)  (1) 2023.12.20
[Spring] Layered Architecture  (1) 2023.12.20