본문 바로가기
Back-end/JPA 개념

16. 영속성 전이(Cascade)

by devraphy 2022. 4. 12.

0. 개요

- 웹 개발 공부를 했다면 Cascade라는 단어가 익숙할 수 있다.

- CSS(Cascade Style Sheet)에서 사용되는 단어이기 때문이다.

 

- Cascade라는 단어는 폭포처럼 흐른다는 의미를 갖는다.

- 이를 의역해보면 연쇄적인, 종속적인, 상속적인, 전이되는 등으로 해석할 수 있다.

- 이처럼 어떤 속성을 전수하는 것을 Cascade라고 표현한다.

 

- 이번 포스팅에서는 JPA에서 사용하는 Cascade에 대해서 알아보자.

 

1. 영속성 전이(Cascade)

a) 영속성 전이란?

- 어떤 Entity를 영속성 Context에 등록할 때, 연관 객체도 함께 등록하는 기능이다.

- 즉, 어떤 Entity를 영속 상태로 만들 때, 연관 객체 또한 함께 영속 상태가 되도록 하는 것이다.

- 예를 들어, 부모 Entity를 영속성 Context에 저장할 때, 자식 Entity도 함께 저장되도록 하는 상황이 여기에 해당된다.

 

* 오해하지 말자!!!

- 영속성 전이(= Cascade)는 연관 관계 매핑 또는 상속과는 아무 상관없는 독립적인 기능이다.

 

b) 예시 코드

- 다음 예시 코드를 보면서 Cascade 기능에 대해서 알아보자.

@Entity
public class Parent {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "parent") // 양방향 매핑
    private List<Child> childList = new ArrayList<>();

    public void addChild(Child child) { // 연관 관계 편의 메서드
        childList.add(child);
        child.setParent(this);
    }
    
    // Getter & Setter 생략
}

 

@Entity
public class Child {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne 
    @JoinColumn(name = "parent_id")
    private Parent parent;
    
    // Getter & Setter 생략
}

  

- 위와 같은 관계의 객체가 있는 경우, 각 객체를 생성하여 저장하려면 다음과 같은 코드를 작성해야 한다.

 

- 위의 코드처럼, 총 3번의 persist() 메서드를 호출해야 영속성 Context에 객체들을 등록할 수 있다.

- 만약 개발자가 Parent 중심적으로 코드를 작성하고 싶고, 중복되는 코드를 최소화하고 싶다면 어떻게 해야 할까?

- 이 경우, Cascade 옵션을 통해 해결할 수 있다.

 

c) cascade 옵션 사용

- 위에서 언급한 문제를 해결하기 위해서 cascade를 사용한다.

- cascade 기능은 다음과 같이 옵션으로 설정할 수 있다.

Parent Entity의 코드

 

- 이처럼 cascade 옵션을 설정하면, Parent 객체를 persist()할 때 연관 객체 모두를 함께 등록한다.

- cascade 옵션을 사용하면 다음과 같이 실행 코드를 변경할 수 있다.

 

- cascade 옵션을 사용했기 때문에 Parent 객체를 persist()할 때 Child 객체를 함께 등록하게 된다.

- 위의 코드를 실행하면 다음과 같은 쿼리문이 발생하는 것을 확인할 수 있다.

 

- 이처럼 Parent 객체를 persist()할 때, JPA가 알아서 연관 객체(= Child)를 함께 등록하는 것을 확인할 수 있다.

 

2. Cascade 옵션의 종류

a) CascadeType.ALL

- Cascade 옵션을 사용할 때, 가장 많이 사용하는 옵션

- 모든 연관 객체를 영속화하는 기능이다.

 

b) CascadeType.PERSIST 

- 연관 객체를 등록할 때만 Cascade 옵션을 적용하는 기능이다.

- 즉, 영속화된 객체를 삭제시킬 때에는 Cascade 옵션이 작동하지 않도록 하는 기능이다.

 

c) CascadeType.REMOVE

- 어떤 객체를 삭제(= 비영속화)할 때, 모든 연관 객체를 함께 삭제하는 기능이다.

 

d) 기타

- 이 외에도 MERGE, REFRESH, DETACH 옵션이 존재하는데, 이들은 잘 사용하지 않는다.

- Cascade 사용 시 위의 3가지 옵션을 가장 많이 사용한다. 

- 궁금하다면 따로 찾아보자.

 

3. Cascade 적용 시점

a) 언제 사용할까? 

- Cascade 옵션은 어떤 부모 객체 혼자서 모든 자식 객체를 관리하는 경우 사용하는 것을 권장한다.

- 즉, 자식 객체를 관리하는 부모가 단일 객체(= 단일 소유)인 경우에만 사용하는 것을 권장한다.

- 더불어, 부모 객체와 자식 객체의 라이프 사이클이 동일할 때 사용하는 것을 권장한다.

 

b) 사용 시 주의사항

- 자식 객체를 다수의 부모 객체가 관리되는 경우

- 하위 객체 중 일부가 다른 상위 객체에 의해 관리되는 경우 

- 즉, 단일 부모가 아닌 다수의 상위 객체에 의해 자식 객체가 관리되는 경우는 사용하면 안된다.

 

'Back-end > JPA 개념' 카테고리의 다른 글

18. 값 타입(1) - 개념  (0) 2022.04.14
17. 고아 객체(Orphan)  (0) 2022.04.13
15. 지연 로딩 & 즉시 로딩(N + 1 문제)  (0) 2022.04.11
14. 프록시(Proxy)  (0) 2022.04.08
13. @MappedSuperClass  (0) 2022.04.07

댓글