개발 내용 README.md 파일에 반영

This commit is contained in:
2026-07-05 18:34:02 +09:00
parent 5463395b04
commit c7d55b5463
+25 -5
View File
@@ -19,14 +19,19 @@ chocomae(mouse-typing) 서비스의 관리자 기능을 독립 Next.js 서비스
## 구현된 기능 ## 구현된 기능
- 관리자 로그인 (기존 `admin` 테이블 / MariaDB `PASSWORD()` 호환) - 관리자 로그인 (기존 `admin` 테이블 / MariaDB `PASSWORD()` 호환, 로그인 실패 5회 → 15분 잠금)
- 마에스트로 전체 목록 — 검색(이름·이메일·ID), 상태/계정유형 필터, 페이지네이션 - 마에스트로 전체 목록 — 검색(이름·이메일·ID), 상태/계정유형 필터, 페이지네이션
- 마에스트로 상세 보기 — 기본 정보, 연장/업그레이드 이력, 처리 로그 - 마에스트로 상세 보기 — 기본 정보, 연장/업그레이드 이력, 처리 로그
- 연장 신청 목록 — 승인 / 취소 (트랜잭션 + `maestro_log`) - 마에스트로 정보 수정 — 이름, 이메일, 상태, 계정유형, 만료일, 엔터코드 허용 여부 (`PATCH /api/maestros/[id]`)
- 업그레이드 신청 목록 — 승인 / 거절 (트랜잭션 + `maestro_log`) - 마에스트로 암호 초기화 — 관리자가 `123456`으로 초기화 (트랜잭션 + `maestro_log`)
- 수강생 목록 — 서버사이드 페이지네이션 (`GET /api/maestros/[id]/students`)
- 연장 신청 목록 — 승인 / 취소 (트랜잭션 + `maestro_log` + 이메일 발송)
- 업그레이드 신청 목록 — 승인 / 거절 (트랜잭션 + `maestro_log` + 이메일 발송)
- 관리자 주도 연장/업그레이드 신청 등록 — 마에스트로 상세 화면에서 직접 등록 (이메일 미발송)
- 비인증 접근 차단 (`proxy.ts`, API route `auth()` 검사) - 비인증 접근 차단 (`proxy.ts`, API route `auth()` 검사)
- 구조화 로깅 — API 처리 시간·결과, DB 쿼리 pretty 출력, slow query 감지, 비밀번호 컬럼 마스킹 (`Password`) - 구조화 로깅 — API 처리 시간·결과, DB 쿼리 pretty 출력, slow query 감지, 비밀번호 컬럼 마스킹 (`Password`)
- 동시 승인 방지 — 연장/업그레이드 승인·취소·거절 시 조건부 원자 UPDATE로 이중 처리 차단 - 동시 승인 방지 — 연장/업그레이드 승인·취소·거절 시 조건부 원자 UPDATE로 이중 처리 차단
- 이메일 자동 발송 — 연장/업그레이드 승인 후 Nodemailer로 발송, 실패 시 UI 경고 표시
## 개발 환경 설정 ## 개발 환경 설정
@@ -92,10 +97,15 @@ pnpm dev
## 배포 (Synology NAS Docker) ## 배포 (Synology NAS Docker)
```bash ```bash
# 이미지 빌드 및 컨테이너 시작 # 스테이지 배포
docker compose up -d --build bash scripts/deploy-stage.sh
# 운영 배포 (yes 입력 확인 필요)
bash scripts/deploy-production.sh
``` ```
각 스크립트는 `git pull``proxy-network` 확인 → `docker compose up -d --build --remove-orphans``docker exec npm nginx -s reload` 순으로 실행된다.
`docker-compose.yml``environment` 섹션에 위 환경변수를 설정한다. `TZ: Asia/Seoul`은 두 compose 파일에 이미 포함되어 있다. 상세 절차는 [`docs/deployment.md`](docs/deployment.md)를 참고한다. `docker-compose.yml``environment` 섹션에 위 환경변수를 설정한다. `TZ: Asia/Seoul`은 두 compose 파일에 이미 포함되어 있다. 상세 절차는 [`docs/deployment.md`](docs/deployment.md)를 참고한다.
## 프로젝트 구조 ## 프로젝트 구조
@@ -109,6 +119,12 @@ chocoadmin/
│ │ ├── extension-requests/ │ │ ├── extension-requests/
│ │ └── upgrade-requests/ │ │ └── upgrade-requests/
│ └── api/ # API routes │ └── api/ # API routes
│ └── maestros/[id]/
│ ├── route.ts # PATCH — 마에스트로 정보 수정
│ ├── students/route.ts # GET — 수강생 목록 (페이지네이션)
│ ├── extension-requests/ # POST — 관리자 주도 연장 신청
│ ├── upgrade-requests/ # POST — 관리자 주도 업그레이드 신청
│ └── reset-password/ # POST — 암호 초기화
├── components/ ├── components/
│ ├── data-table/ # TanStack Table 기반 테이블 │ ├── data-table/ # TanStack Table 기반 테이블
│ ├── forms/ │ ├── forms/
@@ -118,10 +134,14 @@ chocoadmin/
│ ├── logger.ts # 공통 로거 (debug/info/warn/error) │ ├── logger.ts # 공통 로거 (debug/info/warn/error)
│ ├── errors.ts # ApiError 공통 에러 클래스 │ ├── errors.ts # ApiError 공통 에러 클래스
│ ├── api-handler.ts # API route 래퍼 (auth, 타이밍, 에러 처리) │ ├── api-handler.ts # API route 래퍼 (auth, 타이밍, 에러 처리)
│ ├── mail.ts # Nodemailer 이메일 발송
│ ├── constants.ts # 상태값 상수 │ ├── constants.ts # 상태값 상수
│ ├── maestros.ts # 마에스트로 DB 쿼리 │ ├── maestros.ts # 마에스트로 DB 쿼리
│ ├── extension-requests.ts │ ├── extension-requests.ts
│ └── upgrade-requests.ts │ └── upgrade-requests.ts
├── scripts/
│ ├── deploy-stage.sh # 스테이지 배포 스크립트
│ └── deploy-production.sh # 운영 배포 스크립트
├── prisma/ ├── prisma/
│ └── schema.prisma # DB introspection 결과 │ └── schema.prisma # DB introspection 결과
├── docs/ ├── docs/