본문 바로가기
trouble shooting/spring

실전 프로젝트 피드백 N+1 문제

by 일상코더 2022. 11. 29.

1. 문제상황

        - 기술 매니저님 피드백 개선 사항 중에 N+1문제가 발생하는지 체크해보라고 하셨다. 

        - 후기 개수를 count 해주는 쿼리가 질행되는데 company(업체), theme(테마) 전부를 조회하고있는 부분을 확인했다.

 

 

 

2. 문제 원인

 

@OneToMany로 themeList를 불러오는 부분의 fetch type이 EAGER(즉시로딩)이어서 발생한 문제인것을 확인했다.

 

 

3. 문제 해결

 

fetch = LAZY(지연로딩) 로 수정

 

    - 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.  //JPQL select o From order o; -> SQL select * from order n(100) + 1 (order)  == N + 1문제

    - 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.

    - 연관된 엔티티를 함께 DB에서 조회해야하면, fetch join 또는 엔티티 그래프 기능을 사용한다.

    - OneToOne, ManyToOne 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다.

 

쿼리문이 짧아지고 간결해졌다.

댓글