백엔드가 등록을 자체 저장에서 BizPlay 외부 가맹점 등록 API 위임으로 바꿨다
(edupay-backend 5fa9d34). `POST /api/v1/mngr/voc`가 form에서 @RequestBody(JSON)가 되고
bizPlayVocApiService.insertVoc를 부르며, 예금주명·입금은행코드·입금계좌번호·업태코드가
새로 필수가 됐다. 지금 등록 폼은 그 값을 받지 않아 계약이 맞지 않는다.
- 목록의 [등록] 버튼을 비활성화한다(엑셀등록과 같은 방식). 시안의 자리는 그대로 둔다.
- 모달을 여는 상태·렌더를 걷어내 폼에 닿을 수 없게 한다.
- saveMerchantAction도 저장 직전에서 끊는다 — Server Action은 UI를 거치지 않고도 호출되므로
버튼만 비활성화하면 막은 것이 아니다. 세션 확인과 입력 검증은 그대로 두어 다시 열 때
createMerchant 호출만 되살리면 되게 했다.
다시 열 때: createMerchant를 새 계약(JSON, MngrVocInsertReqVo)으로 바꾸고 폼에 정산 계좌
항목을 추가한 뒤, _actions.ts의 마지막 return을 try/catch + createMerchant로 되돌린다.
Co-Authored-By: Claude Opus 5
지금까지는 정답으로 고른 쪽만 문구를 정할 수 있었고(나머지 줄은 비활성) 한 벌만
나갔다. 두 줄 모두 항상 편집할 수 있게 하고 둘 다 전송한다 — 정답이 아닌 쪽에도
보여 줄 문구가 필요하다.
정답 라디오는 그대로 둔다. 어느 쪽이 정답인지는 여전히 그것이 정한다.
백엔드가 아직 이 필드를 모른다(작업 중). 지금 보내도 폼은 미지의 파라미터를, JSON은
미지의 속성을 버리므로 조용히 무시된다. 이름이 확정되면 QUIZ_ANSWER_MESSAGE_FIELD
한 곳만 고치면 된다.
Co-Authored-By: Claude Opus 5
넷 다 연결할 기능이 없어 눌러도 아무 일이 없던 자리다. 사용자 아이콘은 바로 옆
프로필 pill과 역할도 겹쳤다.
즐겨찾기는 화면뿐 아니라 도메인·mock까지 걷어낸다 — 그리는 곳이 사이드바뿐이라
남겨 두면 죽은 데이터가 된다.
알림 버튼과 프로필 pill은 남긴다. pill은 지금 유일한 로그아웃 경로다.
Co-Authored-By: Claude Opus 5
백엔드 요청 VO에서 quizTitle·quizPoint가 사라지고 keywordList가 들어왔다.
- 키워드는 쉼표로 이은 문자열 대신 목록으로 읽고 보낸다. 항목마다 설명을 갖는데
입력 칸은 공용 키워드 필드에 이미 있었고, 읽을 때만 유실되고 있었다(사용자 확정).
- 포인트는 저장되지 않으므로 숨김 칸과 폼 값에서 뺀다(사용자 확정). 되돌릴 문자열이
없어진 keywordsFromText도 함께 지운다.
Co-Authored-By: Claude Opus 5
백엔드가 콘텐츠 키를 cntntsSn -> cntntsId로, 퀴즈 필드를 quiz* -> cntntsQuiz*로
바꿨다(퀴즈 식별자도 quizSn -> cntntsId). 우리 쪽은 응답에서 옛 이름을 찾다 던지고
있어 금융쇼츠·4컷만화·금융OX퀴즈 목록이 전부 열리지 않는 상태였다.
누적포인트 목록 검색도 searchUserId -> searchLoginId로 바뀌어 맞춘다.
라우트 폴더 이름도 함께 바꿨다 — 동적 세그먼트라 주소에는 값만 나가므로 URL은
그대로다.
Co-Authored-By: Claude Opus 5
관리자 회원을 회원관리 아래로, 금칙어관리·가맹점 관리를 관리자관리 아래로 옮기고
「회원정보관리 → 회원관리」·「관리자정보관리 → 관리자관리」로 이름을 바꿨다.
각 화면의 breadcrumb이 메뉴 경로를 그대로 되풀이하고 있어 여섯 곳을 같이 고쳤다 —
안 고치면 메뉴는 관리자관리인데 화면은 시스템관리라고 말하게 된다.
콘텐츠관리 아이콘이 기본값으로 떨어지던 것도 함께 고쳤다. 이름 `image`가 사이드바
허용 목록에 빠져 있었다.
Co-Authored-By: Claude Opus 5
백엔드가 TB_ADM_USER 계열 이름을 adm* 에서 user* 로 바꿨다(e0ae7fb).
프론트가 옛 이름을 읽어 admUserId가 없다며 목록이 통째로 예외를 냈다.
admUserId->userId, admNm->userNm, admTelNo->userTelNo,
admEmlAddr->userEmlAddr, admRoleCd->roleId. 등록(form)·수정(JSON) 경로도 같다.
Co-Authored-By: Claude Opus 5
백엔드가 /api/v1/common/auth/admin/login을 지우고 /api/v1/mngr/auth/login으로
옮겼다(4b0f0ba). 구 경로는 실제로 404를 반환해 로그인이 전혀 되지 않는 상태였다.
- 로그인 POST /api/v1/mngr/auth/login, 로그아웃 POST /api/v1/mngr/auth/logout
- accessToken 클레임이 adminId/loginId/admRoleCd -> userId/userNm/roleId로 바뀌었다.
loginId는 더 이상 토큰에 없어 입력값을 세션에 담는다. 이름 클레임(userNm)이
생겨 그동안 loginId로 대체하던 표시 이름을 실제 이름으로 되돌린다.
- 중복 로그인: 살아 있는 세션이 있으면 200인데 토큰 대신 최근 접속 정보만 온다.
FoxModal로 안내하고 [로그인]을 누르면 isForceLogin=true로 재요청한다. 재요청에
아이디·비밀번호가 남아 있어야 해서 폼 리셋을 막고 액션을 직접 호출한다.
- 실패 문구는 백엔드 것을 그대로 쓴다(잠김·탈퇴·실패횟수 안내). 다만 404
"로그인 계정이 없습니다"만 일반 문구로 바꿔 계정 존재 여부를 드러내지 않는다.
Co-Authored-By: Claude Opus 5
단건 조회가 없어 수정 화면이 목록을 500건까지 받아 와 그 안에서 찾고
있었다. 백엔드가 GET /api/v1/mngr/cntntns/quiz/{quizSn}을 열었으므로
스캔을 걷어낸다. 500건을 넘는 퀴즈가 쌓여도 수정 화면이 빈 화면이 되지
않는다.
같은 개편에서 등록 INSERT의 값 목록과 keyProperty도 고쳐져, 파일 머리말의
결함 목록에서 함께 지운다. 검색어가 키워드를 보지 않는 것과 난이도 필터가
SQL에 없는 것은 그대로다.
Co-Authored-By: Claude Opus 5
영상 id는 조회에서 채워 hidden input에 실려 있었지만 FoxFileUpload에
defaultFiles를 넘기지 않아 칸이 늘 비어 보였다. 어떤 영상이 붙어 있는지
알 수 없어 매번 다시 올려야 하는 것처럼 보였다.
조회 응답의 fileList[].orgnlFileNm을 함께 실어 와 그 이름을 그린다.
이름이 없으면 "등록된 영상"으로 대신한다.
Co-Authored-By: Claude Opus 5
기획 시안과 틀어져 지우면 안 되는 항목이었다(사용자 확정). 브랜드명·메모·등록일·
최종수정일을 목록·팝업·엑셀에 되살리고, 값이 없을 때 '-'가 나오게 한다.
등록 시 브랜드명·메모도 함께 보낸다 — 요청 VO에 없어 지금은 버려지지만 컬럼이
생기면 프론트 수정 없이 저장된다.
Co-Authored-By: Claude Opus 5
mock을 걷어내고 TB_COM_VOUCHER를 보는 실제 API에 붙였다. 필드 이름이 화면 용어와
달라 Repository가 옮긴다 — frcsNo=코드, frcsNm=가맹점명, brno=사업자번호,
rprsvNm/rprsvTelno=대표자/전화, frcsPostAddr/frcsDaddr/frcsPostZip=주소 3종.
백엔드에 자리가 없는 것은 화면에서 뺐다 — 브랜드명·메모·등록일 컬럼이 없고,
수정·삭제·단건조회 API가 없다(목록과 등록 둘뿐). 행의 수정·삭제 버튼은 시안 자리를
두되 누르면 준비 중임을 알린다.
우편번호(frcsPostZip)를 새로 싣는다 — 주소 검색이 함께 채우는 값이다.
Co-Authored-By: Claude Opus 5
백엔드 포인트 패키지가 policy/stats로 갈라지면서 기준관리가 쓰던
/api/v1/mngr/point 가 /api/v1/mngr/point/policy 로 옮겨져 목록이 404였다.
배포 서버 /v3/api-docs 로 확인한 실제 경로로 되돌린다.
같은 개편에서 /point/stats/pagination 과 /point/stats/log/pagination 이
새로 생겨, 그동안 메모리 목업이던 누적포인트 화면을 실제 API에 붙인다.
응답에 없는 값(번호·회원번호·사이트·차감포인트)과 매퍼에 WHERE 절이 없어
걸리지 않는 검색은 파일 머리말에 이슈로 남겼다.
Co-Authored-By: Claude Opus 5
앞선 커밋에서 "기획상 이벤트는 읽기 전용이라 등록이 없다"고 적었는데 틀렸다. 목록 기획(④)에
「+ 신규 등록」이 있고 등록 팝업 시안(PTS10100002_p)도 따로 있다. "읽기 전용"은 수정 팝업의
이벤트 칸에만 해당한다.
등록 이벤트 = 셀렉트(기획 ① "등록된 코드중에서 선택")
수정 이벤트 = 읽기 전용 입력 — 지금까지와 같다
팝업 하나가 두 모드를 겸한다. 제목·저장 버튼·완료 토스트가 갈리고, 이벤트 칸만 셀렉트/읽기
전용으로 바뀐다. 검증도 `isCreate`로 갈린다 — 등록은 대상 id가 없고(백엔드 채번) 이벤트를
골라야 하며, 수정은 그 반대다. 등록은 저장 직전에 코드표를 다시 조회해 화면이 보낸 이벤트
코드를 대조한다.
Repository에 `createPointStandard`(form POST)를 되살렸다. 등록은 form, 수정은 JSON으로
갈리는 규약은 콘텐츠·퀴즈와 같다.
「사이트」 열을 뺐다 — 기획 목록의 열은 번호·이벤트/구분·포인트·제한포인트·중복여부·설명·
사용여부·수정일시·관리뿐이고 사이트가 없다. 백엔드에도 담을 컬럼이 없어 늘 비어 있던 열이다.
확인: 「신규 등록」을 누르면 제목 「등록」, 항목이 이벤트*·포인트*·제한포인트*·중복 여부·
이벤트 설명*·사용여부, 저장 버튼 「등록」, 이벤트가 셀렉트(EVENT-1)로 뜨고 hidden id는 빈 값.
TODO: 이벤트 공통코드 그룹ID를 받지 못해 `CODE_GROUP.pointEvent`를 잠정값('EVENT_CD')으로
두었다. 실제 값이 확인되면 그 한 줄만 바꾼다.
Co-Authored-By: Claude Opus 5