DevBoi

[JPA] 패치조인이란 본문

Develop/[JPA]

[JPA] 패치조인이란

HiSmith 2022. 3. 20. 16:24
반응형

패치조인은 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