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 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다.
쿼리문이 짧아지고 간결해졌다.
'trouble shooting > spring' 카테고리의 다른 글
실전 프로젝트 service 로직 개선 사항 (0) | 2022.12.02 |
---|---|
@Transactional(readOnly = true) (1) | 2022.12.02 |
JPA Diarect(방언) 지정 (0) | 2022.11.30 |
Unsupported Media Type, status 415 (0) | 2022.11.14 |
java.lang.StackOverflowError: null (0) | 2022.11.12 |
댓글