@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 |