검색어를 넣으면 목록이 통째로 죽고 있었다. 백엔드 조건이 이름이 바뀌기 전 컬럼
(QUIZ_ANSWER·QUIZ_QUESTION)을 보고 있어 SQL 오류가 난다. 값을 보내지 않고 화면에서도
감춘다.
난이도도 같이 감춘다 — 백엔드가 searchLevelCd를 받기만 하고 조건에 쓰지 않아 골라도
목록이 그대로였다.
둘 다 SQL이 고쳐지면 되살리면 된다.
Co-Authored-By: Claude Opus 5
목록 쿼리가 거를 수 있는 것은 제목(searchCondition=1)과 노출여부(RLS_YN) 둘뿐이다.
그 둘은 백엔드로 넘기고 페이징도 맡긴다 — 별도 카운트 쿼리가 있다. 지금까지는 전체를
받아 프론트에서 거르고 잘랐다.
거르지 못하는 것은 감춘다(사용자 확정) — 내용·질문자명·전화번호·답변내용 검색과
유형·답변여부 필터다. 골라도 걸러지지 않으면 고장으로 보인다. 1:1문의는 남는 대상이
하나도 없어 검색 상자 자체를 감춘다.
Co-Authored-By: Claude Opus 5
백엔드가 TB_COM_ADBK를 LEFT JOIN해 adbkList(parentNm·parentTelNo)로
보호자를 내려주기 시작했다. 한 학생에 여러 명이 붙을 수 있어 도메인 타입을
guardians 배열로 바꾸고, 목록의 보호자이름·보호자연락처 칸과 조회 팝업의
「보호자 이름 / 연락처」를 모두 줄을 나눠 그린다.
같은 개편에서 VO의 userTelno가 userTelNo로 바뀌어 있었다. 매핑이 옛 이름을
읽고 있어 휴대전화번호 칸이 늘 비어 있었다 — 새 이름으로 맞춘다.
Co-Authored-By: Claude Opus 5
백엔드에 담을 자리가 없다 — 등록·수정 요청 VO에 필드가 없고 응답의 bbsCd는 구분이
아니라 유형이다. 그래서 골라도 저장되지 않고 조회하면 늘 비어 있었으며, 검색에 쓰면
값이 항상 null이라 목록이 통째로 비었다.
등록 팝업의 칸·목록의 열·검색 대상·필터를 모두 `IS_BOARD_CATEGORY_ENABLED` 하나에
걸어 뒀다. 백엔드에 필드가 생기면 그 한 줄만 true로 바꾸면 된다.
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
백엔드가 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
영상 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
허용 확장자를 저장소 설정과 Globals.fileUpload.Extensions의 교집합으로 계산해
저장소가 허용하는 svg가 화면 단계에서 잘려 나갔다. 파일 선택창의 accept에서
빠져 svg를 고를 수조차 없었다.
실제 업로드를 막는 것은 저장소 설정의 PRM_FILE_EXTN 하나뿐이다
(EgovFileMngUtil.checkAllowFileExtension). EgovMultipartResolver의 전역 목록
검사는 어긋났을 때 던지는 SecurityException이 주석 처리돼 있어 로그만 남는다.
교집합을 걷어내고 저장소 설정만 보게 한다.
Co-Authored-By: Claude Opus 5
저장할 때 키워드를 쉼표로 이어 quizTitle 한 칸에 넣으므로, 수정 화면을 열면 키워드가
전부 비어 있었다. 제목을 쉼표로 갈라 줄을 채운다.
설명은 저장 경로에 자리가 없어 되살릴 수 없다(사용자 확정) — 키워드만 채워지고 설명은
빈 칸으로 열린다. 백엔드가 키워드 목록을 받게 되면 이 변환은 필요 없어진다.
Co-Authored-By: Claude Opus 5
잠정값으로 두었던 `CODE_GROUP.pointEvent`를 `COM_EVENT_CD`로 확정한다(사용자 확인).
같은 김에 표기도 다른 코드 항목들과 맞춘다 — 목록의 「이벤트/구분」과 수정 팝업의 읽기 전용
칸이 코드값 대신 상세코드명을 보여준다(1:1문의 진행상태·FAQ 유형과 같은 방식). 표에 없는
코드는 지어내지 않고 코드 그대로 노출한다.
**보이는 것과 저장되는 것을 갈랐다.** 화면은 코드명이고 hidden 필드와 전송 payload는 코드값
그대로다 — 수정 시 `EVENT_CD`가 코드명으로 덮이면 안 된다.
확인: 코드명이 다른 표(EVENT-3 → "과정 이수")로 목록이 「과정 이수」를 그리고, 표에 없는
ZZZ-9는 코드 그대로 나오며, 수정 팝업의 읽기 전용 칸은 「과정 이수」인데 hidden은 EVENT-3다.
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