From 9e3a71e156f0a0d6386f69e3f9de60d85c5ecf93 Mon Sep 17 00:00:00 2001 From: caadiq Date: Wed, 1 Apr 2026 14:31:40 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=82=AC=EC=A7=84/=ED=8B=B0=EC=A0=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=C2=B7=EC=82=AD=EC=A0=9C=20=EC=8B=9C?= =?UTF-8?q?=20=EC=95=A8=EB=B2=94=20=EC=BA=90=EC=8B=9C=20=EB=AC=B4=ED=9A=A8?= =?UTF-8?q?=ED=99=94=20=EB=88=84=EB=9D=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit photos.js, teasers.js에서 invalidateAlbumCache 호출 추가. 앨범 생성 후 사진/티저 추가 시 캐시된 빈 데이터가 반환되던 문제 해결. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/src/routes/albums/photos.js | 9 ++++++++- backend/src/routes/albums/teasers.js | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/src/routes/albums/photos.js b/backend/src/routes/albums/photos.js index 2da6b74..c87d7d0 100644 --- a/backend/src/routes/albums/photos.js +++ b/backend/src/routes/albums/photos.js @@ -3,6 +3,7 @@ import { deleteAlbumPhoto, uploadAlbumVideo, } from '../../services/image.js'; +import { invalidateAlbumCache } from '../../services/album.js'; import { withTransaction } from '../../utils/transaction.js'; import { notFound } from '../../utils/error.js'; import { logActivity } from '../../utils/log.js'; @@ -12,7 +13,7 @@ import { logActivity } from '../../utils/log.js'; * GET: 공개, POST/DELETE: 인증 필요 */ export default async function photosRoutes(fastify) { - const { db } = fastify; + const { db, redis } = fastify; /** * GET /api/albums/:albumId/photos @@ -196,6 +197,9 @@ export default async function photosRoutes(fastify) { await connection.commit(); + // 앨범 캐시 무효화 + await invalidateAlbumCache(redis, parseInt(albumId)); + logActivity(db, { actor: 'admin', action: 'upload', category: 'album', targetType: 'photo', targetId: parseInt(albumId), summary: `사진 업로드: ${uploadedPhotos.length}장 (앨범 ${albumId})` }); reply.raw.write(`data: ${JSON.stringify({ @@ -248,6 +252,9 @@ export default async function photosRoutes(fastify) { await connection.query('DELETE FROM album_photo_members WHERE photo_id = ?', [photoId]); await connection.query('DELETE FROM album_photos WHERE id = ?', [photoId]); + // 앨범 캐시 무효화 + await invalidateAlbumCache(redis, parseInt(albumId)); + logActivity(db, { actor: 'admin', action: 'delete', category: 'album', targetType: 'photo', targetId: parseInt(photoId), summary: `사진 삭제: 앨범 ${albumId}` }); return { message: '사진이 삭제되었습니다.' }; }); diff --git a/backend/src/routes/albums/teasers.js b/backend/src/routes/albums/teasers.js index e7f4f34..e1160a2 100644 --- a/backend/src/routes/albums/teasers.js +++ b/backend/src/routes/albums/teasers.js @@ -2,6 +2,7 @@ import { deleteAlbumPhoto, deleteAlbumVideo, } from '../../services/image.js'; +import { invalidateAlbumCache } from '../../services/album.js'; import { withTransaction } from '../../utils/transaction.js'; import { notFound } from '../../utils/error.js'; import { logActivity } from '../../utils/log.js'; @@ -11,7 +12,7 @@ import { logActivity } from '../../utils/log.js'; * GET: 공개, DELETE: 인증 필요 */ export default async function teasersRoutes(fastify) { - const { db } = fastify; + const { db, redis } = fastify; /** * GET /api/albums/:albumId/teasers @@ -79,6 +80,8 @@ export default async function teasersRoutes(fastify) { await connection.query('DELETE FROM album_teasers WHERE id = ?', [teaserId]); + await invalidateAlbumCache(redis, parseInt(albumId)); + logActivity(db, { actor: 'admin', action: 'delete', category: 'album', targetType: 'teaser', targetId: parseInt(teaserId), summary: `티저 삭제: 앨범 ${albumId}` }); return { message: '티저가 삭제되었습니다.' }; });