스프링 31강. JPA Fetch 전략
JPA 쿼리 기본 전략을 바꾸기 위해서
JPA Fetch 전략을 알아야 한다.
변경 방법에는 Lazy(지연 로딩), Eager(즉시 로딩) 2가지가 있다.
우선 Lazy부터 사용해보자.
user 오브젝트를 사용하기 전까지
user의 정보를 SELECT 해오지 않는다.
메인 페이지를 실행했을 때 SELECT 쿼리가 한 번만 일어난다.
메인 페이지에서는 user 오브젝트가 필요하지 않으니까!
user 오브젝트가 필요한 글 상세보기 페이지로 가보자.
쿼리가 두 번 실행된다.
post의 user 오브젝트가 null이었으니까
필요할 때 이제야 user를 SELECT 하는 것이다.
게으르게(Lazy)!!
user 오브젝트가 null인걸 알아차리고 뒤늦게 SELECT 하는 타이밍은
컨트롤러가 뷰를 호출하기 전 mustache가 자바 코드를 처리할 때
{{post.user.username}}
post의 user 오브젝트가 사용되는 시점에 SELECT 한다.
getUser를 호출 시에 하는 것이다.
이를 LazyLoading이라고 한다.
머스태치 문법 중 변수 이름으로 바로 호출이 가능한데
실제로 변수로 호출하는 것이 아니다.
private로 선언한 변수이기 때문에 바로 변수 참조가 불가능하지 않나!
머스태치가 알아서 getter를 호출해주는 것이다.
이 Lazy 전략은 메인 페이지에서는 user를 가져오지 않고
user 오브젝트를 사용하는 곳에서 가져온다.
엄청 좋다!!
{{post.user.username}} 로 사용하지 않으면 가져오지 않는다!!
이 Lazy 전략은 영속성 컨텍스트에 null을 허용하는 것이다.
Eager 전략은 null을 허용하지 않는다.
성능만 봤을 때는 Lazy가 더 좋지만 Eager을 사용하는 게 더 좋을 때도 있다.
만약 메인 페이지를 거의 사용하지 않고
상세 페이지만 많이 보는 사용자들이 많은 사이트라면
조인을 사용하여 쿼리수를 줄이는 Eager이 더 좋다!
언제 Lazy를 쓰고 Eager을 쓰는지는
웹 사이트의 UX에 따라 달라진다.
정해진 공식이나 정답이 없다.
많이 생각해보고 만들자!
[출처]
https://cafe.naver.com/metacoding
메타코딩 : 네이버 카페
코린이들의 궁금증
cafe.naver.com
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
메타코딩
문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com
www.youtube.com