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 9b2d934..1a38091 100644 --- a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java +++ b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java @@ -14,7 +14,6 @@ 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; @@ -44,17 +43,23 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + @Service @RequiredArgsConstructor public class PublicCourseService { private static final Integer PAGE_SIZE = 10; private static List MARATHON_PUBLIC_COURSE_IDS; + private static final Long ADMIN_USER_ID = 280L; private final PublicCourseRepository publicCourseRepository; private final UserRepository userRepository; private final ScrapRepository scrapRepository; private final CourseRepository courseRepository; - private final RecordRepository recordRepository; + + @PersistenceContext + private EntityManager entityManager; @Value("${runnect.marathon-public-course-id}") @@ -352,7 +357,7 @@ public DeletePublicCoursesResponseDto deletePublicCourses( throw new NotFoundException(ErrorStatus.NOT_FOUND_PUBLICCOURSE_EXCEPTION, ErrorStatus.NOT_FOUND_PUBLICCOURSE_EXCEPTION.getMessage()); } - boolean isAdmin = userId.equals(280L); + boolean isAdmin = userId.equals(ADMIN_USER_ID); publicCourses.stream() .filter(pc -> !isAdmin && !pc.getCourse().getRunnectUser().equals(user)) @@ -363,15 +368,18 @@ public DeletePublicCoursesResponseDto deletePublicCourses( ErrorStatus.PERMISSION_DENIED_PUBLIC_COURSE_DELETE_EXCEPTION.getMessage()); }); - //삭제전 연관된 스크랩 먼저 삭제 - scrapRepository.deleteByPublicCourseIn(publicCourses); - - //삭제전 연관된 Record의 publicCourse FK null 처리 - recordRepository.nullifyPublicCourseIn(publicCourses); - //삭제전 course의 isPrivate update publicCourses.forEach(publicCourse -> publicCourse.getCourse().retrieveCourse()); + // Record의 publicCourse FK를 null로 설정 (Record 테이블 FK 제약조건 해제) + entityManager.createQuery( + "UPDATE Record r SET r.publicCourse = null WHERE r.publicCourse IN :publicCourses") + .setParameter("publicCourses", publicCourses) + .executeUpdate(); + + // Scrap 삭제 (Scrap 테이블 FK NOT NULL 제약조건) + scrapRepository.deleteByPublicCourseIn(publicCourses); + publicCourseRepository.deleteAllInBatch(publicCourses); return DeletePublicCoursesResponseDto.from(publicCourses.size()); 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 5d09675..fe2c80f 100644 --- a/src/main/java/org/runnect/server/record/repository/RecordRepository.java +++ b/src/main/java/org/runnect/server/record/repository/RecordRepository.java @@ -1,10 +1,8 @@ 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; @@ -31,8 +29,4 @@ 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); }