일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스프링부트
- JPA
- JPA공부
- Axon framework
- 스프링부트공부
- 자료구조공부
- nestjs스터디
- JPA스터디
- querydsl
- DDD
- 알고리즘공부
- nestjs
- 코테준비
- 플러터 개발
- 플러터 공부
- 스프링공부
- 기술공부
- 스프링
- 스프링 공부
- 코테공부
- 기술면접공부
- 자바공부
- K8S
- 카프카
- JPA예제
- nestjs공부
- Kafka
- Flutter
- 프로그래머스
- JPA 공부
- Today
- Total
DevBoi
[JPA] 패치조인이란 본문
패치조인은 JPQL에서 성능 최적화를 위해서 제공하는 기술이다.
연관된 엔티티나 객체를 한번에 조회해 오는 기능이다.
N+1 문제가 발생하는 경우, 발생가능성이 있는 경우, 연관관계를 맺고 있는 다른 엔티티까지 한꺼번에 조인을 사용해서
실제 엔티티의 값을 가져온다. 단 한번의 쿼리로 값을 다 가져오기 떄문에, N+1 문제 발생 가능성을 차단할 수 있다.
<일반 조인과 패치조인의 차이>
일반 조인 : 조인을 대상으로 한 테이블의 값을 가지고 조회하는 대상의 테이블의 값을 가져올때 사용하는 것이 다이다.
즉, 대상 엔티티의 값을 가져오는 기준으로만 사용하고, 별도 조인 대상의 엔티티의 값을 가져오지는 않는다
패치 조인 : 조인 대상 엔티티의 값을 함께 가져온다.
<Distinct 의 차이>
sql에서의 distinct는, 중복을 제거한다.
즉 특정 컬럼에 대한 중복을 제거하는 용도로 사용하지만, jpql의 distinct는 sql의 distinct용도는 물론이고,
애플리케이션상의 중복을 한번 더 제거한다. 예를 들면, 특정 중복되는 값을 지우고 반환된 결과들 중에 중복이 있다면,
한번더 제거를 한다.
특징 및 한계
1. 2개의 컬렉션 이상부터는 패치조인을 사용할 수 없다.
2. 글로벌 패치전략보다 우선순위를 가진다.
따라서 글로벌 패치전략은 지연로딩으로 설정하고 필요할떄, 성능 최적화를 위해서 패치조인을 쓰는 것이 좋다
3. 패치조인 대상에는 별칭을 줄수 없다.
4. 컬렉션 대상을 패치조인하면, 페이징 api를 사용할 수 없다.
하이버네이트에서 다대일,일대일 인 경우에는 패치조인을 사용하고 페이징 api를 사용할 수 있다.
하지만, 해당 사용하는 경우에는 메모리에서 페이징처리가 되기 떄문에, 데이터가 많은 경우에는 OOM이나, 성능이슈가 발생한다.
패치 조인 사용 시에, 페이징을 사용하려면, 카운트쿼리 생성이나 별도 방법이 있지만, 해당은 다른 포스트로 정리를 해보자
'Develop > [JPA]' 카테고리의 다른 글
[JPA] ID를 Long으로 하는 이유 (0) | 2022.03.20 |
---|---|
[JPA] save, saveall의 성능차이 (0) | 2022.03.20 |
[JPA] N+1 문제란 (0) | 2022.03.18 |
[JPA] JPA 동작과정 (조회,저장, 수정) (0) | 2022.03.17 |
[JPA] 영속성 컨텍스트란? (0) | 2022.03.17 |