diff --git a/src/main/java/org/runnect/server/publicCourse/repository/PublicCourseRepository.java b/src/main/java/org/runnect/server/publicCourse/repository/PublicCourseRepository.java index c09ed1a..465cc71 100644 --- a/src/main/java/org/runnect/server/publicCourse/repository/PublicCourseRepository.java +++ b/src/main/java/org/runnect/server/publicCourse/repository/PublicCourseRepository.java @@ -22,6 +22,15 @@ public interface PublicCourseRepository extends JpaRepository findByIdIn(Collection ids); + // deletePublicCourses에서 course/runnectUser(권한 검증)와 records(FK 해제)를 전부 순회하며 + // 지연로딩을 트리거하던 N+1을 없애기 위한 전용 조회 (PublicCourseServiceTest 참고) + @Query("SELECT DISTINCT pc FROM PublicCourse pc " + + "JOIN FETCH pc.course c " + + "JOIN FETCH c.runnectUser " + + "LEFT JOIN FETCH pc.records " + + "WHERE pc.id IN :ids") + List findByIdInWithCourseAndRecords(@Param("ids") Collection ids); + Long countBy(); @Query("SELECT pc " + diff --git a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java index 7c40109..65ad29e 100644 --- a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java +++ b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java @@ -362,7 +362,7 @@ public DeletePublicCoursesResponseDto deletePublicCourses( .orElseThrow(() -> new NotFoundUserException(ErrorStatus.NOT_FOUND_USER_EXCEPTION, ErrorStatus.NOT_FOUND_USER_EXCEPTION.getMessage())); - List publicCourses = publicCourseRepository.findByIdIn( + List publicCourses = publicCourseRepository.findByIdInWithCourseAndRecords( requestDto.getPublicCourseIdList()); diff --git a/src/test/java/org/runnect/server/publicCourse/service/PublicCourseServiceTest.java b/src/test/java/org/runnect/server/publicCourse/service/PublicCourseServiceTest.java index 50591d2..cf55dfd 100644 --- a/src/test/java/org/runnect/server/publicCourse/service/PublicCourseServiceTest.java +++ b/src/test/java/org/runnect/server/publicCourse/service/PublicCourseServiceTest.java @@ -583,7 +583,7 @@ class DeletePublicCourses { PublicCourse publicCourse = buildPublicCourse(100L, course); when(userRepository.findById(1L)).thenReturn(Optional.of(user)); - when(publicCourseRepository.findByIdIn(Collections.singletonList(100L))).thenReturn( + when(publicCourseRepository.findByIdInWithCourseAndRecords(Collections.singletonList(100L))).thenReturn( Collections.singletonList(publicCourse)); DeletePublicCoursesResponseDto response = publicCourseService.deletePublicCourses(1L, @@ -600,7 +600,7 @@ class DeletePublicCourses { void 존재하지_않는_공개코스_포함() { RunnectUser user = buildUser(1L); when(userRepository.findById(1L)).thenReturn(Optional.of(user)); - when(publicCourseRepository.findByIdIn(Arrays.asList(100L, 999L))).thenReturn(Collections.emptyList()); + when(publicCourseRepository.findByIdInWithCourseAndRecords(Arrays.asList(100L, 999L))).thenReturn(Collections.emptyList()); assertThatThrownBy(() -> publicCourseService.deletePublicCourses(1L, new DeletePublicCoursesRequestDto(Arrays.asList(100L, 999L)))) @@ -618,7 +618,7 @@ class DeletePublicCourses { PublicCourse othersPublicCourse = buildPublicCourse(101L, buildCourse(11L, otherUser, false)); when(userRepository.findById(1L)).thenReturn(Optional.of(user)); - when(publicCourseRepository.findByIdIn(Arrays.asList(100L, 101L))).thenReturn( + when(publicCourseRepository.findByIdInWithCourseAndRecords(Arrays.asList(100L, 101L))).thenReturn( Arrays.asList(ownPublicCourse, othersPublicCourse)); assertThatThrownBy(() -> publicCourseService.deletePublicCourses(1L, @@ -637,7 +637,7 @@ class DeletePublicCourses { PublicCourse othersPublicCourse = buildPublicCourse(101L, buildCourse(11L, otherUser, false)); when(userRepository.findById(adminId)).thenReturn(Optional.of(admin)); - when(publicCourseRepository.findByIdIn(Collections.singletonList(101L))).thenReturn( + when(publicCourseRepository.findByIdInWithCourseAndRecords(Collections.singletonList(101L))).thenReturn( Collections.singletonList(othersPublicCourse)); DeletePublicCoursesResponseDto response = publicCourseService.deletePublicCourses(adminId,