강의

멘토링

로드맵

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

박지원님의 프로필 이미지
박지원

작성한 질문수

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

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

fetch join DISTINCT 중복제거

작성

·

18

1

fetch join 부분이 조금 어렵게 느껴져서, gpt에게 물어보며 공부했습니다.

강의에서 fetch join으로 나온 중복 데이터를 DISTINCT 키워드를 이용해서 제거해주시는 부분을 보았는데, gpt가 다음과 같이 설명해주는 것을 보았습니다.

DISTINCT 키워드가 SQL과 JPA 양쪽에서 다르게 동작하기 때문에 완전한 중복 제거가 보장되진 않습니다.

이 말이 맞다면 현업에서는 이런 문제를 어떤 식으로 해결하는지 궁금합니다!

답변 2

0

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

안녕하세요! 지원님 좋은 질문 감사드립니다.

양쪽에서 다르게 동작한다는 것은 다음과 같은 의미일 것 같아요~

  • SQL distinct 의 경우 동일한 column 조합으로만 Database가 데이터를 걸러낸다는 뜻이고

  • JPA에서 사용한 JPQL distinct는 join을 통해 나온 엔티티를 부모 엔티티 기준으로 서버가 (즉, 애플리케이션이) 묶어 낸다는 뜻이죠!

또한 두 방식 모두 제가 아는 선에서는 "완전한 중복 제거"를 보장합니다. 그래서 GPT가 어떤 맥락에서 완전한 중복 제거가 보장되지 않는다고 한지는 정확히 모르겠네요~ 🤔

 

관련해서 한 가지 주의하면 좋은 부분은 데이터 양이 꽤 많아지면 (가령 수백만 건의 부모의 1:N 구조를 한 번에 fetch join + distinct 하게 되면...) 수백만개의 컬렉션을 연산해야 하기에 속도가 느려질 수 있다는 문제가 있고, 이를 해결하는 접근은 다양하게 있어 상황에 따라 적당한 방법을 선택해야 합니다. 가장 대표적으로는 조회되는 패턴을 확인해 미리 집계해 두는 방식도 있어요~

 

답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇

 

0

안녕하세요, 인프런 AI 인턴입니다. 박지원님께서 질문해 주신 fetch join과 DISTINCT 키워드에 관한 내용을 잘 이해하였으며, 관련된 정보를 제공할 수 있는 링크를 찾아보았습니다.

fetch join 사용 시, JPA에서 DISTINCT 키워드는 컬렉션 fetch의 영향으로 인해 중복 제거가 완벽히 되지 않을 수 있습니다. 이러한 이유로 현업에서는 몇 가지 해결 방법이 사용됩니다:

  1. JPQL로 중복 제거: JPQL에서 DISTINCT 키워드를 사용해 일단 제거를 시도하되, 원하는 결과가 나오지 않는 경우 Set 컬렉션을 사용하여 애플리케이션 레벨에서 추가적인 중복 제거를 할 수 있습니다.

  2. 객체 매핑 후 제거: 특정 조건에 따라 중복 컬렉션을 처리해야 할 경우 DTO로 변환하면서 중복을 제거할 수 있습니다. JPA 결과를 DTO에 매핑할 때 수기 코딩을 통해 중복을 제거하는 방식입니다.

  3. Custom Query 작성: 복잡한 쿼리의 경우, 네이티브 SQL이나 커스텀 쿼리를 작성하여 필요한 결과를 명확히 추출하는 방법을 사용할 수 있습니다.

관련된 유사한 질문과 해결책에 대한 설명을 참고하시면 이해에 도움이 되실 것입니다.

이 외에도 여러 가지 접근 방식이 있으며 다양한 상황에 맞는 최적의 방법을 적용하시는 것이 중요합니다. 필요에 따라 다양한 방식으로 접근해보시면 도움이 될 것입니다.

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

박지원님의 프로필 이미지
박지원

작성한 질문수

질문하기