![[Spring] Cascade옵션 알아보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGuMW6%2Fbtr3V7o6okI%2F5hKMK5efhzfBN4LlKM4Tjk%2Fimg.png)
김영한 님의 '실전! 스프링 부트와 JPA 활용 1' 강의를 듣다가 @OneToMany와 @ManyToOne로 연관관계 매핑을 하는 과정에서 cascade = CascadeType.ALL 옵션을 사용하셨는데, Cascade가 무엇을 의미하는지 알아보고자 블로그를 작성하였습니다.
Cascade(영속성 전이) 옵션
Cascade 옵션은 엔티티의 상태 변화를 전파시키는 옵션을 의미합니다.
@OneToMany와 @ManyToOne로 양방향 관계를 맺는 엔티티의 상태 변화를 전이시킬 때 사용합니다.
유저와 주소의 관계를 생각해 볼 때, 한 유저가 여러 개의 주소를 가질 수 있기에 유저와 주소의 관계는 1대다 관계입니다. 유저가 없으면, 그 유저의 주소는 아무 의미가 없을 것입니다. 그렇기에 만약 유저 정보가 삭제된다면 그 유저의 주소 정보 또한 삭제합니다. cascade 옵션을 사용하면 이를 쉽게 구현할 수 있습니다.
즉, cascade 옵션이란 엔티티에 어떠한 작업이 수행되면, 그와 연관된 엔티티에도 동일한 작업이 수행되게 하는 옵션을 의미합니다.
Cascade Type
- CascadeType.ALL: 모든 Cascade를 적용
- CascadeType.PERSIST: 엔티티가 영속 상태가 되면, 하위 연관된 엔티티 또한 영속 상태가 됨
- CascadeType.MERGE: 엔티티 상태를 병합할 때, 하위 연관된 엔티티 또한 병합
- CascadeType.REMOVE: 엔티티를 제거하면, 하위 연관된 엔티티 또한 제거
- CascadeType.REFRESH: 엔티티를 새로고침 하면, 하위 엔티티 또한 새로고침
- CascadeType.DETACH: 부모 엔티티를 영속성 컨텍스트에서 제거하면, 하위 연관된 엔티티도 영속성 컨텍스트에서 제거되어 변경 사항을 반영하지 않는다.
Cascade 실습
User 클래스
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class User{
@Id @GeneratedValue
@Column(name = "userId")
private Long id;
private String userName;
private String phoneNumber;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Address> addressList = new ArrayList<>();
}
Address 클래스
@Entity
@Getter
public class Address {
@Id @GeneratedValue
@Column(name = "addressId")
private Long id;
private String address;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId")
private User user;
}
public void deleteUser(long userId) {
User user = em.find(User.class, userId);
em.remove(user);
}
위의 코드는 userRepository 클래스의 코드 일부분입니다.
postman을 사용하여 데이터를 추가하였고, 이제 Postman을 사용하여 user_id가 2인 데이터를 삭제하겠습니다.
유저만 삭제했음에도 불구하고, 주소 정보까지 삭제되는 것을 확인할 수 있었습니다.
참고자료
https://choiblack.tistory.com/48
[Spring Data JPA] Cascade와 OrphanRemoval
JPA를 사용하여 Entity 클래스를 설계하다보면 @OneToMany나 @ManyToOne와 같은 연관 관계 매핑을 주로 사용하게 된다. 이때 cascade 옵션을 사용하여 매핑된 Entity를 함께 관리할 수 있다. Entity Cascade Entity c
choiblack.tistory.com
'Spring' 카테고리의 다른 글
[Spring] 양방향 순환참조 해결하기 (0) | 2023.04.15 |
---|---|
[Spring] 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading) 알아보기 (0) | 2023.03.19 |
[Spring] Bean Validation 알아보기 (1) | 2023.03.09 |
[Spring] DTO를 사용하는 이유를 알아보자 (0) | 2023.03.04 |
[Spring] 의존성 주입(DI) 알아보기 (0) | 2023.02.28 |
느리더라도 단단하게 성장하고자 합니다!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!