회원 상세 · 수정
MEMBERS-ID · /members/[id]
종류
상세
부르는 것
3
lib 함수
가드레일
6
줄
95
로그인 필요동적 라우트운영
화면
관리자 세션으로 촬영한 실제 화면입니다.

이 화면이 부르는 것
- ·
fetchFields() - ·
fetchMember() - ·
fetchMemberProgress()
소스
src/app/(console)/members/[id]/page.tsx같은 규칙을 쓰는 화면
목록 · 작성 · 수정이 한 묶음입니다. 스펙을 세 벌로 적으면 어긋납니다.
개발 스펙
ADMIN-MEMBERS완료이 스펙은 2개 화면이 함께 씁니다이 화면에서 할 수 있어야 하는 것 (4)
- 아이디 · 이름 · 연락처 · 이메일로 회원을 찾는다.
- 수강권을 직접 켜고 끈다 — 원본에서 운영자가 가장 많이 쓰던 기능이다.
- 합격 여부 · 자격증 발급 · 수강기간을 고친다.
- 목록에서는 결제된 과정만 배지로 모아 보여 준다. 33개를 다 펼치면 읽을 수 없다.
비즈니스 규칙 (5)
- 결제가 회원 플래그를 건드리지 않아 모든 활성화가 여기서 일어났다.근거: admin/member/mb_proc.php
- 고칠 수 있는 항목은 열거형(MemberField)이 정한다. 화면이 보낸 문자열이 컬럼이 되지 않는다.
- 비밀번호와 아이디는 고칠 수 없다 — 관리자가 남의 계정으로 로그인할 수 있게 된다.
- 플래그는 Y/N, 날짜는 YYYY-MM-DD 만 받는다.
- 결제·사이버·준비 필터는 TESOL·TEC·파닉스 중 하나라도 맞으면 잡는다.근거: mb_list.php:25~31
API (4)
| 메서드 | 경로 | 권한 | 모듈 · 설명 |
|---|---|---|---|
GET | /api/identity/admin/members | 관리자 | 회원 검색. keyword · approval · payYn · cyberYn · prepareYn. domains:identity:identity-web |
GET | /api/identity/admin/members/fields | 관리자 | 고칠 수 있는 항목 33개. 화면이 목록을 하드코딩하지 않게 한다. domains:identity:identity-web |
GET | /api/identity/admin/members/{id} | 관리자 | 회원 상세. 플래그 전체를 Map 으로 준다. domains:identity:identity-web404 MEMBER_NOT_FOUND |
POST | /api/identity/admin/members/{id} | 관리자 | 항목 수정. 열거형에 없는 키는 거부된다. domains:identity:identity-web400 INVALID_FIELD 400 INVALID_VALUE 403 FORBIDDEN |
가드레일 (6) — id 가 곧 테스트 이름이다
| id | 반드시 만족해야 하는 것 | 등급 |
|---|---|---|
member-progress-shown | 회원 상세에서 그 학생의 시청 기록과 학습일을 볼 수 있어야 한다. 원본 admin/member/timeline_detail*.php 가 유닛 × 레슨 격자로 보여 주던 것이다. | normal |
member-progress-empty | 기록이 없으면 빈칸이 아니라 없다고 말해야 한다. 없는 레슨을 빈칸으로 채우면 무엇을 봤는지 오히려 안 보인다. | normal |
member-no-credential-fields | 비밀번호와 아이디를 고치는 길이 없어야 한다. 있으면 관리자가 남의 계정으로 로그인할 수 있다. | critical |
member-field-whitelist | 열거형에 없는 컬럼은 수정 요청 자체가 거부돼야 한다. 화면이 보낸 문자열이 SQL 에 닿으면 어떤 컬럼이든 고칠 수 있다. | critical |
member-value-format | 플래그는 Y/N, 날짜는 YYYY-MM-DD 가 아니면 저장하지 않아야 한다. | high |
member-change-logged | 누가 무엇을 바꿨는지 로그와 modid · moddate 에 남아야 한다. 수강권은 돈과 직결된다. | high |
구현 계획 (10/10)
- ●PlaySession · LessonPlayLog 값 객체
learning-domain - ●playLog · studyDays 포트
learning-domain - ●playdata 배열을 펼치는 어댑터 + 학습일 집계
learning-infrastructure - ●GET /learning/admin/members/{id}/progress (관리자 전용, ip 는 안 내보낸다)
learning-web - ●회원 상세의 TESOL · TEC 시청 기록 카드
wvctesol-admin - ●MemberField 열거형 — 컬럼 이름을 여기서만 정한다
identity-domain - ●AdminMemberUseCase — 권한 확인 · 값 검증 · 변경 로그
identity-app - ●AdminMemberRepositoryAdapter — 33개 플래그를 Map 으로
identity-infrastructure - ●GET/POST /api/identity/admin/members
identity-web - ●목록 · 상세 · 수정 폼
wvctesol-admin
서버 사이드 구현 계획 — 자바 객체별 요구사항 (3/3)
| 객체 | 모듈 | 책임 · 지켜야 할 것 |
|---|---|---|
● MemberFieldenum | identity-domain | 관리자가 고칠 수 있는 항목과 그 컬럼 이름.
|
● MemberSummaryrecord | identity-domain | 관리자가 보는 회원.
|
● AdminMemberUseCaseservice | identity-app | 회원 검색·수정.
|
테스트 방법 (6)
| 가드레일 | 종류 | 확인 방법 |
|---|---|---|
member-progress-shown | e2e | 실데이터 회원(1242)의 학습일 > 0, 레슨 기록 존재, 펼치면 재생 목록 |
member-progress-empty | e2e | 기록 없는 과정은 "시청 기록이 없습니다" |
member-no-credential-fields | e2e | 상세 화면에 password · login_id 입력칸이 0개 |
member-field-whitelist | integration | {"password":"x"} 전송 → 400 INVALID_FIELD |
member-value-format | e2e | pass_date 에 "어제" 입력 → YYYY-MM-DD 오류 노출, 저장 안 됨 |
member-change-logged | integration | 수정 후 modid 가 관리자 이름, moddate 가 갱신된다 |
정하지 못한 것 · 확인이 필요한 것
- 시험 이력 조회(원본 mb_quiz.php)와 자료 업로드(entrance_upload.php)는 아직 없다.