본문 바로가기
프로그래밍/Back-end

JPA 영속성 전이 CASCADE 고아 객체

by @GodWin 2024. 10. 15.

-

 

-
안녕하세요? 오늘은 JPA CASCADE 영속성 전이와 고아 객체 에 대해서 알아보도록 하겠습니다.

 

-

영속성 전이

(CASCADE)

: 연관관계랑은 전혀 상관이 없다.
: 단일 소유자로써 
부모 엔티티의 데이터를 등록할 때,
연관관계가 설정된 자식 엔티티의 정보를
일괄 등록하는 기능
> 부모가 하나일 때에만 사용 가능
>> 단일 엔테티에 종속적일때 사용 ★★★
>>> 타 엔티티와의 영향도 고려 필수 ★★★



부모 엔티티 생성)

@Entity
public class Parent {
  
  @Id @GeneratedValue
  @Column(name = "PARENT_ID")
  private Long id;
  
  @Column(name = "PARENT_NAME")
  private String name;
  
  @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) // ★★★
  private List<Child> childList = new ArrayList<>();
  
  public void addChild(Child child) {
    childList.add(child);
    child.setParent(this);
  }
  
  ...
  
}


자식 엔티티 생성)

@Entity
public class Child {
  
  @Id @GeneratedValue
  @Column(name = "CHILD_ID")
  private Long id;
  
  @Column(name = "CHILD_NAME")
  private String name;
  
  @ManyToOne
  @JoinColumn(name = "CHILD_ID")
  private Parent parent;
  
  ...
  
}


샘플코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

Parent parent = new Parent();
parent.setName("parentA");

Child child1 = new Child();
child1.setName("childA");

Child child2 = new Child();
child1.setName("childB");

// cascade 미사용시
em.persist(parent);
em.persist(child1);
em.persist(child2);

// cascade 사용시
em.persist(parent);

tx.commit();



+
cascade를 사용 시, parent 엔티티에 데이터를 등록하게 되면, 연관관계를 맺은 모든 child 엔티티에 데이터가 자동 등록이 되게 된다.

-
CASCADE의 종류

속성 명 설명
ALL 모두 적용
PERSIST 영속 (저장시에만 사용)
REMOVE 삭제
MERGE 병합
REFRESH 새로고침
DETACH 영속성 해제

 

-

고아 객체

: 부모 엔티티와 연관관계가 끊어진,
자식 엔티티를 자동으로 삭제
: 참조가 제거된 엔티티는, 다른 곳에서 참조하지 않는 고아 객체로 판단하고 삭제하는 기능

: 참조하는 곳이 하나일 때 사용 
: 특정 엔티티가 개인 소유할 떄 사용 ★★★

: 일대일 [1:1], 일대다 [1:N] 연관관계에서만 사용가능


+
개념적으로 부모를 제거하면, 자식은 고아가 된다.
> 고아 객체 제거 기능을 활성화하면, 부모를 제거할 때, 자식도 함께 제거된다.
>> CascadeType.REMOVE 처럼 작동



부모 엔티티 생성)

@Entity
public class Parent {
  
  @Id @GeneratedValue
  @Column(name = "PARENT_ID")
  private Long id;
  
  @Column(name = "PARENT_NAME")
  private String name;
  
  @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) // ★★★
  private List<Child> childList = new ArrayList<>();
  
  public void addChild(Child child) {
    childList.add(child);
    child.setParent(this);
  }
  
  ...
  
}


자식 엔티티 생성)

@Entity
public class Child {
  
  @Id @GeneratedValue
  @Column(name = "CHILD_ID")
  private Long id;
  
  @Column(name = "CHILD_NAME")
  private String name;
  
  @ManyToOne
  @JoinColumn(name = "CHILD_ID")
  private Parent parent;
  
  ...
  
}


샘플코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

Parent parent = new Parent();
parent.setName("parentA");

Child child1 = new Child();
child1.setName("childA");

Child child2 = new Child();
child1.setName("childB");

em.persist(parent);

em.flush();
em.clear();

Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().remove( index: 0 );

tx.commit();



※ 다시한번 말하지만, 해당 기능들은, 단일 엔테티에 종속적일때 사용 

-> 특정엔티티가 개인소유할 시에만 사용!!!



-

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

 

: 스스로 생명주기를 관리하는 엔티티는, persist로 영속화하고, remove로 제거한다.
: 두 옵션을 모두 활성화 하면, 부모 엔티티를 통해서 자식의 생명주기 관리 가능
※ 도메인 주도 설계(DDD)의 Aggregate Root 개념 구현 시 유용




+
위의 샘플 코드를 예로들면,
parent가 해당 기능의 생명주기를 관리하는 셈




오늘은 JPA 영속성 전이 CASCADE 와 고아 객체 에 대해서 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길 바라겠습니다.

 

※ 참고 

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1%EA%B3%BC-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

JPA 영속성과 영속성 컨텍스트에 대하여!

- -안녕하세요? 오늘은 JPA에서 가장 중요한 개념인, 영속성에 관련해서 알아보도록 하겠습니다.JPA를 공부할 때 가장 중요한 점은,1. 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapp

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98-%EC%9E%A5%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

JPA 영속성 컨텍스트의 장점에 대하여!

- -안녕하세요? 오늘은, JPA에서 가장 중요한 개념인, 영속성에서 더 나아가서, 영속성 컨텍스트의 이점에 대해서 알아보도록 하겠습니다.※ JPA의 영속성과 영속성 컨텍스트에 대해서는, 아래 포

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-Flush

 

JPA 영속성 Flush

- -안녕하세요? 오늘은, 이전 포스팅에서 다뤘던, 영속성 컨텍스트의 이점 중에서, 1차캐시 중, 트랜잭션의 commit 시점에서, 내부적으로 이루어지는 flush에 대해서 알아보도록 하겠습니다.※ JPA

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%98%81%EC%86%8D%EC%83%81%ED%83%9C%EC%99%80-%EC%A4%80%EC%98%81%EC%86%8D%EC%83%81%ED%83%9C

 

JPA 영속성 영속상태와 준영속상태

- -안녕하세요? 오늘은, JPA의 특성 중 하나인, 영속 상태와 준영속 상태에 대해서 알아보도록 하겠습니다.※ JPA의 영속성과 영속성 컨텍스트/이점과 flush 등의 관련된 내용은, 아래 포스팅을 참

logger-debug.tistory.com