N+1 문제에 대한 고찰(2)

Hoo-Sung.Lee·2024년 6월 29일
0

Spring

목록 보기
11/15


이번 시간에는 @toOne 관계일때의 성능 최적화에 대해 고민해보도록 하자.

Order과 Member, Order와 Delivery는 @toOne 관계이다.

상황: Order 2개 일때, Order를 조회하기 위해서 몇번의 쿼리가 나갈까?
(Order과 OrderItem 관련 쿼리는 다음 시간에 다루기로 하겠다.)

  1. 먼저 Order를 조회하기 위한 쿼리 1개 -> 결과: 2건의 Order
  2. Order.getMember.getName()을 호출할때 지연로딩으로 각 Order의 Member를 얻기 위한 쿼리 2개.
  3. Order.getDelivery.getAddress()를 호출할때 지연로딩으로 각 Order의 Delivery를 얻기 위한 쿼리 2개.

즉, 1번의 쿼리를 위해서 1 -> 5(1+2+2)번의 쿼리가 나가는 상황이다.





성능 최적화

N+1문제를 해결하기 위해 fetch join을 활용할 수 있다.
fetch join은 연관된 entity들을 한꺼번에 로드해서 가져오는 것이다.


쿼리는 위와 같다. join fetch 명령어를 통해 함께 가져올 엔티티를 넣어주면, 한꺼번에 로딩한다.


함수를 실행하면, 쿼리가 아래와 같이 한번만 나간다.

이렇듯 @toOne 관계는 fetch = lazy로 설정해 놓고, fetch join을 사용해 쿼리의 수를 줄일 수가 있다.

다음 시간에는 @toMany 관계일 때를 살펴보도록 하자.

profile
Software Engineer

0개의 댓글

관련 채용 정보