스프링/ORM JPA

지연로딩과 즉시로딩

born-A 2023. 9. 17. 00:02



멤버를 조회할 때는 멤버만 가져오고 팀은 프록시로 가져왔다.

이제 m.getTeam().getName() 으로 팀에 있는 뭔가에 접근을 할 때, 쿼리가 나감!

team 프록시 객체가 초기화 되면서 db에서 이 값을 가져와서 채운다.

 

eager로 변경을 하게 되면 팀을 조인해서 select 쿼리가 나간다.

 

실무에서는 즉시로딩 쓰면 안된다.

 

jpql의 경우 member를 select한 후 member를 가져왔더니, team이 즉시로딩으로 되어있네?

즉시로딩인 경우 값이 다 들어가 있어야 한다.

-> member 쿼리가 나가고, member의 개수가 10개라면  10개만큼 eager로 가져오기 위해서 쿼리가 별도로 나간다

 

예를 들면

select * from Member;

select * from Team where TEAM_ID = xxx;

 

N+1: 최초 쿼리가 1, 추가 쿼리가 N개 

 

fetchJoin : 동적으로 내가 원하는 애들을 선택하여 가져오는 것.

member랑 Team을 가져와야돼. 그때는 fetchjoin을 쓰게되고 , 이럴때는 한방쿼리로 조인을 해서 값을 가져온다.

 

lazy로 했지만 Member랑 Team을 다 가져오는것을 볼 수 있다.

fetchJoin을 했기 때문에 데이터가 채워져서 나온다