inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

191

dohyun_lim

작성한 질문수 67

2

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

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

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

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

java spring kotlin spring-boot 리팩토링

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

 

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

안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?

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