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

송현진·2023년 7월 22일
0

Jpa

목록 보기
7/9
post-thumbnail

즉시 로딩(fetch = FetchType.EAGER)

  • JPA 구현체는 가능하면 조인을 사용해 SQL 한번에 함께 조회

주의

  • 실무에서 사용하면 안됨!
  • 즉시 로딩 적용시 예상 치 못한 SQL 발생
  • JPQL에서 N+1 문제 발생
  • @ManyToOne, @OneToOne은 기본이 즉시 로딩

지연 로딩(fetch = FetchType.LAZY)

  • 프록시로 가져옴
  • 모든 연관관계에서 사용해라(실무)
  • JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라!
  • @OneToMany, @ManyToMany는 기본이 지연 로딩

영속성 전이

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

CASCADE 주의

  • 연관관계 매핑하는 것과 관련없음
  • 엔티티 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 제공뿐

종류

  1. ALL : 모두 적용
  2. PERSIST : 영속
  3. REMOVE : 삭제
  4. MERGE : 병합
  5. REFRESH : REFRESH
  6. DETACH : DETACH

고아객체

부모 엔티티와 연관관계 끊어진 자식 엔티티를 자동으로 삭제
orphanRemoval = true

Parent parent = em.find(Parent.class, id);
parent.getChildren().remove(0);
// 자식 엔티티를 컬렉션에서 제거

주의

  • 참조하는 곳이 하나일 때 사용해야 함!
  • 특정 엔티티가 개인 소유할 때 사용
  • @OneToOne, @OneToMany만 가능
  • CascadeType.REMOVE 처럼 동작함

CasecadeType.REMOVE vs orphanRemoval=true

  • 부모 객체가 삭제 되었을 때 자식도 함께 삭제되는 점은 동일
  • 관계가 끊어진다면??
    • orphanRemoval=true는 관계가 끊어진 자식을 자동으로 제거
    • CasecadeType.REMOVE는 관계가 끊어진 자식을 자동으로 제거하지 않음
      (관계가 끊어졌다는 것을 제거로 안봄)

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

  • CascadeType.ALL + orphanRemoval = true
  • 스스로 생명주기 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거
  • 두 옵션 모두 활성화 하면 부모 엔티티를 통해 자식의 생명주기 관리가능
  • 도메인 주도 설계(DDD)의 Aggregate Root 개념 구현할 때 유용
profile
개발자가 되고 싶은 취준생

0개의 댓글