인프런 커뮤니티 질문&답변
N+1문제
작성
·
74
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.
N+1 문제는 JPA를 사용하는 개발자가 자주 직면하는 이슈 중 하나입니다. 이를 이해하는 데 도움이 될 내용을 설명하겠습니다.
N+1 문제와 즉시 로딩
N+1 문제란:
- N+1 문제는 특정 엔티티를 조회할 때, 그와 연관된 하위 엔티티를 개별적으로 조회하게 되어 불필요한 추가 쿼리가 발생하는 문제입니다. 예를 들어,
Team과 관련된Member를 즉시 로딩(EAGER) 설정을 통해 가져올 경우, 초기에는Team을 조회하기 위한 쿼리가 나가고(N), 그와 관련된 각각의Member들을 조회하기 위해 N번의 쿼리가 추가로 발생하게 됩니다.
- N+1 문제는 특정 엔티티를 조회할 때, 그와 연관된 하위 엔티티를 개별적으로 조회하게 되어 불필요한 추가 쿼리가 발생하는 문제입니다. 예를 들어,
즉시 로딩 (EAGER Loading):
- 즉시 로딩을 사용하면 특정 연관 엔티티를 함께 조회하는 방식으로, 주로 FetchType.EAGER로 설정됩니다. 이런 경우, 연관된 엔티티가 많을수록 쿼리 수가 증가하여 N+1 문제가 발생할 수 있습니다. 특히, JPQL을 사용할 때 더 자주 문제가 발생합니다. 이는 JPQL이 기본적으로 FetchType을 무시하고 쿼리를 생성하기 때문입니다.
- 즉시 로딩을 사용하면 특정 연관 엔티티를 함께 조회하는 방식으로, 주로 FetchType.EAGER로 설정됩니다. 이런 경우, 연관된 엔티티가 많을수록 쿼리 수가 증가하여 N+1 문제가 발생할 수 있습니다. 특히, JPQL을 사용할 때 더 자주 문제가 발생합니다. 이는 JPQL이 기본적으로 FetchType을 무시하고 쿼리를 생성하기 때문입니다.
지연 로딩 (Lazy Loading)과 N+1 해결 방법:
- 지연 로딩(FetchType.LAZY)을 사용하면 초기에는 상위 엔티티만 조회하고, 실제로 연관된 엔티티에 접근하는 시점에 별도의 쿼리가 나가게 됩니다. 하지만, 이 방법 역시 N+1 쿼리가 나갈 수 있기 때문에, 페치 조인(Petch Join)과 같은 방식으로 최적화해야 합니다.
- 지연 로딩(FetchType.LAZY)을 사용하면 초기에는 상위 엔티티만 조회하고, 실제로 연관된 엔티티에 접근하는 시점에 별도의 쿼리가 나가게 됩니다. 하지만, 이 방법 역시 N+1 쿼리가 나갈 수 있기 때문에, 페치 조인(Petch Join)과 같은 방식으로 최적화해야 합니다.
페치 조인과 그 이점
페치 조인(Fetch Join):
- 페치 조인은 JPQL에서 사용하는 조인 전략 중 하나로, 연관된 엔티티를 함께 한 번의 쿼리로 가져올 수 있도록 돕습니다. 이를 통해 N+1 문제를 효과적으로 해결할 수 있습니다, 왜냐하면 필요한 모든 데이터를 한 번의 쿼리로 얻기 때문입니다.
- 페치 조인은 JPQL에서 사용하는 조인 전략 중 하나로, 연관된 엔티티를 함께 한 번의 쿼리로 가져올 수 있도록 돕습니다. 이를 통해 N+1 문제를 효과적으로 해결할 수 있습니다, 왜냐하면 필요한 모든 데이터를 한 번의 쿼리로 얻기 때문입니다.
JPQL에서의 사용:
- JPQL에서
FETCH JOIN키워드를 사용하면, 지연 로딩 상황에서도 연관된 모든 데이터를 한 번에 가져와 N+1 문제를 피할 수 있습니다.
- JPQL에서
질문에 도움을 드리기 위해 관련된 기존 질문을 몇 가지 찾아보았습니다. 아래 링크들을 확인해 보시면 더 많은 정보를 얻으실 수 있습니다:
이해가 안 되시거나 추가 질문이 있으시면 언제든지 추가 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






안녕하세요. 오리쉐리님
즉시로딩시에
예를 들어서 팀 -> 회원의 관계가 있을 때 팀만 조회하게 되면 N + 1이 발생합니다.
왜냐하면 팀을 select 쿼리하면 팀 10개가 조회할 수 있습니다. 이후 각 팀별로 데이터가 즉시 로딩되어야 하기 때문에 N + 1 문제가 발생합니다.
감사합니다.