프레임워크와 라이브러리/JPA

[JPA 생명 주기] Cascade와 OrphanRemoval 완전 이해하기

Dachaes 2025. 4. 11. 14:44
728x90
반응형
728x90

영속성 전이(Cascade)와 고아 객체 제거(OrphanRemoval) 

JPA를 사용하다 보면, 연관된 엔티티도 함께 저장하거나 삭제하고 싶을 때가 많습니다. 예를 들어, 게시글(Post)을 저장하면서 댓글(Comment)도 함께 저장하려면 어떻게 해야 할까요?

이럴 때 사용하는 기능이 바로 이것입니다.

  • Cascade (영속성 전이) : 연관 엔티티에 대한 생명주기 자동 전파
  • OrphanRemoval (고아 객체 제거) : 부모 객체와의 관계가 끊어진 자식 엔티티 자동 삭제

 


 

1.  영속성 전이(Cascade)란?

부모 엔티티의 상태 변화(Persist, Merge, Remove 등)자식 엔티티에 전파되도록 하는 기능입니다.

예를 들어, 부모 객체를 저장할 때, 연관된 자식 객체도 자동으로 저장되게 하려면 CascadeType.PERSIST가 필요합니다.

주요 Cascade 타입들

타입 설명
PERSIST 부모 저장 시 자식도 저장
MERGE 부모 병합 시 자식도 병합
REMOVE 부모 삭제 시 자식도 삭제
REFRESH 부모 새로고침 시 자식도 새로고침
DETACH 부모 detach 시 자식도 detach
ALL 위 모든 동작 포함

예제 : CascadeType.PERSIST

@Entity
public class Parent {

    @Id @GeneratedValue
    private Long id;

    @OneToMany(cascade = CascadeType.PERSIST)
    private List<Child> children = new ArrayList<>();
}
  • CascadeType.PERSIST가 없으면 em.persist(child1)도 명시적으로 해줘야 합니다.

 


2.  고아 객체 제거(Orphan Removal)

부모 엔티티와의 관계가 끊긴 자식 엔티티를 자동으로 DB에서 삭제하는 기능입니다.

@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> children = new ArrayList<>();
  • orphanRemoval = true를 설정하면, 자식이 컬렉션에서 제거되었을 때 자동으로 delete 쿼리가 실행됩니다.

예제 : 고아 객체 제거

Parent parent = em.find(Parent.class, 1L);
Child child = parent.getChildren().get(0);

parent.getChildren().remove(child);
// 영속성 컨텍스트에서 flush 또는 트랜잭션 커밋 시 child는 DELETE 됨
  • 즉, “부모가 자식을 더 이상 참조하지 않으면, 자식도 제거한다”는 의미입니다.

 


3.  Cascade와 Orphan Removal 의 차이

항목 Cascade OrphanRemoval
전이 방향 부모 → 자식 부모 → 자식
용도 저장/삭제 등 상태 전이 자동화 관계 끊김 시 자식 자동 삭제
delete 시점 부모 remove 시 관계 끊김(컬렉션에서 제거) 시
주의사항 잘못 사용 시 의도치 않은 저장/삭제 발생 관계가 끊기기만 해도 삭제되므로 위험 가능

 


4.  실무 사용 팁

  • CascadeType.ALL을 무조건 사용하는 것보다 필요한 기능만 지정하는 것이 안전합니다.
  • orphanRemoval = true는 일대다 관계에서 자식 생명주기를 부모에 완전히 위임할 때만 사용해야 합니다.
  • 양방향 관계에서는 연관관계 주인이 관계 끊기를 해야 orphanRemoval이 제대로 작동합니다.
  • 단방향에서는 컬렉션에서 remove()만 하면 삭제되지만, 양방향에서는 반대쪽 연관도 끊어줘야 합니다.
child.setParent(null);
parent.getChildren().remove(child);

 


5.  마무리

영속성 전이와 고아 객체 제거는 객체 그래프를 효율적으로 관리할 수 있게 해주는 JPA의 핵심 기능입니다.
하지만 동작 방식과 시점을 정확히 이해하지 않으면 데이터 손실, 예외 상황 등이 발생할 수 있습니다.
따라서, 언제 어떤 경우에 사용하는지 목적을 명확히 하고 신중하게 설계하는 것이 중요합니다.

함께 보면 좋은 자료

블로그 글 :

 

[JPA] 객체와 데이터베이스를 잇는 다리

JPA(Java Persistence API) JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와의 상호작용을 단순하고 직관적으로 만들어주는 ORM 기술입니다. 복잡한 SQL을 직접 작성하지 않아도 객체 중심

dachaes-devlogs.tistory.com

 

[JPA의 관계 매핑] 객체 간 관계를 데이터베이스에 자연스럽게 표현하는 법

JPA의 관계 매핑JPA는 객체 간의 연관 관계(association)를 데이터베이스의 외래 키 관계로 변환해주는 기능을 제공합니다. 객체지향에서는 필드 참조로 관계를 표현하고, 데이터베이스에서는 외래

dachaes-devlogs.tistory.com

 


반응형
728x90
반응형