From 3b7d75c6e4b10ffed82d7783cdb8878712ebf506 Mon Sep 17 00:00:00 2001 From: "Choi, Minwoo" Date: Mon, 17 Nov 2025 21:07:01 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=97=AC=ED=96=89=20=EB=A6=AC?= =?UTF-8?q?=ED=8F=AC=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=EC=97=90=20Redis=20?= =?UTF-8?q?=EC=BA=90=EC=8B=B1=20=EC=A0=81=EC=9A=A9(#118)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: CacheNameConstants, CacheKeyFactory에 TRIP_REPORTS, TRIP_REPORT를 추가하여 캐시 키 관리 체계화 * refactor: RedisCacheConfig에 TRIP_REPORTS, TRIP_REPORT TTL 전략 추가 * refactor: TripReportFacade 조회 메서드에 @Cacheable 및 등록, 삭제 메서드에 @CacheEvict 적용 * refactor: TripReportFacade 이미지 검증/확정 메서드에 @CacheEvict 적용 * refactor: trips 캐시 키 구조에 'trips' 세그먼트 추가하여 의미 명확화 * refactor: stamps 캐시 키 구조에 'stamps' 세그먼트 추가하여 의미 명확화 * refactor: missions 캐시 키 구조에 'missions' 세그먼트 추가하여 의미 명확화 * refactor: studyLogs 캐시 키 구조에 'studyLogs' 세그먼트 추가하여 의미 명확화 --- .../common/constants/CacheNameConstants.java | 2 ++ .../common/factory/CacheKeyFactory.java | 22 +++++++++++-- .../global/config/RedisCacheConfig.java | 2 ++ .../application/facade/TripReportFacade.java | 31 +++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ject/studytrip/global/common/constants/CacheNameConstants.java b/src/main/java/com/ject/studytrip/global/common/constants/CacheNameConstants.java index 1239510..e7d3bba 100644 --- a/src/main/java/com/ject/studytrip/global/common/constants/CacheNameConstants.java +++ b/src/main/java/com/ject/studytrip/global/common/constants/CacheNameConstants.java @@ -12,4 +12,6 @@ private CacheNameConstants() {} public static final String MISSIONS = "missions"; public static final String DAILY_GOAL = "dailyGoal"; public static final String STUDY_LOGS = "studyLogs"; + public static final String TRIP_REPORT = "tripReport"; + public static final String TRIP_REPORTS = "tripReports"; } diff --git a/src/main/java/com/ject/studytrip/global/common/factory/CacheKeyFactory.java b/src/main/java/com/ject/studytrip/global/common/factory/CacheKeyFactory.java index 18b626a..9051ea6 100644 --- a/src/main/java/com/ject/studytrip/global/common/factory/CacheKeyFactory.java +++ b/src/main/java/com/ject/studytrip/global/common/factory/CacheKeyFactory.java @@ -10,7 +10,7 @@ public static String member(Long memberId) { } public static String trips(Long memberId, int page, int size) { - return "member:" + memberId + ":page:" + page + ":size:" + size; + return "member:" + memberId + ":trips" + ":page:" + page + ":size:" + size; } public static String trip(Long memberId, Long tripId) { @@ -18,7 +18,7 @@ public static String trip(Long memberId, Long tripId) { } public static String stamps(Long memberId, Long tripId) { - return "member:" + memberId + ":trip:" + tripId; + return "member:" + memberId + ":trip:" + tripId + ":stamps"; } public static String stamp(Long memberId, Long tripId, Long stampId) { @@ -26,7 +26,7 @@ public static String stamp(Long memberId, Long tripId, Long stampId) { } public static String missions(Long memberId, Long tripId, Long stampId) { - return "member:" + memberId + ":trip:" + tripId + ":stamp:" + stampId; + return "member:" + memberId + ":trip:" + tripId + ":stamp:" + stampId + ":missions"; } public static String dailyGoal(Long memberId, Long tripId, Long dailyGoalId) { @@ -38,6 +38,7 @@ public static String studyLogs(Long memberId, Long tripId, int page, int size, S + memberId + ":trip:" + tripId + + ":studyLogs" + ":page:" + page + ":size:" @@ -45,4 +46,19 @@ public static String studyLogs(Long memberId, Long tripId, int page, int size, S + ":order:" + order.toLowerCase(); } + + public static String tripReports(Long memberId) { + return "member:" + memberId + ":tripReports"; + } + + public static String tripReport(Long memberId, Long tripReportId, int page, int size) { + return "member:" + + memberId + + ":tripReport:" + + tripReportId + + ":page:" + + page + + ":size:" + + size; + } } diff --git a/src/main/java/com/ject/studytrip/global/config/RedisCacheConfig.java b/src/main/java/com/ject/studytrip/global/config/RedisCacheConfig.java index 076e20e..c856d6c 100644 --- a/src/main/java/com/ject/studytrip/global/config/RedisCacheConfig.java +++ b/src/main/java/com/ject/studytrip/global/config/RedisCacheConfig.java @@ -50,9 +50,11 @@ private Map redisCacheConfigsByName( configs.put(MEMBER, common.entryTtl(Duration.ofMinutes(10))); // 멤버 상세 조회 configs.put(DAILY_GOAL, common.entryTtl(Duration.ofMinutes(10))); // 데일리 목표 상세 조회 configs.put(STUDY_LOGS, common.entryTtl(Duration.ofMinutes(10))); // 학습 로그 목록 조회 + configs.put(TRIP_REPORTS, common.entryTtl(Duration.ofMinutes(10))); // 여행 리포트 목록 조회 configs.put(TRIP, common.entryTtl(Duration.ofMinutes(5))); // 여행 상세 조회 configs.put(STAMP, common.entryTtl(Duration.ofMinutes(5))); // 스탬프 상세 조회 + configs.put(TRIP_REPORT, common.entryTtl(Duration.ofMinutes(5))); // 여행 리포트 상세 조회 configs.put(TRIPS, common.entryTtl(Duration.ofMinutes(3))); // 여행 목록 조회(페이지) configs.put(STAMPS, common.entryTtl(Duration.ofMinutes(3))); // 스탬프 목록 조회 diff --git a/src/main/java/com/ject/studytrip/trip/application/facade/TripReportFacade.java b/src/main/java/com/ject/studytrip/trip/application/facade/TripReportFacade.java index 8d422e9..6ccffa5 100644 --- a/src/main/java/com/ject/studytrip/trip/application/facade/TripReportFacade.java +++ b/src/main/java/com/ject/studytrip/trip/application/facade/TripReportFacade.java @@ -1,5 +1,8 @@ package com.ject.studytrip.trip.application.facade; +import static com.ject.studytrip.global.common.constants.CacheNameConstants.TRIP_REPORT; +import static com.ject.studytrip.global.common.constants.CacheNameConstants.TRIP_REPORTS; + import com.ject.studytrip.image.application.dto.PresignedImageInfo; import com.ject.studytrip.image.application.service.ImageService; import com.ject.studytrip.member.application.service.MemberQueryService; @@ -25,6 +28,9 @@ import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -71,6 +77,10 @@ public TripRetrospectDetail getTripRetrospect(Long memberId, Long tripId, int pa return TripRetrospectDetail.from(summary, tripInfo, studyLogDetailSlice); } + @Cacheable( + cacheNames = TRIP_REPORTS, + key = + "T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReports(#memberId)") @Transactional(readOnly = true) public TripReportsInfo getTripReportsByMember(Long memberId) { Member member = memberQueryService.getValidMember(memberId); @@ -80,6 +90,10 @@ public TripReportsInfo getTripReportsByMember(Long memberId) { return TripReportsInfo.of(tripReports.stream().map(TripReportInfo::from).toList()); } + @Cacheable( + cacheNames = TRIP_REPORT, + key = + "T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReport(#memberId, #tripReportId, #page, #size)") @Transactional(readOnly = true) public TripReportDetail getTripReport(Long memberId, Long tripReportId, int page, int size) { Member member = memberQueryService.getValidMember(memberId); @@ -95,6 +109,10 @@ public TripReportDetail getTripReport(Long memberId, Long tripReportId, int page return TripReportDetail.from(tripReportInfo, studyLogDetailSlice); } + @CacheEvict( + cacheNames = TRIP_REPORTS, + key = + "T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReports(#memberId)") @Transactional public TripReportInfo createTripReport(Long memberId, CreateTripReportRequest request) { Member member = memberQueryService.getValidMember(memberId); @@ -105,6 +123,14 @@ public TripReportInfo createTripReport(Long memberId, CreateTripReportRequest re return TripReportInfo.from(tripReport); } + @Caching( + evict = { + @CacheEvict( + cacheNames = TRIP_REPORTS, + key = + "T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReports(#memberId)"), + @CacheEvict(cacheNames = TRIP_REPORT, allEntries = true) + }) @Transactional public void deleteTripReport(Long memberId, Long tripReportId) { Member member = memberQueryService.getValidMember(memberId); @@ -129,6 +155,11 @@ public PresignedTripReportImageInfo issuePresignedUrl( tripReport.getId(), info.tmpKey(), info.presignedUrl()); } + @Caching( + evict = { + @CacheEvict(cacheNames = TRIP_REPORTS, allEntries = true), + @CacheEvict(cacheNames = TRIP_REPORT, allEntries = true) + }) @Transactional public void confirmImage(Long tripReportId, ConfirmTripReportImageRequest request) { TripReport tripReport = tripReportQueryService.getTripReport(tripReportId);