Skip to content

Commit 3de9eae

Browse files
refactor: 여행 리포트 기능에 Redis 캐싱 적용(#118)
* 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' 세그먼트 추가하여 의미 명확화
1 parent 32cd5a9 commit 3de9eae

4 files changed

Lines changed: 54 additions & 3 deletions

File tree

src/main/java/com/ject/studytrip/global/common/constants/CacheNameConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ private CacheNameConstants() {}
1212
public static final String MISSIONS = "missions";
1313
public static final String DAILY_GOAL = "dailyGoal";
1414
public static final String STUDY_LOGS = "studyLogs";
15+
public static final String TRIP_REPORT = "tripReport";
16+
public static final String TRIP_REPORTS = "tripReports";
1517
}

src/main/java/com/ject/studytrip/global/common/factory/CacheKeyFactory.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,23 @@ public static String member(Long memberId) {
1010
}
1111

1212
public static String trips(Long memberId, int page, int size) {
13-
return "member:" + memberId + ":page:" + page + ":size:" + size;
13+
return "member:" + memberId + ":trips" + ":page:" + page + ":size:" + size;
1414
}
1515

1616
public static String trip(Long memberId, Long tripId) {
1717
return "member:" + memberId + ":trip:" + tripId;
1818
}
1919

2020
public static String stamps(Long memberId, Long tripId) {
21-
return "member:" + memberId + ":trip:" + tripId;
21+
return "member:" + memberId + ":trip:" + tripId + ":stamps";
2222
}
2323

2424
public static String stamp(Long memberId, Long tripId, Long stampId) {
2525
return "member:" + memberId + ":trip:" + tripId + ":stamp:" + stampId;
2626
}
2727

2828
public static String missions(Long memberId, Long tripId, Long stampId) {
29-
return "member:" + memberId + ":trip:" + tripId + ":stamp:" + stampId;
29+
return "member:" + memberId + ":trip:" + tripId + ":stamp:" + stampId + ":missions";
3030
}
3131

3232
public static String dailyGoal(Long memberId, Long tripId, Long dailyGoalId) {
@@ -38,11 +38,27 @@ public static String studyLogs(Long memberId, Long tripId, int page, int size, S
3838
+ memberId
3939
+ ":trip:"
4040
+ tripId
41+
+ ":studyLogs"
4142
+ ":page:"
4243
+ page
4344
+ ":size:"
4445
+ size
4546
+ ":order:"
4647
+ order.toLowerCase();
4748
}
49+
50+
public static String tripReports(Long memberId) {
51+
return "member:" + memberId + ":tripReports";
52+
}
53+
54+
public static String tripReport(Long memberId, Long tripReportId, int page, int size) {
55+
return "member:"
56+
+ memberId
57+
+ ":tripReport:"
58+
+ tripReportId
59+
+ ":page:"
60+
+ page
61+
+ ":size:"
62+
+ size;
63+
}
4864
}

src/main/java/com/ject/studytrip/global/config/RedisCacheConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ private Map<String, RedisCacheConfiguration> redisCacheConfigsByName(
5050
configs.put(MEMBER, common.entryTtl(Duration.ofMinutes(10))); // 멤버 상세 조회
5151
configs.put(DAILY_GOAL, common.entryTtl(Duration.ofMinutes(10))); // 데일리 목표 상세 조회
5252
configs.put(STUDY_LOGS, common.entryTtl(Duration.ofMinutes(10))); // 학습 로그 목록 조회
53+
configs.put(TRIP_REPORTS, common.entryTtl(Duration.ofMinutes(10))); // 여행 리포트 목록 조회
5354

5455
configs.put(TRIP, common.entryTtl(Duration.ofMinutes(5))); // 여행 상세 조회
5556
configs.put(STAMP, common.entryTtl(Duration.ofMinutes(5))); // 스탬프 상세 조회
57+
configs.put(TRIP_REPORT, common.entryTtl(Duration.ofMinutes(5))); // 여행 리포트 상세 조회
5658

5759
configs.put(TRIPS, common.entryTtl(Duration.ofMinutes(3))); // 여행 목록 조회(페이지)
5860
configs.put(STAMPS, common.entryTtl(Duration.ofMinutes(3))); // 스탬프 목록 조회

src/main/java/com/ject/studytrip/trip/application/facade/TripReportFacade.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.ject.studytrip.trip.application.facade;
22

3+
import static com.ject.studytrip.global.common.constants.CacheNameConstants.TRIP_REPORT;
4+
import static com.ject.studytrip.global.common.constants.CacheNameConstants.TRIP_REPORTS;
5+
36
import com.ject.studytrip.image.application.dto.PresignedImageInfo;
47
import com.ject.studytrip.image.application.service.ImageService;
58
import com.ject.studytrip.member.application.service.MemberQueryService;
@@ -25,6 +28,9 @@
2528
import java.util.List;
2629
import java.util.Map;
2730
import lombok.RequiredArgsConstructor;
31+
import org.springframework.cache.annotation.CacheEvict;
32+
import org.springframework.cache.annotation.Cacheable;
33+
import org.springframework.cache.annotation.Caching;
2834
import org.springframework.data.domain.Slice;
2935
import org.springframework.stereotype.Component;
3036
import org.springframework.transaction.annotation.Transactional;
@@ -71,6 +77,10 @@ public TripRetrospectDetail getTripRetrospect(Long memberId, Long tripId, int pa
7177
return TripRetrospectDetail.from(summary, tripInfo, studyLogDetailSlice);
7278
}
7379

80+
@Cacheable(
81+
cacheNames = TRIP_REPORTS,
82+
key =
83+
"T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReports(#memberId)")
7484
@Transactional(readOnly = true)
7585
public TripReportsInfo getTripReportsByMember(Long memberId) {
7686
Member member = memberQueryService.getValidMember(memberId);
@@ -80,6 +90,10 @@ public TripReportsInfo getTripReportsByMember(Long memberId) {
8090
return TripReportsInfo.of(tripReports.stream().map(TripReportInfo::from).toList());
8191
}
8292

93+
@Cacheable(
94+
cacheNames = TRIP_REPORT,
95+
key =
96+
"T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReport(#memberId, #tripReportId, #page, #size)")
8397
@Transactional(readOnly = true)
8498
public TripReportDetail getTripReport(Long memberId, Long tripReportId, int page, int size) {
8599
Member member = memberQueryService.getValidMember(memberId);
@@ -95,6 +109,10 @@ public TripReportDetail getTripReport(Long memberId, Long tripReportId, int page
95109
return TripReportDetail.from(tripReportInfo, studyLogDetailSlice);
96110
}
97111

112+
@CacheEvict(
113+
cacheNames = TRIP_REPORTS,
114+
key =
115+
"T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReports(#memberId)")
98116
@Transactional
99117
public TripReportInfo createTripReport(Long memberId, CreateTripReportRequest request) {
100118
Member member = memberQueryService.getValidMember(memberId);
@@ -105,6 +123,14 @@ public TripReportInfo createTripReport(Long memberId, CreateTripReportRequest re
105123
return TripReportInfo.from(tripReport);
106124
}
107125

126+
@Caching(
127+
evict = {
128+
@CacheEvict(
129+
cacheNames = TRIP_REPORTS,
130+
key =
131+
"T(com.ject.studytrip.global.common.factory.CacheKeyFactory).tripReports(#memberId)"),
132+
@CacheEvict(cacheNames = TRIP_REPORT, allEntries = true)
133+
})
108134
@Transactional
109135
public void deleteTripReport(Long memberId, Long tripReportId) {
110136
Member member = memberQueryService.getValidMember(memberId);
@@ -129,6 +155,11 @@ public PresignedTripReportImageInfo issuePresignedUrl(
129155
tripReport.getId(), info.tmpKey(), info.presignedUrl());
130156
}
131157

158+
@Caching(
159+
evict = {
160+
@CacheEvict(cacheNames = TRIP_REPORTS, allEntries = true),
161+
@CacheEvict(cacheNames = TRIP_REPORT, allEntries = true)
162+
})
132163
@Transactional
133164
public void confirmImage(Long tripReportId, ConfirmTripReportImageRequest request) {
134165
TripReport tripReport = tripReportQueryService.getTripReport(tripReportId);

0 commit comments

Comments
 (0)