diff --git a/src/main/java/org/runnect/server/course/service/CourseService.java b/src/main/java/org/runnect/server/course/service/CourseService.java index 9a485c9..7bfd3e0 100644 --- a/src/main/java/org/runnect/server/course/service/CourseService.java +++ b/src/main/java/org/runnect/server/course/service/CourseService.java @@ -27,6 +27,7 @@ import org.runnect.server.user.exception.userException.NotFoundUserException; import org.runnect.server.user.repository.UserRepository; import org.runnect.server.user.service.UserStampService; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -136,6 +137,9 @@ public UpdateCourseResponseDto updateCourse(Long userId, Long courseId, String t return UpdateCourseResponseDto.of(course); } + // 조건부로 공개 코스가 같이 삭제될 수 있어(비공개 코스면 스킵), 매번 무효화해도 + // 안전한 쪽(과다 무효화)을 택함 — 공개 코스 목록 캐시(전체페이지수/마라톤/추천) 대상 + @CacheEvict(value = {"publicCourseTotalPageCount", "marathonPublicCourse", "recommendPublicCourse"}, allEntries = true) @Transactional public DeleteCoursesResponseDto deleteCourses(List courseIdList, Long userId) { courseIdList.forEach(courseId -> { 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 9d6956a..5a757fd 100644 --- a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java +++ b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java @@ -38,6 +38,7 @@ import org.runnect.server.user.exception.userException.NotFoundUserException; import org.runnect.server.user.repository.UserRepository; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -300,6 +301,9 @@ public GetPublicCourseDetailResponseDto getPublicCourseDetail(final Long userId, } + // 코스 목록에 영향을 주는 쓰기 작업이라, 작성자 본인 캐시만이 아니라 + // 전체 유저가 보는 목록 캐시(전체페이지수/마라톤/추천)를 다 지워야 함 + @CacheEvict(value = {"publicCourseTotalPageCount", "marathonPublicCourse", "recommendPublicCourse"}, allEntries = true) @Transactional public CreatePublicCourseResponseDto createPublicCourse( final Long userId, @@ -344,6 +348,7 @@ public CreatePublicCourseResponseDto createPublicCourse( } + @CacheEvict(value = {"publicCourseTotalPageCount", "marathonPublicCourse", "recommendPublicCourse"}, allEntries = true) @Transactional public DeletePublicCoursesResponseDto deletePublicCourses( Long userId, @@ -389,6 +394,8 @@ public DeletePublicCoursesResponseDto deletePublicCourses( return DeletePublicCoursesResponseDto.from(publicCourses.size()); } + // 제목/설명만 바뀌고 코스 개수는 그대로라 전체페이지수 캐시는 지울 필요 없음 + @CacheEvict(value = {"marathonPublicCourse", "recommendPublicCourse"}, allEntries = true) @Transactional public UpdatePublicCourseResponseDto updatePublicCourse(Long userId, Long publicCourseId, String title, String description) { PublicCourse publicCourse = publicCourseRepository.findById(publicCourseId)