프록시와 연관관계 관리

2022. 2. 2. 16:02
반응형

프록시(Proxy)

  • em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회
  • em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회

특징

  • 실제 클래스를 상속 받아서 만들어진다.
  • 실제 클래스와 겉 모양이 동일하다.
  • 사용하는 입장에서 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다.
  • 프록시 객체는 실제 객체의 참조를 보관한다.
  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메서드를 호출한다.

프록시 초기화

  • 프록시 객체는 처음 사용할 때 한 번만 초기화한다.
  • 프록시 객체를 초기화 할때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다. -> 초기화 되면 프록시 객체가 실제 엔티티에 접근이 가능한 것 뿐이다.
  • 프록시 객체는 원본 엔티티를 상속받는다. -> 따라서 타입 체크시 주의해야 한다.
  • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다.
  • 엔티티가 준영속 상태일 때, 프록시를 초기화하면 문제가 발생한다.

즉시로딩과 지연로딩

지연로딩(LAZY)

  • 연관관계를 맺고있는 엔티티가 있을 때 지연로딩으로 설정하면 다른 엔티티를 부를 때 프록시를 초기화 시에 select문이 실행된다.

즉시로딩(EAGER)

  • 지연로딩과 반대의 상황으로 프록시를 초기화하지 않아도 연관관계의 엔티티들을 모두 같이 로딩한다.

프록시와 즉시로딩 주의

  • 가급적 지연로딩만 사용해라!
  • 즉시로딩을 적용하면 예상하지 못한 SQL이 발생할 수 있다.
  • 즉시로딩은 JPQL에서 N+1 문제를 일으킨다.
  • @ManyToOne, @OneToOne은 기본이 즉시로딩이다. -> LAZY로 설정 권고
  • @OneToMany, @ManyToMany는 기본이 지연로딩이다.

영속성 전이: CASCADE

  • 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때
  • 예를들면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하는 예시가 있다.

CASCADE 종류

  • ALL: 모두 적용
  • PERSIST: 영속
  • REMOVE: 삭제
  • MERGE: 병합
  • REFRESH: REFRESH
  • DETACH: DETACH

고아 객체

  • 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티들을 자동으로 삭제
  • orphanRemoval = true
  • 참조하는 곳이 하나일 때 사용해야 한다. -> 여러곳에서 사용한다면 필요한 데이터가 사라지는 문제가 생길 수 있다.
  • 특정 엔티티가 개인 소유할 때 사용해야 한다.
  • @OneToOne, @OneToMany만 사용 가능하다.

 

반응형

'JPA' 카테고리의 다른 글

연관관계 매핑 종류  (0) 2022.05.21
값 타입  (0) 2022.02.02
상속관계 매핑과 @MappedSuperclass  (0) 2022.01.31
연관관계 매핑  (0) 2022.01.25
엔티티 매핑  (0) 2022.01.20

BELATED ARTICLES

more