N+1 문제
: JPA가 연관된 엔티티를 조회할 때 추가적인 쿼리(N개)를 반복적으로 실행하기 때문에 발생하는 문제
Lazy Loading
지연 로딩(Lazy Loading)은 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식(N+1 문제 발생)
Eager Loading
즉시 로딩(Eager Loading)은 엔티티를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식
Entity클래스에서 해당 필드의 Fetchtype을 Eager로 설정하면 N+1 문제가 발생하지 않는다.
하지만 연관된 객체를 매번 함께 조회하는것은 낭비인 경우가 있다.
해결방안
Fetchtype을 Lazy로 설정하되 추후에 쿼리를 작성할 때 fetch join을 사용하여 해당 부분은 Eager로 동작하게 한다.
Fetch join
JPQL에서 성능 최적화를 위해 fetch join을 제공하며 연관된 엔티티나 컬렉션을 SQL 한번으로 조회할 수 있도록 해주는 기능이다. fetch join은 SQL의 JOIN과는 다른 종류이고 객체 그래프를 SQL 한 번에 조회한다. 실무에서 굉장히 많이 활용한다.
추가로 fetch join과 동일한 동작을 하는 @EntityGraph와 @Batchsize가 있다.
- Fetch Join:
- 단순 조회 및 연관 엔티티가 많지 않은 경우
- 페이징 처리가 필요 없는 상황
- EntityGraph:
- 재사용 가능한 로딩 전략이 필요한 경우
- 특정 쿼리에서만 연관 데이터 로딩 제어가 필요할 때
- BatchSize:
- 대규모 데이터셋 조회 시 일괄 로딩으로 최적화가 필요할 때
'개발 > 부트캠프' 카테고리의 다른 글
| 본캠프 : 페이징 조회 Pageable (0) | 2025.03.03 |
|---|---|
| 본캠프 : BaseEntity 사용 (0) | 2025.03.02 |
| 본캠프 : 테스트 코드 (0) | 2025.02.26 |
| 본캠프 : 챌린지반 특강_Git (0) | 2025.02.25 |
| 본캠프 : 특강_영속성 컨텍스트 (Persistence Context) (0) | 2025.02.24 |