DevBoi

[JPA] 지연로딩과 즉시로딩 본문

Develop/[JPA]

[JPA] 지연로딩과 즉시로딩

HiSmith 2022. 3. 7. 17:07
반응형

두 객체에 대한 로딩을 할때,

 

해당 처럼 Lazy 조인으로 하게되면, 해당 컬럼을 지연 로딩을 할수 있다.

그렇게 되면, 해당 find할때 팀을 가져오는 것이아니라, 실제로 팀을 사용할때 가져오는 쿼리를 발송한다.

이는 프록시를 활용한 것이다.

처음에 멤버를 가져올때 팀은 프록시 객체만 가져오고, 실제로 팀을 사용할때, 해당 팀에 대해서 영속성 컨텍스트에게 

프록시 객체가 초기화 요청을 하여 쿼리가 나가는 것이다.

 

지연 로딩의 반대는 FetchType.eager이면서 즉시로딩이라고한다.

해당 방법으로 엔티티를 가져오면, 프록시 객체가 아닌, 관련된 엔티티들을 조인으로 전부를 진짜 객체로 가져온다.

 

가급적 실무에서는 지연 로딩을 사용해야한다

왜냐면 즉시로딩은 한번의 엔티티에 다른 엔티티들에 대한 조회를 같이 하기때문에

N+1문제를 발생시킨다. 또한 예상치 못한 SQL를 발사할수있게 된다.

만약에 Member에  대한 목록을 가져오는 걸 즉시로딩으로 요청했다고 가정해보자

그렇게 되면 즉시로딩은 가져올때, 모든 객체의 값이 들어가있어야 하기 때문에,

Member를 가져오고, Member에 포함된 Team 만큼 또 별도로 쿼리가 나간다.(프록시가 아닌 진짜 객체로 값을 채우기 위해)

 

 

N+1 문제란?? 

최초쿼리가 1개나가는데, 추가 쿼리가 N개가 발생하는 걸 의미한다. 

해결 방법 

1. 모든 패치타입을 지연 로딩으로 바꾼다.

2. JPQL 에서 패치조인을 한다.

3. 어노테이션??으로 조인

4. 배치 사이즈 설정으로 해결

5.엔티티 그래프?

 

 

해결 방법에 대해서 자세히는, 다음 포스팅을 통해 한번,...해야겠다

 

추가로, 별도로 패치타입을 지정하지 않아도 되는 기본 설정 값이다.

 

반응형

'Develop > [JPA]' 카테고리의 다른 글

[JPA] 값 타입  (0) 2022.03.10
[JPA] 영속성 전이  (0) 2022.03.07
[JPA] 프록시객체에 대한 이해  (0) 2022.02.17
[JPA] 매핑 정보 상속 관련 공부  (0) 2022.01.18
[고급 매핑] 상속관계 매핑  (0) 2022.01.18