임동욱 임동욱 08-26
fix: 관리자 회원 필드명을 백엔드 변경에 맞춘다
백엔드가 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 
@2bfc32d4be47c2b0b9a81fbfc5ebfbee761ab964
lib/data/repositories/admin-member-repository.ts
--- lib/data/repositories/admin-member-repository.ts
+++ lib/data/repositories/admin-member-repository.ts
@@ -51,12 +51,12 @@
   const loginFailCnt = raw.loginFailCnt;
 
   return {
-    id: readRequiredString(raw, 'admUserId'),
-    name: readRequiredString(raw, 'admNm'),
+    id: readRequiredString(raw, 'userId'),
+    name: readRequiredString(raw, 'userNm'),
     loginId: readRequiredString(raw, 'loginId'),
-    phoneNumber: readOptionalString(raw, 'admTelNo'),
-    email: readOptionalString(raw, 'admEmlAddr'),
-    roleCode: readOptionalString(raw, 'admRoleCd') ?? '',
+    phoneNumber: readOptionalString(raw, 'userTelNo'),
+    email: readOptionalString(raw, 'userEmlAddr'),
+    roleCode: readOptionalString(raw, 'roleId') ?? '',
     createdAt: readOptionalString(raw, 'frstRegDtStr'),
     isLocked: parseYesNo(raw.acctLockYn),
     isActive: parseYesNo(raw.useYn),
@@ -208,12 +208,12 @@
     method: 'POST',
     // 이슈: 등록은 form(@ParameterObject), 수정은 JSON(@RequestBody)로 갈려 있다.
     form: {
-      admNm: input.name,
+      userNm: input.name,
       loginId: input.loginId,
       loginPw: input.password,
-      admEmlAddr: input.email,
-      admTelNo: input.phoneNumber,
-      admRoleCd: input.roleCode,
+      userEmlAddr: input.email,
+      userTelNo: input.phoneNumber,
+      roleId: input.roleCode,
     },
     accessToken: accessToken ?? undefined,
     canHaveNullData: true,
@@ -236,9 +236,9 @@
       method: 'PUT',
       body: {
         loginPw: input.password,
-        admEmlAddr: input.email,
-        admTelNo: input.phoneNumber,
-        admRoleCd: input.roleCode,
+        userEmlAddr: input.email,
+        userTelNo: input.phoneNumber,
+        roleId: input.roleCode,
         acctLockYn: toYesNo(input.isLocked),
       },
       accessToken: accessToken ?? undefined,
lib/domain/admin-member.ts
--- lib/domain/admin-member.ts
+++ lib/domain/admin-member.ts
@@ -4,22 +4,16 @@
  * 데이터 출처는 백엔드(edupay-backend)의 `GET /api/v1/mngr/admin/pagination`이며,
  * `lib/data/repositories/admin-member-repository.ts`가 응답을 이 타입으로 매핑한다.
  *
- * **`null`의 의미는 "백엔드가 아직 주지 않는 항목"이다.** 목록 응답 VO(MngrAdminVo)가 담는 값은
- * 식별자·이름·역할·계정상태 계열뿐이라 시안(ADM_ADM_101)의 휴대전화번호·이메일·생성일은 전부
- * `null`로 채워지고 화면에서 `-`로 표시된다. 화면 컬럼은 그대로 유지한다 — 백엔드가 필드를
- * 추가하면 Repository의 매핑만 늘리면 값이 그대로 채워진다.
- *
- * 등록/수정/삭제 API가 아직 없어 그 경로는 mock으로 동작한다(`lib/data/mock/admin-member-store.ts`).
- * mock이 만들어 낸 행만 휴대전화번호·이메일·메뉴 권한 값을 실제로 갖는다.
+ * 값이 없는 항목은 `null`로 채워지고 화면에서 `-`로 표시된다.
  */
 
-/** 역할 코드 — 백엔드 `admRoleCd`. 코드 체계를 백엔드가 확정하지 않아 문자열로 다룬다. */
+/** 역할 코드 — 백엔드 `roleId`. 코드 체계를 백엔드가 확정하지 않아 문자열로 다룬다. */
 export type AdminRoleCode = string;
 
 export type AdminMember = {
-  /** 내부 식별자 — 백엔드 `admUserId`. 목록 행의 key이자 수정/삭제의 입력값이다. */
+  /** 내부 식별자 — 백엔드 `userId`. 목록 행의 key이자 수정/삭제의 입력값이다. */
   id: string;
-  /** 백엔드 `admNm`. */
+  /** 백엔드 `userNm`. */
   name: string;
   /** 백엔드 `loginId`. 등록 후에는 변경할 수 없다(시안 ADM_ADM_103_p ①). */
   loginId: string;
@@ -27,7 +21,7 @@
   phoneNumber: string | null;
   /** 백엔드 목록 응답에 없다 — mock으로 등록한 행에만 값이 있다. */
   email: string | null;
-  /** 백엔드 `admRoleCd`. 표기용 이름은 `formatAdminRoleLabel`이 만든다. */
+  /** 백엔드 `roleId`. 표기용 이름은 `formatAdminRoleLabel`이 만든다. */
   roleCode: AdminRoleCode;
   /** ISO 형식(YYYY-MM-DD) 문자열. 백엔드 목록 응답에 없다(정렬에만 쓰이고 select되지 않는다). */
   createdAt: string | null;
@@ -53,7 +47,7 @@
  * **백엔드에 역할 코드 목록을 주는 API도, 코드 상수도 없다** — `TB_ADM_USER.ADM_ROLE_CD`를
  * 그대로 내려줄 뿐이고 코드값의 정의는 어디에도 없다(백엔드 저장소 전체 검색으로 확인).
  * 시안(ADM_ADM_101)이 요구하는 표기는 "최고관리자/일반관리자" 둘이고, 실제로 관측된 코드는
- * 로그인 토큰의 `admRoleCd` 클레임에서 본 `ROLE_SYSTEM` 하나뿐이다(`lib/domain/admin-user.ts`).
+ * 로그인 토큰의 `roleId` 클레임에서 본 `ROLE_SYSTEM` 하나뿐이다(`lib/domain/admin-user.ts`).
  *
  * 그래서 아래 표는 **잠정 매핑**이며, 표에 없는 코드는 임의의 이름을 지어내지 않고 코드를 그대로
  * 노출한다 — 잘못된 역할 이름을 보여주는 것보다 낯선 코드를 보여주는 편이 낫다(권한 화면이라
Add a comment
List