Skip to content

Commit 62a7295

Browse files
committed
fix: 동적 데이터(가격, 스케쥴, 평점)의 캐시 재사용 최적화
1 parent 9d90479 commit 62a7295

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

src/app/activities/[activityId]/ActivityClientPage.tsx

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use client';
22
import { useState, useEffect, useMemo } from 'react';
3-
import { useSuspenseQuery } from '@tanstack/react-query';
3+
import { useSuspenseQuery, useQueryClient } from '@tanstack/react-query';
44
import { getActivityDetail } from '@/app/api/activities';
5+
import type { ActivityDetail } from '@/types/activities.type';
56
import { useRecentViewedStore } from '@/store/recentlyWatched';
67
import ActivityImageViewer from '@/components/pages/activities/ActivityImageViewer';
78
import ActivityInfo from '@/components/pages/activities/ActivityInfo';
@@ -29,6 +30,7 @@ interface ActivityClientProps {
2930
export default function ActivityClient({ activityId, blurImage }: ActivityClientProps) {
3031
const [isOwner, setIsOwner] = useState<boolean>(false);
3132
const { user } = useUserStore();
33+
const queryClient = useQueryClient();
3234

3335
// Intersection Observer for performance optimization
3436
const [mapRef, isMapVisible] = useIntersectionObserver({
@@ -56,11 +58,31 @@ export default function ActivityClient({ activityId, blurImage }: ActivityClient
5658
gcTime: 60 * 60 * 1000, // 1시간 메모리 보관
5759
});
5860

59-
// 2. 동적 데이터 (가격, 스케줄, 평점) - 짧은 캐시
61+
// 2. 동적 데이터 (가격, 스케줄, 평점) - 짧은 캐시, 캐시 재사용 최적화
6062
const { data: dynamicInfo } = useSuspenseQuery({
6163
queryKey: [...activityQueryKeys.detail(activityId), 'dynamic'],
62-
queryFn: () => getActivityDetail(Number(activityId)),
63-
select: (data) => ({
64+
queryFn: (): Promise<ActivityDetail> => {
65+
// 캐시된 데이터가 있으면 재사용, 없으면 새로 호출
66+
const cachedData = queryClient.getQueryData<ActivityDetail>([
67+
...activityQueryKeys.detail(activityId),
68+
'static',
69+
]);
70+
const cachedState = queryClient.getQueryState([
71+
...activityQueryKeys.detail(activityId),
72+
'static',
73+
]);
74+
75+
// static 캐시가 fresh하면(2분 이내) 재사용
76+
if (
77+
cachedData &&
78+
cachedState?.dataUpdatedAt &&
79+
Date.now() - cachedState.dataUpdatedAt < 2 * 60 * 1000
80+
) {
81+
return Promise.resolve(cachedData); // 캐시 재사용
82+
}
83+
return getActivityDetail(Number(activityId)); // 새 호출
84+
},
85+
select: (data: ActivityDetail) => ({
6486
price: data.price,
6587
schedules: data.schedules,
6688
rating: data.rating,

0 commit comments

Comments
 (0)