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 를 통해 초기화 되있는지 확인할 수있다.
'JPA' 카테고리의 다른 글
[JPA] @Embeddable , @Embedded (0) | 2020.08.06 |
---|---|
[JPA] CASCASDE 옵션 & orphanRemoval (0) | 2020.08.06 |
[JPA] @Inheritance , @DiscriminatorValue, @DiscriminatorColumn 전략 (0) | 2020.08.06 |
[JPA] @MappedSuperClass 란? (0) | 2020.08.06 |
[JPA] @ManyToOne , @OneToMany, @JoinColumn (0) | 2020.08.06 |
댓글