프록시란?

Member 엔티티를 조회할 때 Team도 함께 조회해야 할까?

  • 실제로 필요한 비즈니스 로직에 따라 다르다.
  • 비즈니스 로직에서 필요하지 않을 때가 있는데, 항상 Team을 함께 가져와서 사용할 필요는 없다.
  • 낭비가 발생하게 된다.
  • JPA는 이 낭비를 하지 않기 위해, 지연로딩과 프록시라는 개념으로 해결한다. 

 

프록시 특징 

  • 실제 클래스를 상속 받아서 만들어진다
  • 실제 클래스와 겉 모양이 같다.
  • 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 

 

즉시로딩과 지연로딩 

Member를 조회할 때 Team도 함께 조회해야하나? 

 

지연 로딩 

@OneToMany, @ManyToMany는 기본이 지연 로딩 

즉시로딩 

  • 한번에 다 나오기 때문에 프록시가 필요없다. 
  • 진짜가 나오기 때문에 초기화가 필요가 없다. 

 

  • 실무에서는 즉시로딩을 쓰면 안된다.
  • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생 
  • 즉시로딩은 JPQL에서 N+1문제를 일으킨다. 
  • @ManyToOne, @OnetoOne은 기본이 즉시 로딩 -> Lazy로 설정 

 

 

 

영속성 컨텍스트 

영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 

 

애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니절르 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 

 

em.persist(member) 

엔티티 매니절르 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다는 의미. 

 

영속성 컨텍스트의 특징 

  • 엔티티 매니저를 생성할 때 하나 만들어진다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다. 

 

영속성 전이 CASCADE 

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때

예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 

 

영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 

엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐 

 

Casecade의 종류 

All: 모두 적용 

persist: 영속 

remove: 삭제 

 

고아객체 

고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제 

 

OrpahnRemoval = true 

Parent parent1 = em.find(Parent.class, id) 

 

영속성 전이 + 고아 객체, 생명주기 

CasecasdeType.All = orphanRemovel=true 

스스로 생명주기를 관리하는 엔티티는 em.persis()로 영속화, em.remove()로 제거 

두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있음 

도메인 주도 설계(DDD)의 Agfregate Root개념을 구현할 때 유용 

+ Recent posts