임동욱 임동욱 09-14
fix: 가맹몰 이미지 업로드가 500이 나던 잠정 저장소 ID를 기존 저장소로 바꾼다
dev 로그로 확인 — POST /common/file/upload/MODULE_VOUCHER(·/list)가 68~95KB PNG에도
500을 돌려줘 상세 등록이 막혔다. 저장소 설정 표에 바우처 행이 없고 코드상 기본 저장소
(FILE_STORAGE) 폴백도 dev DB에 행이 없어 거기서 터진다. 한 장은 콘텐츠 섬네일
저장소(MODULE_CONTENT_THUMB), 여러 장 묶음은 4컷만화 저장소(MODULE_TOON_CONTENT)를
빌려 쓴다 — 바우처 행이 생기면 file-module.ts의 두 ID만 바꾼다.

Co-Authored-By: Claude Opus 5 
@48ee3154977779164f8922d552552b707d72a791
app/(protected)/(basic)/system/merchant-details/_actions.ts
--- app/(protected)/(basic)/system/merchant-details/_actions.ts
+++ app/(protected)/(basic)/system/merchant-details/_actions.ts
@@ -190,7 +190,7 @@
   if (bundle.length === 0) {
     return '';
   }
-  return uploadAttachments(bundle, FILE_MODULE.merchantImage.id);
+  return uploadAttachments(bundle, FILE_MODULE.merchantImages.id);
 }
 
 function readDetailValues(
lib/data/repositories/merchant-detail-repository.ts
--- lib/data/repositories/merchant-detail-repository.ts
+++ lib/data/repositories/merchant-detail-repository.ts
@@ -268,7 +268,7 @@
     atchFileId: values.imageFileId || null,
     sortOrdr: values.sortOrder,
     useYn: values.isVisible ? 'Y' : 'N',
-    // 요청 VO에 없어 버려진다(⚠️ 5). 자리가 생기면 그대로 저장된다.
+    // 요청 VO에 없어 버려진다(⚠️ 3). 자리가 생기면 그대로 저장된다.
     voucherUseYn: values.isVoucherUsable ? 'Y' : 'N',
   };
 }
lib/domain/file-module.ts
--- lib/domain/file-module.ts
+++ lib/domain/file-module.ts
@@ -2,11 +2,11 @@
  * 파일 저장소 모듈 — 업로드 시 `POST /api/v1/common/file/upload/{moduleId}`의 경로 조각이자
  * 백엔드 파일 저장 설정(`FileStrgStngVo.strgStngId`)의 키다.
  *
- * 값은 백엔드 저장소 설정 표에서 받은 실제 목록이다(사용자 제공, 2026-08-20).
+ * 값은 백엔드 저장소 설정 표(`TB_SYS_FILE_STRG_STNG`)에서 받은 실제 목록이다(사용자 제공, 2026-08-20).
  *
- * 이슈: 설정에 없는 값을 보내도 업로드가 실패하지 않는다. 백엔드가 설정을 못 찾으면 기본
- *   저장소로 폴백해 조용히 다른 곳에 저장한다(`EgovFileMngUtil.parseFileInf`). 그래서 여기 없는
- *   문자열을 손으로 적지 않는다.
+ * 이슈: 설정에 없는 값을 보내면 500이 난다. 코드상으론 기본 저장소(`FILE_STORAGE`)로 폴백하지만
+ *   (`EgovFileMngUtil.parseFileInf`) dev DB에 그 행이 없어 거기서 터진다(2026-09-14 확인). 그래서
+ *   여기 없는 문자열을 손으로 적지 않는다.
  */
 
 export type FileModule = {
@@ -61,16 +61,22 @@
     extensions: ['jpg', 'png', 'gif', 'svg'],
   },
   /**
-   * 가맹점 상세·메뉴 이미지.
+   * 가맹몰 대표 이미지·메뉴 이미지(한 장).
    *
-   * TODO(백엔드): 저장소 설정 표에 바우처용 모듈이 없다. 없는 ID를 보내면 기본 저장소로
-   *   폴백해 동작은 하므로 잠정 이름을 두고 시작한다(사용자 확정) — 백엔드가 이 이름으로
-   *   등록하면 손댈 것이 없고, 다른 이름이면 여기 한 줄만 바꾼다.
+   * TODO(백엔드): 저장소 설정 표에 바우처용 행이 없다. 잠정 이름 `MODULE_VOUCHER`로 보냈더니
+   *   기본 저장소 폴백까지 실패해 500이 났다(2026-09-14 dev). 그래서 콘텐츠 섬네일 저장소를
+   *   빌려 쓴다 — 바우처 행이 생기면 여기와 `merchantImages`만 바꾼다.
    */
   merchantImage: {
-    id: 'MODULE_VOUCHER',
-    description: '가맹점 이미지 저장소(잠정)',
-    extensions: ['jpg', 'jpeg', 'png'],
+    id: 'MODULE_CONTENT_THUMB',
+    description: '가맹몰 대표·메뉴 이미지 — 콘텐츠 섬네일 저장소를 임시로 빌려 씀',
+    extensions: IMAGE,
+  },
+  /** 가맹몰 추가 이미지 묶음(여러 장). 여러 장 업로드가 확인된 곳이 4컷만화 저장소뿐이라 빌려 쓴다. */
+  merchantImages: {
+    id: 'MODULE_TOON_CONTENT',
+    description: '가맹몰 추가 이미지 묶음 — 4컷만화 저장소를 임시로 빌려 씀',
+    extensions: IMAGE,
   },
   menuIcon: {
     id: 'MODULE_MENU_ICON',
Add a comment
List