★ 실무에서 어마어마어마 중요하다고 함. 이거를 모르면 실무를 못한다고..

 

SQL 조인 종류 X

JPQL에서 성능 최적화를 위해 제공하는 전용 기능

연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능

  >> 쿼리 2번 나갈것을 한 방 쿼리로 끝내는 어마어마한 기술

  >> 실무에서 엄청 많이 사용

JOIN FETCH 명령어 사용

페치조인 ::= [LEFT[OUTER] | INNER] JOIN FETCH 조인경로

 

엔티티 페치 조인

[JPQL]

select m from Member m join fetch m.team

>>[해석] Member를 조회 할껀데, (fetch:한번에 가져온다) join해서 한번에 가지고 오라

그러면서 team을 가지고 와

 

[SQL]

SELECT M.*,T.* FROM MEMBER M

INNER JOIN TEAM T ON M.TEAM_ID=T.ID

 

컬렉션 페치 조인

  일대다 관계

[JPQL]

select t

from Team t join fetch t.members

where t.name = '팀A'

 

[SQL]

SELECT T.*,M.*

FROM TEAM T

INNER JOIN MEMBER M ON T.ID=M.TEAM_ID

WHERE T.NAME ='팀A'

 

JPQL의 DISTINCT 2가지 기능

1. SQL에 DISTINCT를 추가

2. 애플리케이션에서 엔티티 중복 제거

 

 일대다 일 경우에는, 데이터가 뻥튀기가 되기 때문에 조심해야합니다.

 

페치 조인과 일반 조인의 차이

>> 일반 조인 실행시 연관된 엔티티를 함께 조회하지 않음

 

특징과 한계

 

페치 조인 대상에는 별칭을 줄 수 없다

 - 하이버네이트 가능, 가급적 사용X

>> 페치조인은 기본적으로 나랑 연관된 모든것을 다 끌거 오는거이기에,

특정 대상만 주면 오류가 발생할 수 있음

 

둘 이상의 컬렉션은 페치 조인 할수 없다.

 일대다도 데이터가 뻥튀기가 되는데, 이거는 곱하기 * 곱하기 이기에

데이터 정합성의 문제가 발생될 수 있으니 쓰지말자

 

컬렉션을 페치 조인하면 페이징 API(setFirstResult,setMaxResults)를 사용할 수 없다.

 - 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능

 - 하이버네이트 경고 로그를 남기고 메모리에서 페징(매우 위험)

 

<실무 팁 >> 실무에서는 글로벌 세팅을 사용한다.

persistance.xml에 추가

"hibernate.default_batch_fetch_size" value ="100"

 

>>> batch_fetch_size 를 사용하면 쿼리를 N + 1이 아니라 테이블 수 만큼 

맞출수 있다.

 

1.연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화

2. 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선함

     @OneToMany(fetch = FetchType.LAZY) //글로벌 로딩 전략

3.실무에서 글로벌 로딩 전략은 모두 지연 로딩

4.최적화가 필요한 곳은 페치 조인 적용

 

>>> JPA 70~80% 문제는 N +1 문제인데, 거의 페치 조인으로 해결할 수 있다.

 

너무 중요하기에 페치 조인은 100% 꼭 이해하자. 운영 할 때 성능상 큰 이점.

 

[출처- 인프런 김영한  '자바 ORM 표준 JPA 프로그래밍- 기본편]  강의듣고 정리

 

 

'Java Web > JPA' 카테고리의 다른 글

JPQL 문법(4)  (0) 2022.05.03
JPQL문법(3)  (0) 2022.05.01
JPQL문법(2)  (0) 2022.04.27
JPQL문법  (0) 2022.04.24

+ Recent posts