JPA - 즉시 & 지연 로딩, 영속성 전이와 고아객체

Growing_HJ·2024년 7월 31일

JPA

목록 보기
11/15

📍 1. 즉시 로딩, 지연 로딩 📍

즉시로딩 : 엔터티를 조회할 때 연관된 엔터티도 함께 조회
@ManyToOne (fetch = FetchType.EAGER)

  • 연관된 엔터티를 즉시 조회한다.
    하이버네이트는 가능하면 SQL 조인을 사용해서 한번에 조인한다.
  • 객체 조회시, 연관된 객체를 즉시 로딩하는 방법.

지연 로딩 : 연관된 엔터티를 실제로 사용할 때 조회한다.
@ManyToOne (fetch = FetchType.LAZY)

  • 연관된 엔터티를 프록시로 조회한다.
    프록시를 실제로 사용할 때 초기화하면서 데이터 베이스를 조회한다.
  • 객체 조회시, 연관된 객체를 지연해서 로딩하는 방법.

📍 2. 영속성 전이와 고아 객체 📍

영속성 전이 CASCADE

  • 객체를 저장하거나 삭제할 때, 연관된 객체도 함께 저장하거나 삭제할 수 있는 것.
  • 특정 엔터티를 영속 상태로 만들 때,
    연관된 엔터티도 함께 영속 상태로 만들고 싶은 경우에 사용하는 기능.
  • CASCADE 옵션으로 영속성 전이를 제공한다.
    영속성 전이를 사용하면 부모 엔터티를 저장할 때 자식 엔터티도 함께 저장할 수 있다.
    + JPA 에서 엔터티를 저장할 때 연관된 모든 엔터티는 영속 상태이어야 한다.

영속성 전이 - 저장.
@OneToMany (mappedBy = "parent", cascade = CascadeType.PERSIST)

  • 부모만 영속화하면 CascadeType.PERSIST 로 설정한 자식 엔터티까지 함께 영속화 해서 저장한다.

영속성 전이 - 삭제
@OneToMany (mappedBy = "parent", cascade = CascadeType.REMOVE)
cascade 의 타입을 REMOVE 로 설정하고, 부모 엔터티만 삭제하면 자식 엔터티도 함께 삭제된다.

CASCADE 의 종류

public enum CascadeType {
	ALL,     // 모두 적용
    PERSIST, // 영속
    MERGE,   // 병합
    REMOVE,  // 삭제 
    REFRESH, // REFRESH
    DETACH	 // DETACH
}

고아 객체 - ORPHAN

  • 부모 엔터티가 없는 객체.
    고아객체 제거 : 부모 엔터티와 연관관계가 끊어진 자식 엔터티를 자동으로 삭제하는 기능,
    참조가 제거된 엔터티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능이다.
    고아객체 제거시에는 부모 엔터티의 컬렉션에서 자식 엔터티의 참조만 제거하도록 하면 된다.
    사용 - @OneToMany(mappedBy = "parent", orphanRemoval = true
  • 고아 객체의 제거 기능은 영속성 컨텍스트를 플러시할때 적용되므로, 플러시 시점에 DELETE SQL 이 실행된다.
  • 부모 엔터티와 연관관계가 끊어진 자식 엔터티를 자동으로 삭제할 때 사용하는 기능.

0개의 댓글