프로젝트를 진행 중 기존의 주문 상태(Order Status)는 Order 테이블이 아닌 OrderHistory 테이블에서 관리하고 있음.
이는 주문 프로세스 흐름에 따라 실시간으로 바뀌는 주문 상태값을 OrderHistory에서 점이력 형식으로(주문 프로세스 추적 및 최신값을 가져오는 목적) 관리하기 위함인데 N+1 이슈가 발생한다는 문제점이 있음.
특정 요청이 1 개의 쿼리로 처리되길 기대했는데 N 개의 추가 쿼리가 발생하는 현상
선수 지식으로 영속성 컨텍스트, 프록시, ORM에 대해서 알고 있으면 좋다고 한다.
팀 : 멤버 = 1 : N의 관계(OneToMany)에서 팀 리스트를 조회하고 그 팀에 할당된 멤버들을 조회하려면 어쨋거나 팀 개수만큼 멤버를 조회해야 하므로 1(처음 팀 리스트 조회) + N(팀의 개수만큼 멤버 조회)가 된다.
먼저 팀 리스트를 조회한다. ⇒ N개의 팀을 1번의 쿼리로 가져옴
팀 리스트 당 각 멤버에 대해 Proxy 객체로 연관 객체를 가지고 있는다.
멤버를 조회할 시 1차 캐시(영속성 컨텍스트)에서 존재하는지 확인
없으므로 (select * from 멤버 where 팀 = ~ * N개)
⇒ Fetch Join, EntityGraph 으로 해결 가능
select 팀.*, 멤버.* from 팀 left join fetch 멤버멤버 : 팀= N : 1의 관계(ManyToOne)에서 팀 리스트를 조회하고 그 팀에 할당된 멤버들을 조회하려면 어쨋거나 팀 개수만큼 멤버를 조회해야 하므로 1(처음 팀 리스트 조회) + N(팀의 개수만큼 멤버 조회)가 된다.
ManyToOne의 상황에서도 비슷한 경우가 나올 수 있다.
Fetch Join, EntityGraph로 해결을 많이 한다고 한다.