저장된 장을 다시 올릴 때 이름을 MIME(image/jpeg;charset=UTF-8)에서 그대로 만들어 확장자가
'jpeg;charset=utf-8'이 됐고, 백엔드가 이름의 확장자로 허용 여부를 가려(EgovFileMngUtil.
checkAllowFileExtension) 거절했다(dev 로그 #585). 묶음 파일 목록의 원본 이름·확장자를 쓰고
없으면 MIME 매개변수를 뗀다. 덧붙이기 저장 뒤 화면이 옛 칸을 유지하던 것도 장수를 key에
넣어 다시 마운트한다.
Co-Authored-By: Claude Fable 5.1
업종 선택지는 FRCS_TPBIZ_CD(2자리)만 — 4자리 FRCS_CD는 업종+업태를 이어 붙인 표시용이라 저장값이
아니다. 연락처는 BizPlay 행처럼 숫자만 보낸다. 백엔드가 BizPlay 위임을 끊고 TB_COM_VOUCHER에
직접 넣게 된 것과 수정 VO에 frcsNo가 빠진 결함을 문서에 적는다.
Co-Authored-By: Claude Fable 5.1
- 상단 업체명 검색이 안 됐다 — 목록 컨테이너의 검색 상자는 onQueryChange로만 알리는데 링크만
넘기고 있었다. 백엔드 조건(searchFrcsNm)은 있으나 목록을 합쳐 프론트에서 거르므로 그대로 쓴다.
- 상세가 없는 행의 [비활성]·[삭제]를 잠근다.
- 메뉴 설명의 줄바꿈을 표에서 살린다(pre-line, 3줄 뒤 말줄임).
- 단건 조회가 업체명 대신 코드를 줄 때 가맹점 목록에서 채우는 것을 Repository로 옮겨 메뉴
등록·수정 화면의 「대상 업체」에도 이름이 나온다.
Co-Authored-By: Claude Fable 5.1
가맹몰 관리 — [등록] 버튼과 수정 모달을 활성화해 백엔드 VO(MngrVocInsertReqVo/UpdateReqVo)
대로 JSON으로 보낸다. 예금주·입금은행(COM_BANK_CD)·계좌·업태(FRCS_BZSTAT_CD)·구분(FRCS_DV_CD)
항목을 더하고 주소·우편번호도 직접 고칠 수 있다. 백엔드는 아직 BizPlay(웹캐시) 위임이고
우리 DB 저장으로 바뀔 예정(사용자 공지)이라 응답의 가맹점 코드는 어느 모양이든 읽고, 없으면
목록에서 이름·연락처로 찾는다.
가맹몰 상세 — 업체명·연락처·우편번호([주소 검색])·주소·상세주소를 읽기 전용에서 입력으로
바꾼다(사용자 확정). 저장하면 가맹점을 만들거나(코드 없음) 바뀐 값만 고친(코드 있음) 뒤 상세를
붙인다. 가맹점 선택 화면은 빈 등록 폼으로 바뀐다. 우편번호 검색 도우미는 두 화면이 쓰므로
app/_components/postcode.ts로 옮긴다.
Co-Authored-By: Claude Fable 5.1
백엔드 1c7b0e0 — GET /common/file/image/list/{atchFileId}가 생겨 이미지 존재를 더듬던 코드
(HEAD 401·fetch 취소 멈춤·빈 200을 거치며 세 번 고친 것)를 전부 걷어낸다. 상세 목록·단건이
메뉴 건수(productCnt)를 주고 카테고리 코드표 INNER JOIN이 빠졌으며, 가맹점 목록은 등록일
(frstRegDtStr)을 준다.
Co-Authored-By: Claude Fable 5.1
백엔드 40f85c4 — 묶음 업로드가 atchFileId를 받으면 그 묶음 뒤에 새 장만 덧붙인다. 저장된 장이
앞에 그대로 있고 새 장이 뒤에만 붙는 저장은 이 경로로 보내 저장된 장을 다시 읽지 않는다
(파일이 다른 서버에 있어도 됨). 순서 변경·삭제는 전처럼 통째로 다시 올린다. 앱 API가
frcsBadge의 쉼표 코드를 FRCS_BADGE_CD 이름으로 풀므로 배지 선택지·표시·검증도 그 코드표로
바꾼다(하드코딩 BEST/MAIN/NEW/SALE 제거).
Co-Authored-By: Claude Fable 5.1
단건 조회가 상세 없음을 NOT_FOUND 대신 성공 봉투의 null로 주는 것, 삭제된 상세를
selectOne이 그대로 돌려주는 결함(재등록 409·수정 화면에 삭제값 노출), 프론트가 쓰지 않게
된 건수 쿼리 문제를 문서에 맞춘다. 등록 409는 삭제 잔존 안내 문구로 바꾼다.
Co-Authored-By: Claude Fable 5.1
이미지 파일은 서버 디스크에만 있고 DB 행은 공유되므로, dev에서 올린 이미지를 로컬 백엔드로
붙어 다시 읽으면 200에 빈 본문이 온다(백엔드가 없는 파일에 404 대신 빈 200을 준다 — 보고함).
그 0KB 파일이 묶음 재업로드에 섞여 500이 났다. 빈 본문은 실패로 다뤄 안내하고, 존재 확인도
content-length 0을 없는 것으로 센다.
Co-Authored-By: Claude Opus 5
BizPlay 업종 값이 2자리(FRCS_TPBIZ_CD)와 4자리(FRCS_CD = 업종+업태)로 섞여 온다. 두 표를
차례로 이어 붙여 앞 표가 먼저 맞게 한다(사용자 확정). 목록·상세 모달·엑셀이 같은 표를 쓴다.
Co-Authored-By: Claude Opus 5
feature/voc b009025 재확인 — 관리자 쪽 추가는 업종 세분류 이름(frcsCdNm)뿐이라 계약은
그대로다. 노출 토글·일괄 비활성은 값만 다시 보내므로 단건 조회에서 추가 이미지 HEAD 더듬기를
끈다(건당 최대 11회 → 0회). 일괄 삭제·비활성은 차례로 멈추던 것을 동시에 보내고 실패 수를
세어 알린다(백엔드에 트랜잭션이 없어 어차피 부분 반영된다).
Co-Authored-By: Claude Opus 5
업종 값은 BizPlay FRCS_TPBIZ_CD(CHAR라 뒤 공백 제거)이고 그동안 구분코드(FRCS_DV_CD)를 읽어
하드코딩 목록과 맞추고 있었다. 공통코드 FRCS_TPBIZ_CD를 받아 목록 열·상세 모달 선택지·엑셀이
같은 표로 이름을 찾는다(사용자 확정).
Co-Authored-By: Claude Opus 5
백엔드가 카테고리 이름(frcsTypeCdNm)을 붙여 주므로 목록·메뉴 폼이 그것을 먼저 쓰고 코드표
매핑은 뒤로 물린다. 추가 이미지 장수를 알아내는 HEAD 더듬기는 차례가 아니라 한꺼번에 보내
왕복을 한 번으로 줄인다. 가맹점 목록이 useYn을 주기 시작한 것을 문서에 반영한다.
Co-Authored-By: Claude Opus 5
백엔드(feature/voc) 목록은 상세 있는 가맹점만 주므로 Repository가 가맹점 목록에 상세 목록을
덧입혀 합치고, 검색·카테고리·노출·등록일 기간·페이지를 프론트에서 처리한다(사용자 확정). 상세
없는 행의 [수정]은 가맹점 목록에서 그 건을 찾아 고정한 채 처음 만드는 화면을 연다. 상세 응답에
업체명이 빠지는 결함은 가맹점 목록의 이름으로 메운다.
Co-Authored-By: Claude Opus 5
목록·단건이 소개·카테고리 코드·영업시간·휴무일·순서·추가이미지·우편번호·등록자·등록일·수정일을
돌려주고, 목록은 상세가 있는 가맹점만(INNER JOIN), 상세 없는 단건은 NOT_FOUND, 등록은 상세가
있으면 409다. 그래서 등록 진입을 다시 가맹점 선택 화면(/new)으로 두고 — 선택지는 가맹점 전체에서
상세 보유분을 뺀 차집합 — 행의 [수정]은 상세 있는 가맹점만 연다. 응답 VO에 frcsNm이 빠진 결함은
업체명 자리에 코드를 보이는 것으로 버틴다(보고함).
Co-Authored-By: Claude Opus 5
PUT /api/v1/common/ntcn/{ntcnSn}을 규약대로 붙인다. 누르는 즉시 낙관적으로 읽음 표시
(표시선·배지 감소)를 하고 이동한 뒤 router.refresh()로 서버 목록에 되맞춘다.
백엔드 컨트롤러가 아직 경로변수 ntcnSn과 readYn을 VO에 담지 않아 어느 행도 갱신되지
않고 200만 돌아온다 — 그래서 지금은 새로 고치면 안 읽음으로 돌아온다. 백엔드가
setNtcnSn(ntcnSn)·setReadYn("Y") 두 줄을 채우면 프론트 수정 없이 동작한다.
Co-Authored-By: Claude Opus 5
한줄 소개·카테고리·영업시간·휴무일·노출 순서·추가 이미지는 INSERT/UPDATE에 실려 저장되지만
(dev 앱용 API로 영업시간·휴무일·이미지 id 저장 확인) 관리자 단건 SELECT에 그 컬럼이 없어
화면에선 비어 보이고, 그대로 저장하면 빈 값으로 덮어써진다. 컬럼이 추가될 때까지 경고를
둔다.
Co-Authored-By: Claude Opus 5
상세가 없는 가맹점도 목록에 서므로 상세 화면은 언제나 행에서 들어온다 — 업체명 선택 상자와
/new 화면, 그 선택지를 만들던 전 페이지 훑기를 지운다. 업체(가맹점)는 BizPlay 미러라
[+ 업체 등록]은 시안 자리만 지키고 비활성이다(사용자 확정). 표의 대표이미지는 인라인
흐름에 두어 셀 가운데에 선다.
Co-Authored-By: Claude Opus 5