userRepository.deleAll()관련 질문이 있습니다.
안녕하세요 선생님 강의잘듣고 있습니다.
질문이 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을 대다수 따라간다는 것은 부모가 수정, 삭제, 업데이트될 때 자식까지 함께 수정, 삭제, 업데이트가 일어난다는 의미이고, 이럴 때 두 옵션 모두 챙겨두면 코드를 간결하게 만들 수 있는 경우가 많았기 때문입니다. 👍
답변이 도움이 되었으면 좋겠습니다! 감사합니다! 🙏
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
0
67
2
실행이 안되네요
0
65
2
프론트 영역 보는법
0
51
2
companion object
0
75
2
Custom 레프직토리 형식
0
56
2
Querydsl 도입
0
67
2
fetch join DISTINCT 중복제거
1
82
2
표준 예외와 커스텀 예외 사용 전략 질문
0
84
3
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
1
177
2
테스트를 위한 코드
1
105
2
프로젝트 실행 에러
0
150
2
PDF 문서에 오타가 있어서 알려드립니다.
1
102
1
enum질문
1
86
1
테스트 후 AfterEach 함수에서 나오는 쿼리
0
136
2
테스트 fixture
1
210
2
./gradlew test 실행시 인식할수 없다고 뜹니다.
0
140
1
test 코드 실행시 경고가 발생합니다.
0
140
1
13강 User Kotlin 변환중
2
169
3
'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문
2
173
1
-
0
141
2
4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?
0
310
3
junit import 불가
0
269
3
테스트 코드와 관련하여 질문이 있습니다.
1
215
1
hibernate가 select를 두번 하는 이유
0
236
1





