From da7a7ce2f801811edcc25f27eac0ca726adc3b8b Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Thu, 19 Feb 2026 21:51:59 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EA=B3=B5=EA=B0=9C=20=EC=BD=94=EC=8A=A4?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20Record=20FK=20null=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RecordRepository에 @Modifying @Query로 벌크 UPDATE 메서드 추가 (nullifyPublicCourseIn) - PublicCourseService.deletePublicCourses()에서 PublicCourse 삭제 전 Record.publicCourse를 null로 업데이트 - 삭제 순서: 스크랩 삭제 → Record FK null → isPrivate 업데이트 → PublicCourse 삭제 --- .../server/publicCourse/service/PublicCourseService.java | 5 +++++ .../runnect/server/record/repository/RecordRepository.java | 6 ++++++ 2 files changed, 11 insertions(+) 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 d96199f..9b2d934 100644 --- a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java +++ b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java @@ -14,6 +14,7 @@ import org.runnect.server.common.module.convert.CoordinatePathConverter; import org.runnect.server.course.entity.Course; import org.runnect.server.course.repository.CourseRepository; +import org.runnect.server.record.repository.RecordRepository; import org.runnect.server.publicCourse.dto.request.CreatePublicCourseRequestDto; import org.runnect.server.publicCourse.dto.request.DeletePublicCoursesRequestDto; import org.runnect.server.publicCourse.dto.response.CreatePublicCourseResponseDto; @@ -53,6 +54,7 @@ public class PublicCourseService { private final UserRepository userRepository; private final ScrapRepository scrapRepository; private final CourseRepository courseRepository; + private final RecordRepository recordRepository; @Value("${runnect.marathon-public-course-id}") @@ -364,6 +366,9 @@ public DeletePublicCoursesResponseDto deletePublicCourses( //삭제전 연관된 스크랩 먼저 삭제 scrapRepository.deleteByPublicCourseIn(publicCourses); + //삭제전 연관된 Record의 publicCourse FK null 처리 + recordRepository.nullifyPublicCourseIn(publicCourses); + //삭제전 course의 isPrivate update publicCourses.forEach(publicCourse -> publicCourse.getCourse().retrieveCourse()); diff --git a/src/main/java/org/runnect/server/record/repository/RecordRepository.java b/src/main/java/org/runnect/server/record/repository/RecordRepository.java index fe2c80f..5d09675 100644 --- a/src/main/java/org/runnect/server/record/repository/RecordRepository.java +++ b/src/main/java/org/runnect/server/record/repository/RecordRepository.java @@ -1,8 +1,10 @@ package org.runnect.server.record.repository; import java.util.Collection; +import org.runnect.server.publicCourse.entity.PublicCourse; import org.runnect.server.record.entity.Record; import org.runnect.server.user.entity.RunnectUser; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.springframework.data.repository.query.Param; @@ -29,4 +31,8 @@ public interface RecordRepository extends Repository { // DELETE long deleteByIdIn(Collection ids); + + @Modifying + @Query("UPDATE Record r SET r.publicCourse = null WHERE r.publicCourse IN :publicCourses") + int nullifyPublicCourseIn(@Param("publicCourses") Collection publicCourses); }