본문 바로가기
개발 이론/Spring

프록시??? 스프링 AOP?? 트랜젝션?? (5)

by dal_been 2024. 4. 15.
728x90

이 제목의 챕터를 사실 마무리?라고 해야하나..? 어째든 정리하고자했는데 갑자기 지연로딩도 프록시랑 관련있다는게 생각나서

어떻게 관련이 있는지 한번 공부할겸 정리해본다

 


지연로딩

 

JPA를 써봤다면 지연로딩이라는 단어를 한번쯤은 들어봤을 거다. 간단하게 설명하자면 엔티티 A와 연관된 엔티티 B의 정보를 한번에 가져오지 않는 것이다.

 

class Member {

    @ManyToOne(fetch = FetchType.LAZY) // 지연로딩
    @JoinColumn
    private Team team;

}

 

위의 코드에서 Member를 조회했을때 지연로딩으로 설정되어있다면 해당 값은 같이 조회되지않는다.

좀더 제대로 말하자면 프록시로 감싸진다? 의 느낌이다.

 

근데 만약 해당 값이 필요하다면?? 

 

member.getTeam().getName()

 

과 같이 값이 필요할때 조회하면 그때 쿼리로그도 나가면서 조회가 된다.

(다만 조회할때 해당 엔티티가 영속성컨텍스트안에 있어야한다. 그안에 없다면 LazyInitializationException이 발생한다)

 

근데 지연로딩이라는게 왜 존재해? 그냥 같이 조회하면 안되나?

 

그 이유는 필요 없는 데이터까지 가져올는 것을 방지하기 위해서다.

 

예를 들어 위 Member 엔티티에서 Team엔티티에 대한 값이 필요없는데 매번 데이터를 join해서 가져오면 단순힌 Member만 조회하는 쿼리보다 속도가 느리다.

 

뿐만 아니라 Team쪽에서 Member를 조회한다고하면 Team에는 여러 Member들이 존재하기 때문에 여러 데이터 값을 조회하게 된다.

즉 Team안에 Membe가 100명이면 100개의 쿼리가 생성될 수 도 있다

 

 

그래서 지연로딩이 필요한거다

 

좀더 데이터를 효율적으로 조회하기위해... 원하는 데이터값만 조회하기 위해

 

 


처음 개인프로젝트할때 지연로딩, 즉시로딩같은거 고려안해서... 리팩토링할때 로그쿼리가 대박이었다... 

걍 모든 데이터 조회되는 쿼리들이....

 

까먹지 않기 위해 간단하게 적어봤다. 나중에 JPA프로젝트 하게 되면 지연로딩이라든지 즉시로딩같은것도 함께 고민하면서 프로잭트 해봐야징