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
... | ... | @@ -190,7 +190,7 @@ |
| 190 | 190 |
if (bundle.length === 0) {
|
| 191 | 191 |
return ''; |
| 192 | 192 |
} |
| 193 |
- return uploadAttachments(bundle, FILE_MODULE.merchantImage.id); |
|
| 193 |
+ return uploadAttachments(bundle, FILE_MODULE.merchantImages.id); |
|
| 194 | 194 |
} |
| 195 | 195 |
|
| 196 | 196 |
function readDetailValues( |
--- lib/data/repositories/merchant-detail-repository.ts
+++ lib/data/repositories/merchant-detail-repository.ts
... | ... | @@ -268,7 +268,7 @@ |
| 268 | 268 |
atchFileId: values.imageFileId || null, |
| 269 | 269 |
sortOrdr: values.sortOrder, |
| 270 | 270 |
useYn: values.isVisible ? 'Y' : 'N', |
| 271 |
- // 요청 VO에 없어 버려진다(⚠️ 5). 자리가 생기면 그대로 저장된다. |
|
| 271 |
+ // 요청 VO에 없어 버려진다(⚠️ 3). 자리가 생기면 그대로 저장된다. |
|
| 272 | 272 |
voucherUseYn: values.isVoucherUsable ? 'Y' : 'N', |
| 273 | 273 |
}; |
| 274 | 274 |
} |
--- lib/domain/file-module.ts
+++ lib/domain/file-module.ts
... | ... | @@ -2,11 +2,11 @@ |
| 2 | 2 |
* 파일 저장소 모듈 — 업로드 시 `POST /api/v1/common/file/upload/{moduleId}`의 경로 조각이자
|
| 3 | 3 |
* 백엔드 파일 저장 설정(`FileStrgStngVo.strgStngId`)의 키다. |
| 4 | 4 |
* |
| 5 |
- * 값은 백엔드 저장소 설정 표에서 받은 실제 목록이다(사용자 제공, 2026-08-20). |
|
| 5 |
+ * 값은 백엔드 저장소 설정 표(`TB_SYS_FILE_STRG_STNG`)에서 받은 실제 목록이다(사용자 제공, 2026-08-20). |
|
| 6 | 6 |
* |
| 7 |
- * 이슈: 설정에 없는 값을 보내도 업로드가 실패하지 않는다. 백엔드가 설정을 못 찾으면 기본 |
|
| 8 |
- * 저장소로 폴백해 조용히 다른 곳에 저장한다(`EgovFileMngUtil.parseFileInf`). 그래서 여기 없는 |
|
| 9 |
- * 문자열을 손으로 적지 않는다. |
|
| 7 |
+ * 이슈: 설정에 없는 값을 보내면 500이 난다. 코드상으론 기본 저장소(`FILE_STORAGE`)로 폴백하지만 |
|
| 8 |
+ * (`EgovFileMngUtil.parseFileInf`) dev DB에 그 행이 없어 거기서 터진다(2026-09-14 확인). 그래서 |
|
| 9 |
+ * 여기 없는 문자열을 손으로 적지 않는다. |
|
| 10 | 10 |
*/ |
| 11 | 11 |
|
| 12 | 12 |
export type FileModule = {
|
... | ... | @@ -61,16 +61,22 @@ |
| 61 | 61 |
extensions: ['jpg', 'png', 'gif', 'svg'], |
| 62 | 62 |
}, |
| 63 | 63 |
/** |
| 64 |
- * 가맹점 상세·메뉴 이미지. |
|
| 64 |
+ * 가맹몰 대표 이미지·메뉴 이미지(한 장). |
|
| 65 | 65 |
* |
| 66 |
- * TODO(백엔드): 저장소 설정 표에 바우처용 모듈이 없다. 없는 ID를 보내면 기본 저장소로 |
|
| 67 |
- * 폴백해 동작은 하므로 잠정 이름을 두고 시작한다(사용자 확정) — 백엔드가 이 이름으로 |
|
| 68 |
- * 등록하면 손댈 것이 없고, 다른 이름이면 여기 한 줄만 바꾼다. |
|
| 66 |
+ * TODO(백엔드): 저장소 설정 표에 바우처용 행이 없다. 잠정 이름 `MODULE_VOUCHER`로 보냈더니 |
|
| 67 |
+ * 기본 저장소 폴백까지 실패해 500이 났다(2026-09-14 dev). 그래서 콘텐츠 섬네일 저장소를 |
|
| 68 |
+ * 빌려 쓴다 — 바우처 행이 생기면 여기와 `merchantImages`만 바꾼다. |
|
| 69 | 69 |
*/ |
| 70 | 70 |
merchantImage: {
|
| 71 |
- id: 'MODULE_VOUCHER', |
|
| 72 |
- description: '가맹점 이미지 저장소(잠정)', |
|
| 73 |
- extensions: ['jpg', 'jpeg', 'png'], |
|
| 71 |
+ id: 'MODULE_CONTENT_THUMB', |
|
| 72 |
+ description: '가맹몰 대표·메뉴 이미지 — 콘텐츠 섬네일 저장소를 임시로 빌려 씀', |
|
| 73 |
+ extensions: IMAGE, |
|
| 74 |
+ }, |
|
| 75 |
+ /** 가맹몰 추가 이미지 묶음(여러 장). 여러 장 업로드가 확인된 곳이 4컷만화 저장소뿐이라 빌려 쓴다. */ |
|
| 76 |
+ merchantImages: {
|
|
| 77 |
+ id: 'MODULE_TOON_CONTENT', |
|
| 78 |
+ description: '가맹몰 추가 이미지 묶음 — 4컷만화 저장소를 임시로 빌려 씀', |
|
| 79 |
+ extensions: IMAGE, |
|
| 74 | 80 |
}, |
| 75 | 81 |
menuIcon: {
|
| 76 | 82 |
id: 'MODULE_MENU_ICON', |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?