inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

29강. N+1 문제를 해결하는 방법! fetch join

테스트 후 AfterEach 함수에서 나오는 쿼리

136

ysko

작성한 질문수 14

0

안녕하세요 fetch join까지 적용한 후에 테스트 코드 자체가 N+1 문제가 제거된 것은 확인했습니다.

그런데 AfterEach 함수에서 deleteAll을 하는 과정에 fetch join 이전의 N+1 쿼리랑 유사한 쿼리가 나오는데 이게 delete 쿼리를 날리기 위한 데이터를 가져오려는 목적인것 같은데 질문이 있습니다.

 

  1. 혹시 deleteAll 이전에 나오는 쿼리도 N+1처럼 동작하는지

  2. 테스트 코드이므로 테스트 객체의 모수가 작아 무시해도 되는지

이정도 질문하고 싶습니다

java spring kotlin spring-boot 리팩토링

답변 2

0

최태현

안녕하세요! ysko님! 좋은 질문 감사합니다.

하나씩 답변 드려 보겠습니다.

 

[1. deleteAll 이전에 나오는 쿼리도 N+1처럼 동작하는지]

  • 네 비슷합니다.

  • 보다 정확하게는 deleteAll 을 호출하게 되면, select * from t; 를 통해 삭제할 Entity를 모두 가져오게 되고, 혹시나 연관관계가 있는 테이블이 있다면 해당 테이블도 삭제하기 위해 N+1 처럼 N 번 select 쿼리를 실행하게 됩니다.

image.png
  • 이런 동작 방식 대신 deleteAllInBatch 를 사용하실 수도 있습니다.

  • deleteAllInBatch 는 select 쿼리 없이 모든 데이터를 지우는데요, 따라서 자동 생성된 FK를 피하기 위해 1 : N 구조에서 N(자식) 쪽 테이블부터 deleteAllInBatch 를 이용해 모든 데이터를 제거하고, 부모 쪽 테이블을 지우는 식으로 구현해야 합니다.

 

[2. 테스트 코드이므로 테스트 객체의 모수가 작아 무시해도 되는지]

  • 넵 맞습니다! 👍 제 개인적인 생각으로는 테스트이기도 하고, 모수가 그렇게 크지 않아서 괜찮을 것 같습니다.

  • 혹시나 모수가 굉장히 많아지는 데이터를 테스트 하시게 된다면 위에서 말씀드린 deleteAllInBatch 방식을 쓰시는 것도 괜찮습니다.

 

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

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. ysko님, 질문 주셔서 감사합니다.

테스트 실행 후 @AfterEach에 등장하는 deleteAll 메서드의 동작과 쿼리에 대해 궁금증이 있으신 것 같네요. 이와 관련하여 몇 가지 설명을 드리겠습니다.

  1. deleteAll 이전에 나오는 쿼리: deleteAll 메서드가 호출될 때, 이 메서드는 데이터베이스의 모든 엔티티 데이터를 삭제하게 됩니다. 만약 JPA에서 캐스케이드나 orphanRemoval 옵션이 설정돼 있다면, 연관된 엔티티들도 삭제될 것이며, 이에 필요한 데이터를 로드하기 위한 쿼리가 수행될 수 있습니다. 이것이 N+1 문제처럼 보일 수 있지만, 실제론 연관 데이터의 적절한 삭제를 위한 것입니다.

  2. 테스트 객체의 모수가 작아 무시할 수 있는지: 일반적으로 테스트 환경에서는 데이터의 양이 적고, 성능 이슈가 크지 않을 수 있습니다. 그러나 실제 운영 환경에서는 대량의 데이터로 인해 성능 문제가 발생할 수 있으므로, 최적화가 필요할 수 있습니다. 테스트 단계에서는 큰 문제가 없지만, 운영 단계에서는 주의 깊게 적용해야 합니다.

이와 관련해서는 다음의 링크들이 도움이 될 수 있을 것 같습니다:

  • JPA 연관관계 질문입니다.
    JPA 및 연관 관계에 대한 delete 동작에 대한 논의가 있습니다. 해당 옵션과 설정에 따라 상호 참조 데이터의 삭제 과정이 작동하는 방식을 이해하는 데 도움이 될 것입니다.

  • userRepository.deleAll()관련 질문이 있습니다.
    deleteAll과 관련된 삭제 메커니즘과 JPA의 동작에 대해 다루고 있습니다. 다양한 삭제 방법과 설정의 차이를 이해할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

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

테스트 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

intelliJ 최신버전과 kotlin 1.6버전 충돌. 빌드 오류

1

999

2