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