JPA에서 Entity 간의 관계 [Spring]

jbong·2025년 2월 4일
0

스프링부트

목록 보기
6/15

배경

spring으로 구현을 하면서, 엔티티간의 관계를 설정을 해야 할 상황

그중 중요한 속성인 cascadefetch 속성에 대하여 설명을 하려고 한다.


cascade

cascade 속성은 부모 엔티티에 대한 작업이 자식 엔티티에도 전파되는 방식이다.

예를 들어 특정 작업(삭제, 추가)이 엔티티에 수행될 때, 그에 따라 연관(참조 관계)된 자식 엔티티에도 동일한 작업이 수행된다는 의미이다.

📌 CascadeType.PERSIST

부모 엔티티가 저장(persist)될 때, 자식 엔티티도 함께 저장된다.

예를 들어, Drama 엔티티를 저장할 때 관련된 Actor 엔티티(자식)도 자동으로 저장
code

선언은 다음과 같이 부모 엔티티에서 선언을 해준다.

public class Drama{
	// 코드 생략

    @ManyToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "actor_id") // 외래 키
    private Actor actor;

}

📌 CascadeType.All

PERSIST, MERGE, REMOVE, REFRESH, DETACH 등 모든 엔티티 상태 변경이
자식 엔티티에 적용

부모 엔티티에 대한 모든 상태 변화가 자식 엔티티에도 적용되므로, 모든 작업을 함께 진행할 때 유용
code

선언은 마찬가지로 부모 엔티티에서 선언을 해준다.

public class Drama{
	// 코드 생략

    @ManyToOne(cascade = CascadeType.All) 
    @JoinColumn(name = "actor_id") // 외래 키
    private Actor actor;
}

📌 차이점

CascadeType.PERSIST를 사용하는 경우

자식 엔티티를 독립적으로 관리하고 싶을 때.
즉, 두 관계에 대해 저장을 할 때는 영향을 미치지만, 다른 작업(삭제 등)에서는 자식 엔티티가 영향을 받지 않도록 하고 싶을 때 사용한다.

ascadeType.ALL을 사용하는 경우

부모의 상태 변화가 자식에게도 반영되어야 할 때 즉, 모든 상태 변화가 자식 엔티티에 자동으로 적용되기를 원할 때 사용한다.


profile
노력하는 개미

0개의 댓글