본문 바로가기

Spring/JPA

CASCADE (영속성 전이)

CASCADE

cascade 영속성 전이 속성으로 특정 엔티티를 영속 상태(persist) 만들 연관된 엔티티도 함께 영속 상태(persist) 만들 사용합니다. cascase 즉시 로딩이나 지연 로딩과는 관련 없습니다

Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();

parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);
em.persist(child1);
em.persist(child2);

 

Parent 엔티티와 Child 엔티티가 다대일 연관관계를 형성할 때 위 코드와 같이 parent에 child를 넣더라도 persist는 따로 해야 합니다. Parent 엔티티에 Child 엔티티에 넣었다고 해서 Child 엔티티가 영속 상태로 변하지 않습니다.

 

하지만 아래와 같이 Parent 클래스의 Child 필드에 cascade 속성을 설정하면 parent persist 하여도 영속성 전이가 발생하여 child 필드들까지 persist 됩니다.

@Entity
public class Parent {

	// ... 생략
    
    @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
    private List<parents> parents;
}

 

이제는 cascade = CascadeType.PERSIST 설정했기 때문에, parent child 넣고 parent 엔티티만 persist 하면 child 엔티티들 까지 함께 persist 됩니다

영속성 전이

 

영속성 전이는 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이지 연관관계를 매핑하는 것과는 아무 관련 없습니다.

 

CASCADE 종류

cascade는 @OneToMany와 같은 일대다, 다대일, 일대일, 다대다 애노테이션의 cascade 속성으로 설정할 수 있습니다.

cascade 속성에 들어갈 수 있는 CASCADE는 아래와 같이 여섯 가지입니다. 

 

• CasecadeType.ALL: 모두 적용

• CasecadeType.PERSIST: 영속

• CasecadeType.REMOVE: 삭제

• CasecadeType.MERGE: 병합

• CasecadeType.REFRESH: REFRESH

• CasecadeType.DETACH: DETACH

 

이 중에서 CasecadeType.ALL과 CasecadeType.PERSIST가 가장 자주 사용됩니다. CasecadeType.ALL은 모든 라이프사이클을 동일하게 가져갈 때 사용되고, CasecadeType.PERSIST는 영속성 컨텍스트에 저장하는 라이프사이클만 동일하고 나머지 삭제, 병합 등의 작업은 따로 진행됩니다.

 

결국 CASCADE를 사용하면 연관관계로 묶인 엔티티들의 생명주기를 맞추겠다는 의미입니다.

 

CASCADE 주의 사항!!!

위에서 살펴본 Parent 엔티티와 Child 엔티티처럼 CASCADE를 사용하면 편리할 수 있습니다. 하지만 Child 엔티티를 Parent 엔티티에서만 관리한다면 CASCADE를 사용해도 괜찮지만, 애플리케이션 다른 곳에서도 Child 엔티티를 관리하고 있다면 CASCADE를 사용하면 안 됩니다.

 

다른 곳에서도 Child 엔티티를 관리한다면 자동 persist에 의해 엔티티의 관리가 꼬일 위험이 있습니다.

다시 말해 단일 소유자일 때만 CASCADE 사용하도록 합시다.

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

orphanRemoval (고아 객체)  (0) 2024.10.23
즉시 로딩과 지연 로딩  (0) 2024.10.21
프록시 (Proxy)  (0) 2024.10.21
@MappedSuperclass  (0) 2024.10.17
상속관계 매핑  (2) 2024.10.17