• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

패치 조인을 이렇게 이해해도 될까요?

23.10.02 15:08 작성 23.10.02 15:44 수정 조회수 475

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
여기에 질문 내용을 남겨주세요.

안녕하세요

좋은 강의 만들어주셔서 감사합니다.
강의를 보다가 이해가 어려운 부분이 있어서 질문드리고 싶은데
패치조인을 이렇게 이해해도 될까요?

1번 질문입니다
.
실무에서는 지연로딩으로 기본 세팅을 합니다.

지연로딩은 즉시로딩보다 단점이 적기 때문입니다.

(조인 개수와 성능 문제 관련)
그러나 지연로딩도 최악의 경우 N+1 의 문제가 발생할 수 있습니다.
그 보완책이 패치조인입니다.

2번 질문입니다.
패치조인은 지연로딩이 N+1 의 문제가 될 수 있는 특수한 상황에서만 즉시로딩을 할 수 있게 해줍니다.
즉 연관관계에 있는 엔터티들을 JOIN FETCH로 명시하는 쿼리를 날려주면
즉 하이버네이트가 해당 엔터티들끼리 조인을 날려줍니다.

3번 질문입니다.
아래의 쿼리가 잘못된 이유를 가르쳐주시면 감사하겠습니다.

String query = "select t From Member m join fetch m.team t";

List<Team> result = em.createQuery(query, Team.class).getResultList();

아래의 쿼리가
select t From jpql.Member m join fetch m.team t

SQL에서는 아래의 쿼리와 같다고 생각하는데 에러가 생깁니다.
select team.* from member join team on member.team_id = team.id

4번 질문입니다.
3번 질문과 연관되는 질문입니다.
1번째 쿼리는 되고
select m From jpql.Member m join fetch m.team
2번째 쿼리는 안되는 이유가 궁금합니다.
select t From jpql.Member m join fetch m.team t

1번째 쿼리는 team이 있는 member를 가져오는 것이고
2번째 쿼리는 member가 있는 team을 가져오는 것이기 때문입니다.
그런데 JPA에서는 왜 2번째 쿼리가 오류가 발생하는건지 이해가 어려워 가르쳐주시면 감사하겠습니다.

5번 질문입니다.
아래의 쿼리는 왜 안되는건지 가르쳐주시면 감사하겠습니다.
String query = "select m From Team t join fetch t.members m";
List<Member> result = em.createQuery(query, Member.class).getResultList();

긴 질문을 읽어주셔서 감사합니다.

답변 2

·

답변을 작성해보세요.

2

안녕하세요. Like me black님

순서대로 답변 드릴께요 :)

1. 네 맞습니다. 추가로 패치조인은 지연로딩, 즉시로딩과 무관하게 최적화에 활용할 수 있습니다.

2. 네 맞습니다.

3,4,5: 패치 조인의 목적은 특정 엔티티를 기준으로 연관된 엔티티를 함께 조회하기 위함입니다. 따라서 패치 조인의 대상이 되는 엔티티만 단독으로 조회할 수 없습니다. 이런 경우라면 패치 조인을 사용하면 안되고 대신에 일반 조인을 사용하셔야 합니다.

감사합니다.

선생님께서 직접 답변을 달아주신 것을 너무 늦게 확인했습니다.
상세한 답변을 주셔서 감사합니다

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.04

안녕하세요, 인프런 AI 인턴이에요.

패치 조인에 대한 이해를 먼저 정리해보겠습니다. 패치 조인은 지연 로딩으로 인한 N+1 문제를 해결하기 위한 기법 중 하나입니다. N+1 문제는 한 번의 쿼리로 가져올 수 있는 데이터를 지연 로딩으로 인해 추가적인 쿼리로 가져오는 문제를 말합니다.

패치 조인은 한 번의 쿼리로 모든 데이터를 한 번에 가져오는 방법입니다. 예를 들어, 게시물과 댓글의 관계에서 게시물에 대한 패치 조인을 사용하면 게시물과 댓글 데이터를 한 번에 가져오는 것입니다. 이렇게 하면 추가적인 쿼리 없이 원하는 데이터를 한 번에 가져올 수 있게 됩니다.

하지만 패치 조인은 모든 상황에 항상 좋은 해결책은 아닙니다. 데이터베이스의 성능이나 관련된 조인의 개수에 따라 오히려 성능 문제를 야기할 수도 있습니다. 따라서 실무에서는 적합한 상황에 패치 조인을 사용하는 것이 중요합니다.

신중하게 패치 조인을 적용해야 하며, 개별 상황에 맞게 최적화를 고려해야 합니다. 필요한 경우 인덱스를 추가하거나 다른 방법을 검토하여 성능을 향상시킬 수 있습니다.

결론적으로, 패치 조인은 지연 로딩으로 인한 N+1 문제를 해결할 수 있는 방법 중 하나이지만, 항상 최적의 해결책은 아닙니다. 실무에서는 상황에 맞게 패치 조인을 적용하고, 성능을 고려하여 개발해야 합니다.

더 궁금한 점이 있다면 언제든지 질문해주세요. 좋은 학습 되세요!