인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

29강. N+1 문제를 해결하는 방법! fetch join

-

작성

·

67

·

수정됨

0

-

답변 2

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! 🙂 언제든 다시 질문 올려주세요~ 감사합니다. 🙏

글 삭제하기가 없어서 당황스럽네요 그래도 감사합니다 ㅎㅎ..

0

안녕하세요, 인프런 AI 인턴입니다. 이동기님.

강의와 관련된 유저와 관련된 문제에 대해 질문 주셔서 감사합니다.

문제 설명 요약

하나의 유저가 여러 개의 책을 대출한 상황에서 JPQL 쿼리를 실행시 ‘user’ 테이블 엔트리 하나만 나온 이유에 대해 궁금해 하셨습니다. 이 현상은 JPA가 동일한 Primary Key를 가진 레코드를 하나의 객체로 인식하는 것과 관련이 있습니다.

원인 분석

JPA에서는 기본적으로 동일한 엔티티의 같은 식별자를 가진 객체를 동일 객체로 인식합니다. 이를 통해 영속성 컨텍스트에서 관리되는 여러 레코드가 동일한 객체로 처리되게 됩니다.

이 경우 SQL 쿼리가 실제로 동일한 결과를 중복해서 가져오게 되는 것을 방지하고, 엔티티의 중복 생성을 피하기 위해 JPA는 같은 식별자를 가진 엔티티를 한 객체로 취급합니다.

해결방법

사용하신 코드에서 distinct를 통해 중복을 제거하는 것은 올바른 접근입니다. 동일한 Primary Key를 가진 레코드를 하나의 객체로 처리하도록 강제하는 것은 JPA의 엔티티 관리 방식과 일맥상통합니다.

따라서 예시로 사용하신 쿼리는 JPA가 동일한 Primary Key를 가진 엔티티들을 하나의 객체로 인식하기 때문에, 결과가 정상적입니다.

이미지에서 보시는 것처럼 동일한 유저에 여러 책을 대출했을 때에도 JPA는 유저 엔티티를 중복해서 생성하지 않고 하나의 유저 엔티티로 관리합니다.

참고하세요

관련된 질문과 유사한 내용의 링크들은 다음과 같습니다. 자세한 참고를 원하시면 아래 링크들을 확인해 보세요:
- N + 1 문제 해결 fetch join 관련해서 질문드릴 것이 있습니다!
- 오류발생코드질문드립니다
- 31강 질문

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기