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 |