그알것 — 그럼에도 알아야 할 것들
홈질문커뮤니티
로그인
그알것 — 그럼에도 알아야 할 것들

Service

  • 홈
  • 소개
  • 질문
  • 커뮤니티

My

  • 내 워크스페이스
  • 저장한 질문
  • 작성한 답변

Policy

  • 이용약관
  • 개인정보처리방침
  • 문의

© 2026 그알것 · What Still Matters

질문 목록JPA
JPA

JPA의 N + 1 문제에 대해서 설명해주세요

실무4/5
설계4/5
인간3/5
기초3/5

면접관의 질문 의도

"N+1"이라는 단어를 외운 사람인지, fetch 전략의 트레이드오프(페이징 충돌·중복 결과)까지 잡는 사람인지를 가른다.

큐레이션 답변

학습 자료

JPA N+1은 목록 조회 1번 뒤, 연관 엔티티를 항목별로 추가 조회하면서 select가 1+N로 폭증하는 현상이다. fetchType.EAGER로 바꾼다고 끝나지 않고, JPQL 결과 N건 각각에 대해 즉시 로딩 select가 따로 나갈 수 있다(여전히 N+1). fetch join이나 @EntityGraph로 _하나의 SQL_로 가져오게 만드는 것이 정공법이지만, 일대다 fetch join은 페이징과 결과 수 중복 문제가 따라온다. 그래서 케이스별로 fetch join, @EntityGraph, batch_size, 별도 조회 후 메모리 매핑 같은 전략을 골라 써야 한다.

좋은 답변 구조

  1. 01현재 병목이 "select 횟수"라는 진단과 목표 지표(SQL 수·응답 시간)부터 정한다
  2. 02show_sql/p6spy 같은 측정 방식과 1+N 발생 패턴을 설명한다
  3. 03fetch join·@EntityGraph·batch_size·별도 조회 같은 해결 전략을 우선순위로 제시한다
  4. 04일대다 fetch join의 페이징 충돌·중복 결과 같은 트레이드오프로 마무리한다

자주 실수하는 포인트

fetchType.EAGER로 바꾸면 N+1이 사라진다고 단정한다
일대다 fetch join 후 페이징을 그대로 쓰다 데이터 중복/메모리 페이징 문제를 만난다
운영 SQL 로그를 안 보고 "DB가 느린 것 같다"고만 진단한다
ToOne 즉시 로딩과 ToMany 지연 로딩을 같은 패턴으로 다룬다

실무 맥락

  • 목록 API가 트래픽 증가와 함께 점점 느려지는데 단건 조회는 멀쩡한 상황
  • 관리자 페이지에서 페이징 + 연관 데이터 표시 때문에 SQL이 수십~수백 건 나가는 경우
  • 운영에서 DB 슬로우 쿼리는 없는데 _요청 처리량_이 안 올라가는 상황

본인 경험에 녹이는 힌트

p6spy/show_sql로 N+1을 찾아 fetch join으로 잡아본 경험이 있다면 측정→처치 흐름이 그대로 답변 후크가 된다

일대다 fetch join 페이징 문제를 @EntityGraph + batch_size 조합으로 풀어본 경험이 있다면 트레이드오프 이야기로 깊이가 생긴다

Repository 컨벤션에 "목록 조회는 fetch 전략을 명시한다" 같은 규칙을 둔 경험이 있다면 팀 운영 시각으로 연결할 수 있다

커뮤니티 인기 답변

전체 0개

아직 공개된 답변이 없어요. 첫 공개 답변을 남겨보세요.

관련 꼬리 질문

Q1즉시 로딩을 켜도 N+1이 발생할 수 있는 이유는 무엇인가요
Q2fetch join과 EntityGraph는 어떤 기준으로 선택하나요
Q3N+1을 운영 환경에서 어떻게 탐지하나요
아직 답을 쓰지 않았어요.
큐레이션 답변과 다른 사람 답변을 보고, 자기 언어로 답을 정리해보면 학습 효과가 가장 큽니다.
목차
  • 01면접관의 질문 의도
  • 02큐레이션 답변
  • 03좋은 답변 구조
  • 04자주 실수하는 포인트
  • 05실무 맥락
  • 06본인 경험에 녹이는 힌트
  • 07커뮤니티 인기 답변준비중
  • 08관련 꼬리 질문