패치 조인을 이렇게 이해해도 될까요?
792
작성한 질문수 65
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
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
3
안녕하세요. Like me black님
순서대로 답변 드릴께요 :)
1. 네 맞습니다. 추가로 패치조인은 지연로딩, 즉시로딩과 무관하게 최적화에 활용할 수 있습니다.
2. 네 맞습니다.
3,4,5: 패치 조인의 목적은 특정 엔티티를 기준으로 연관된 엔티티를 함께 조회하기 위함입니다. 따라서 패치 조인의 대상이 되는 엔티티만 단독으로 조회할 수 없습니다. 이런 경우라면 패치 조인을 사용하면 안되고 대신에 일반 조인을 사용하셔야 합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
패치 조인에 대한 이해를 먼저 정리해보겠습니다. 패치 조인은 지연 로딩으로 인한 N+1 문제를 해결하기 위한 기법 중 하나입니다. N+1 문제는 한 번의 쿼리로 가져올 수 있는 데이터를 지연 로딩으로 인해 추가적인 쿼리로 가져오는 문제를 말합니다.
패치 조인은 한 번의 쿼리로 모든 데이터를 한 번에 가져오는 방법입니다. 예를 들어, 게시물과 댓글의 관계에서 게시물에 대한 패치 조인을 사용하면 게시물과 댓글 데이터를 한 번에 가져오는 것입니다. 이렇게 하면 추가적인 쿼리 없이 원하는 데이터를 한 번에 가져올 수 있게 됩니다.
하지만 패치 조인은 모든 상황에 항상 좋은 해결책은 아닙니다. 데이터베이스의 성능이나 관련된 조인의 개수에 따라 오히려 성능 문제를 야기할 수도 있습니다. 따라서 실무에서는 적합한 상황에 패치 조인을 사용하는 것이 중요합니다.
신중하게 패치 조인을 적용해야 하며, 개별 상황에 맞게 최적화를 고려해야 합니다. 필요한 경우 인덱스를 추가하거나 다른 방법을 검토하여 성능을 향상시킬 수 있습니다.
결론적으로, 패치 조인은 지연 로딩으로 인한 N+1 문제를 해결할 수 있는 방법 중 하나이지만, 항상 최적의 해결책은 아닙니다. 실무에서는 상황에 맞게 패치 조인을 적용하고, 성능을 고려하여 개발해야 합니다.
더 궁금한 점이 있다면 언제든지 질문해주세요. 좋은 학습 되세요!
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
15
2
inheritance startegy 선택시 고려사항
0
21
1
Entity 동등성 비교
0
18
1
실무 조언 관련 질문입니다.
0
44
1
H2데이터베이스 파일 생성
0
55
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
52
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
51
1
JPQL 메소드와 락
0
55
1
Delivery @OneToOne
0
60
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
92
2
UnsupportedOperationException 발생
0
85
3
H2 Database 연결이 안됩니다.
0
92
2
연관관계 매핑 질문드립니다.
0
84
2
h2데이터베이스 실행오류
0
107
2
persistence.xml
0
106
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
80
1
영속성 컨텍스트
0
64
1
JPA 프록시
0
94
1
Native Query와 MyBatis
0
67
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
85
1
임베디드 타입 예시 코드 관련 질문
0
114
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
94
3
인텔리제이 패키지 커서 단축키 질문
0
108
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
142
1





