N+1 problem Fact Check
2025-09-05
두 줄 요약
- N+1 문제가 생긴다 == "나는 도메인을 제대로 모델링하지 못했습니다"
- “N+1은 JPA의 대표적인 성능 문제?” <- ORM의 정상 작동인데? (그저 Leaky Abstraction)
N+1은 “1개의 초기 쿼리(N개 결과) + N개의 추가 쿼리가 실행”를 의미합니다.
Fetch Join, 어노테이션으로 같이 조회, 쿼리 최적화 옵션을 통해 N+1 문제를 해결할 수 있다네요.. (우와 멋지다..)
Fact 1. N+1은 ORM의 정상 동작
- N+1 동작으로 인해 성능 문제가 발생할 순 있지만, N+1은 ORM의 정상 동작이다.
- "성능 문제"라고 부르는 것 자체가 잘못된 프레임.
Fact 2. Lazy Loading의 존재 이유 == 높은 결합도
- Lazy Loading이 "필요하다"는 것은 잘못된 설계. (Aggregate가 너무 큰 것)
- 올바른 Aggregate라면 전체를 Eager Loading해도 부담 없어야한다.
Fact 3. 제대로 된 Aggregate라면 한 번의 쿼리로 충분
- Spring Data는 Aggregate와 상호작용하는 것이 핵심.
- N+1이 발생한다 == Aggregate 경계가 이상한 것.
결론은 N+1으로 인해 성능 문제가 발생하면 Fetch Join의 종류를 외우지 말고 "왜 이 객체들이 함께 조회되야 하지?"를 고민해보기.