본문 바로가기
JPA

[JPA] 프록시 (Proxy) 객체 & fetch = EAGER & LAZY

by onejunu 2020. 8. 6.

 

class Order{

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user; 
    
    ....
}

 

여기서 @ManyToOne은 알겠는데 fetch 에서 LAZY는 무엇인가?? EAGER 는 무엇인가?? 왜 이런 설정이 있는가??

 

 


보통 프록시라고 하면 프록시서버에 관한 내용이 많이 나온다. 

 

단어만 가지고 생각하면 프록시는 "가짜" 와 관련된 느낌의 단어다.

 

그렇다. 프록시 객체는 가짜객체다. 

 

프록시 객체는 실제 클래스의 객체를 상속 받은 객체이다.

 

그리고 실제 객체에 대한 Target 즉 참조를 가지고 있다.

 

초기의 프록시 객체는 이러한 참조만 가지고 있고 실제 내용은 텅텅비어있다.

 

이런 프록시 객체는 왜 만드는 것인가?

 


 

만약에 위의 예제에서 Order 객체를 영속성 컨텍스트에 올리려고 한다. 그런데 문제점이 있다.

 

Order와 다대일 연관관계에 있는 User 객체는 어떻게 해야하는가??  연관된 유저를 바로 가져와야하는 것인가? 아니면 나중에 사용할 때 가져올것인가?? 이를 선택하는 것이 바로

 

전자는 EAGER

 

후자는 LAZY 

 

 

그러면 나중에 가져올려면 어떻게 가져와야되는지 의문이 생긴다. 이때 User 객체를 상속받고 모든 내용이 텅텅 비어있고 실제 객체를 참조할 수 있는 타겟을 가진 프록시객체를 사용하는 것이다

 

그래서 LAZY는 연관된 객체를 프록시 객체로 참조하고 있다가 실제로 사용할때 영속성컨텍스트에 없으면 데이터베이스에서 실제 객체로 가져오는 것이다.

 

프록시 객체의 초기화 여부를 알수있는 함수는 PersistencUnitUtil.isLoaded 를 통해 초기화 되있는지 확인할 수있다.

 

 

 

 

댓글