N+1 문제 (fetch join)

정종일·2023년 2월 20일
0

Develop

목록 보기
1/5

언제 발생할까?

연관관계를 가지는 Entity를 조회할 때 발생할 수 있다. 상황을 가정해보자.

사람이 10명 있다. 각 인물은 고양이를 5마리씩 키우고 있다.

이 때 사람을 조회하면

people을 조회하는 쿼리 1개 + 각 사람이 기르고 있는 고양이들을 조회하는 쿼리 1개씩 총 10개

총합 11개의 쿼리가 나간다.

fetchType.LAZY

엔티티 정의 시 fetchType을 LAZY로 설정하면 N+1문제가 해결된다고 알고 있는 분들이 많은데 해결되는 것이 아니라 N+1 문제의 발생 시점에 차이가 있을 뿐이다.

EAGER 타입으로 설정하면 해당 엔티티를 조회하는 순간 N+1 문제가 발생하고

LAZY 타입으로 설정하면 해당 엔티티를 가져온 후 실제 사용하는 순간 N+1 문제가 발생한다.

해결법은?

fetchJoin을 사용해 엔티티를 조회할 때 연관관계에 해당하는 Entity까지 한 번에 가져오도록 하면 해결 가능하다.

Fetch Join의 단점 (주의사항)

  • 무분별한 사용은 레포지토리 메서드의 증가를 부른다.
    • 특정 화면 전용으로 사용하는 재사용이 불가능한 메서드의 증가
    • 프레젠테이션 계층(view)이 데이터 접근 계층(repository)을 침범
  • 페이징 API를 사용할 수 없다.
    • 일대다 관계에서는 1개 이상의 결과가 만들어지므로 몇 개를 추출할 것인지 단정지을 수 없기 때문 (@BatchSize 사용으로 보완)

출처
https://incheol-jung.gitbook.io/docs/q-and-a/spring/n+1

profile
제어할 수 없는 것에 의지하지 말자

0개의 댓글