General/JPA

[JPA] orphanRemoval vs CascadeType.REMOVE 정리

개발자겨려 2025. 5. 7. 18:18
orphanRemoval 과 CascadeType.REMOVE 는 JPA(Java Persistence API)에서 엔티티 간의 관계를 관리하고, 둘다 부모 엔티티와 자식 엔티티 간의 관계에서 자식 엔티티를 삭제하는 데 사용된다는 점에선 같지만, 삭제 트리거(Trigger)가 다르다.
 

 

✅ 요약비교: CascadeType.REMOVE vs orphanRemoval = true

항목 CascadeType.REMOVE orphanRemoval = true
삭제 trigger 부모 엔티티 자체가 삭제될 때 연관관계에서 자식이 제거될때
실행 시점 entityManager.remove(parent) parent.getChildren().remove(child) 등
자식 삭제 방식 부모와 함께 삭제 부모와의 관계가 끊어지면 삭제
삭제 대상 모든 자식 엔티티 관계에서 제거된 자식만
주요 목적 부모 삭제 시 자식 자동 삭제 연관관계 해제 시 자식 삭제 (고아 제거)

 

📌예시

@Entity
public class Parent {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "parent", 
               cascade = CascadeType.ALL, 
               orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private Parent parent;
}

 

▶ CascadeType.REMOVE만 사용하는 경우

// 1. 부모 삭제
Parent parent = entityManager.find(Parent.class, 1L);
entityManager.remove(parent); // 이때 자식도 같이 삭제됨

자식은 부모와 연결돼 있기 때문에 부모 삭제 시 자식도 같이 삭제됨.

 

 

▶ orphanRemoval = true만 사용하는 경우

// 2. 자식만 제거
Parent parent = entityManager.find(Parent.class, 1L);
Child child = parent.getChildren().get(0);

parent.getChildren().remove(child); // 자식은 DB에서 DELETE됨

부모는 그대로 살아 있고, 연결만 끊었는데도 자식이 삭제됨. 이것이 orphanRemoval의 핵심.

 

 

 

🔥 핵심 정리

  • CascadeType.REMOVE: 부모가 삭제될 때 자식도 삭제
  • orphanRemoval = true: 부모는 살려두고 자식만 제거해도 삭제됨
  • 둘 다 설정하면: 부모 삭제 시 전부 삭제되고, 관계 끊으면 해당 자식만 삭제됨

 

 

 

둘을 같이 쓰는 경우가 많긴 하지만, 삭제의 의도와 트리거 시점이 다르기 때문에 목적에 따라 선택해야한다고한다..

'General > JPA' 카테고리의 다른 글

JPA, Hibernate, spring Data JPA  (0) 2025.05.09
[JPA] 연관관계 주인이란?  (0) 2025.05.07