개발자의 오르막

[#SpringBoot] CascadeType.Remove 와 orphanRemoval 의 차이 본문

SpringFrameWork/SpringBoot

[#SpringBoot] CascadeType.Remove 와 orphanRemoval 의 차이

계단 2020. 5. 28. 13:34

# 상황

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberFollow> memberFollowings = new ArrayList<>();

 

 Member 테이블과, Member 를 팔로우하는 MemberFollow 테이블이 1:다 관계로 매핑 되어 있다.

 위의 코드처럼 cascade = CascateType.All 이 걸려있는 경우, 우리는 저장할 때

memberFollowRepositroy.save(memberFollow)

 위의 코드처럼 memberFollow 엔티티를 save, delete 할 필요 없이

member.getMemberFollowings().add(memberFollow);
memberRepository.save(member);

 부모객체인 member 엔티티만 저장해도, memberFollow 테이블에서 데이터가 저장되고, 삭제된다.

 

 그리고, cascateType 이 걸려있을 때, member 를 삭제 시에 자동적으로 자식인 memberFollow 데이터를 삭제한 후

 member 를 삭제하기 때문에 참조 무결성 오류도 생기지 않는다.

 

 그러나

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<MemberFollow> memberFollowings = new ArrayList<>();

 위의 코드만으로는 memberFollow 테이블의 데이터가 삭제되지 않았다.


그렇다면 orPhanRemoval = true 는 어떤 역할을 하는걸 까?

 

CascadeType.Remove 와 orPhanRemoval = true 의 차이점은 관계가 끊어졌을 때 데이터에 대한 동작의 차이이다.

orPhanRemoval 는 부모 객체 (Member)와 자식 객체 (MemberFollow) 의 관계가 끊어졌을 때,

자식 객체의 데이터까지 삭제해주는 역할을 하고,

 

CascadeType.Remove 는 참조를 변경시켜 무결성 오류를 안나게 할 뿐, 그 데이터는 남겨두게 된다.

 

따라서 두 엔티티의 관계를 끊을 때, MemberFollow 테이블의 데이터가 계속 남아있기를 바란다면,

CascadeType.Remove 만 쓰는 것이고,

MemberFollow 테이블의 해당 데이터까지 삭제를 바란다면 orPhanRemoval = true 를 사용하는 것이다.

Comments