해결된 질문
작성
·
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.REMOVE
와 orphanRemoval = true
옵션을 모두 주는 편입니다!
주요 Life Cycle을 대다수 따라간다는 것은 부모가 수정, 삭제, 업데이트될 때 자식까지 함께 수정, 삭제, 업데이트가 일어난다는 의미이고, 이럴 때 두 옵션 모두 챙겨두면 코드를 간결하게 만들 수 있는 경우가 많았기 때문입니다. 👍
답변이 도움이 되었으면 좋겠습니다! 감사합니다! 🙏