프록시

em.find() : 데이터 베이스를 통해 실제 엔티티 객체 조회

em.getReference() : 데이터베이스 조회를 미루는 프록시(가짜) 엔티티 객체 조회

 

프록시 객체는 실제 엔티티 클래스를 상속 받아서 생성되며 실제 엔티티의 참조를 보관하고 있다가 프록시 객체가 호출이 되면 그때 영속성 컨텍스트에 초기화 요청을 해서 실제 엔티티를 생성하고 참조를 통해 실제 엔티티를 호출한다.

 

이때 프록시 객체가 실제 엔티티로 바뀌는 것이 아니라 프록시 객체를 통해 실제 엔티티에 접근하는 것이고 영속성 컨텍스트에 조회 요청 시 실제 엔티티가 이미 있으면 em.geReference() 호출해도 실제 엔티티가 반환된다.

 


 

연관관계 매핑 (fetch)

 

즉시 로딩 (fetch = FetchType.EAGER)

 

즉시 로딩 사용 시, 예상치 못한 SQL이 발생할 수 있고 N+1 문제를 일으킨다. 객체 하나를 조회하기 위한 쿼리를 날렸는데 연관된 객체들을 전부 조회하는 것이다. @ManyToOne, @OneToOne은 기본이 EAGER로 되어있다.

 

 

지연 로딩 (fetch = FetchType.LAZY)

 

참조 객체를 프록시 객체로 가져오고 사용 시점에 실제 객체를 조회하게 된다. 대부분 지연 로딩을 사용하는 것이 좋으며 @OneToMany, @ManyToMany는 기본이 LAZY로 되어있다.

 


 

영속성 전이 (CASCADE)

 

영속성 전이를 사용하면 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 저장하는데 엔티티를 함께 영속화하는 편리함을 제공할 뿐, 연관관계 매핑과는 관련이 없다.

CascadeType.(ALL, PERSIST, REMOVE, MERGE, REFRESH, DETACH)에 따라 범위를 지정할 수 있다.

 

 

고아 객체 (orphanRemoval)

 

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 옵션으로, 참조가 제거된 엔티티를 고아 객체로 보고 삭제하며 CascadeType.REMOVE처럼 동작한다.

참조하는 곳이 하나일 때 사용해야하며, 특정 엔티티가 개인 소유할 때 주로 사용한다. (@OneToOne, @OneToMany만 가능)

 

(CascadeType.ALL + orphanRemoval=true 로 설정 시, 부모 엔티티가 자식 엔티티의 생명 주기를 관리할 수 있다.)

 

 

[참고] 인프런 김영한님 강의를 공부한 내용입니다.

+ Recent posts