인프런 커뮤니티 질문&답변

dohyun_lim님의 프로필 이미지
dohyun_lim

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

9강. 책 관련 기능 테스트 작성하기

userRepository.deleAll()관련 질문이 있습니다.

해결된 질문

작성

·

128

2

안녕하세요 선생님 강의잘듣고 있습니다.
질문이 2개 있습니다.

강의 == 9강 책관련기능 테스트 작성하기

1) 10:27 에 userRepository.deleteAll 이 자식 테이블 까지 지워주는게 User의 userLoanHistories 필드에 cascade, orphanRemoval 때문에 지워주는게 아닌가요?

2) 상황에 따라 다르겠지만 보통 @OneToMany에서는 cascade = CascadeType.ALL, orphanRemoval = true 를 해주는게 좋나요?
All 만 해줘도 User를 지우면 UserLoanHistories도 지워주게 되는것이 아닌가요?

답변 1

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! dohyun_lim님! 좋은 질문 주셔서 감사드립니다! 😊 하나씩 답변 드려보겠습니다!

 

[1. userRepository.deleteAll() 의 범위]

User 엔티티와 1 : N 연관관계를 맺고 있는 List<UserLoanHistory> 에 대해, userRepository.deleteAll() 을 수행할 경우 UserLoanHistory 까지 함께 지워지는 이유에 대해 질문 주신 것으로 이해했습니다!

  • 결론부터 말씀드리면, "All 만 해줘도 User를 지우면 UserLoanHistories도 지워주게 되는것"이 맞습니다.

    • CascadeType.ALL 안에 CascadeType.REMOVE 가 존재하고, 이 옵션이 들어있는 경우 부모가 제거되었을 때 자식도 함께 제거되기 때문입니다.

     

    다만, orphanRemoval 옵션은 다음과 같은 경우에 효과가 있습니다.

// User 클래스 안 함수에서 다음과 같은 로직이 있다고 하자
// 2번째 UserLoanHistory 와 User의 연관관계를 끊는다.

userLoanHistories[1].user = null 

만약 orphanRemoval 옵션이 존재하지 않는다면, DB에 별다른 변화가 없지만

orphanRemoval = true 옵션이 켜져 있다면 부모와 자식의 연관관계가 끊긴 상황에서 자식 쪽 데이터가 DB에서 제거됩니다.

 

또한, 추가적으로 CascadeType.REMOVE 옵션이 걸려 있지 않더라도, orphanRemoval = true 옵션 켜져 있어도 부모 데이터 제거시 자식 데이터도 함께 제거됩니다.

 

[2. 그렇다면 무엇을 쓰는 것이 좋은가]

굉장히 심오하면서도 좋은 질문입니다! 😊

이에 대해서는 여러 의견이 있을 수 있는데요! 저는 개인적으로

  • 가급적 엔티티 간의 연관관계를 최소로 맺으며

  • 만약 자식이 부모의 주요 Life Cycle을 대다수 따라가는 경우 (1 : N 연관관계를 맺어서 얻는 이점이 큰 경우) CascadeType.REMOVEorphanRemoval = true 옵션을 모두 주는 편입니다!

    • 주요 Life Cycle을 대다수 따라간다는 것은 부모가 수정, 삭제, 업데이트될 때 자식까지 함께 수정, 삭제, 업데이트가 일어난다는 의미이고, 이럴 때 두 옵션 모두 챙겨두면 코드를 간결하게 만들 수 있는 경우가 많았기 때문입니다. 👍

 

답변이 도움이 되었으면 좋겠습니다! 감사합니다! 🙏

dohyun_lim님의 프로필 이미지
dohyun_lim

작성한 질문수

질문하기