plan 생성

This commit is contained in:
2026-06-09 18:37:32 +09:00
parent 5dd7375aad
commit c6a5418d25
3 changed files with 1249 additions and 0 deletions
+339
View File
@@ -0,0 +1,339 @@
# choco-admin 프로젝트 계획서
## 1. 프로젝트 개요
| 항목 | 내용 |
|---|---|
| 서비스명 | choco-admin |
| 목적 | chocomae 웹 서비스(mouse-typing)의 관리자 기능을 독립 웹 서비스로 분리 |
| 기존 서비스 경로 | `/Users/jisangs/work/jinaju/git/web/mouse-typing` |
| 신규 서비스 경로 | `/Users/jisangs/work/jinaju/git/web/choco-admin` |
| 사용 DB | 기존 chocomae DB (MariaDB 10.11.13) 그대로 사용 |
---
## 2. 기술 스택
| 구분 | 기술 |
|---|---|
| 런타임 | Node.js (LTS 버전) |
| 프레임워크 | Next.js 15 (App Router) |
| 언어 | TypeScript |
| DB 클라이언트 | `mysql2` (MariaDB 호환) |
| 인증 | NextAuth.js v5 (기존 `admin` 테이블 활용) |
| 환경변수 관리 | `.env.local` / `.env.production` |
---
## 3. CSS Framework 추천
관리자 화면은 주로 표(Table)와 폼(Form) 중심이므로, 빠른 개발과 유지보수성을 모두 고려한 3가지를 추천합니다.
### 3-1. Tailwind CSS + shadcn/ui ⭐ 추천
- **Tailwind CSS**: 유틸리티 클래스 기반으로 CSS 파일을 직접 작성할 일이 거의 없음
- **shadcn/ui**: Tailwind 기반의 복사-붙여넣기형 컴포넌트 라이브러리. Button, Table, Dialog, Form 등 관리자 UI에 필요한 컴포넌트가 이미 갖춰져 있음
- **장점**: Next.js App Router와 궁합이 뛰어남. 번들 사이즈가 작고, 컴포넌트 코드를 직접 소유하므로 커스터마이징이 자유로움
- **단점**: 초기 세팅이 다소 필요함
### 3-2. Ant Design (antd)
- React 생태계에서 오랫동안 검증된 전통적인 관리자 UI 라이브러리
- Table, Form, Modal, DatePicker 등 관리자 페이지에 필요한 컴포넌트가 모두 내장되어 있음
- **장점**: 별도 CSS 작업 없이 완성도 높은 UI를 빠르게 구성 가능
- **단점**: 번들 사이즈가 크고, 기본 디자인 톤에서 벗어나는 커스터마이징이 어려움
### 3-3. Mantine
- shadcn/ui보다 더 완결된 형태의 컴포넌트 세트 제공 (100개 이상)
- 자체 훅(hook) 라이브러리도 포함되어 있어 복잡한 상태 관리 없이 폼·테이블 구현 가능
- **장점**: 문서가 잘 정리되어 있고 TypeScript 지원이 뛰어남
- **단점**: antd처럼 디자인 자유도가 shadcn/ui보다 낮음
> **최종 추천: Tailwind CSS + shadcn/ui**
> Next.js 공식 생태계와 가장 잘 맞고, 장기적인 유지보수 측면에서 가장 유리합니다.
---
## 4. Table 라이브러리 추천
관리자 화면은 목록 조회, 검색, 정렬, 페이지네이션, 인라인 액션 버튼이 핵심이므로 아래 3가지를 추천합니다.
### 4-1. TanStack Table (React Table v8) ⭐ 추천
- Headless 방식(스타일 미포함)으로, Tailwind/shadcn과 조합해 완전한 커스터마이징 가능
- 정렬, 필터, 페이지네이션, 행 선택, 컬럼 고정 등 필요한 기능을 필요한 만큼만 추가
- **shadcn/ui DataTable**: TanStack Table + shadcn 조합의 공식 예제가 제공되어 빠른 시작 가능
- **장점**: 번들 사이즈 최소, 자유도 최대, Next.js App Router 완벽 호환
- **단점**: 기능을 직접 조립해야 하므로 초기 설정 비용이 있음
### 4-2. AG Grid (Community Edition)
- 대용량 데이터에 특화된 고성능 그리드 라이브러리
- 정렬, 필터, 그룹핑, 엑셀 내보내기, 인라인 편집 등 풍부한 기능이 내장
- 무료 Community Edition으로도 관리자 기능 구현에 충분
- **장점**: 기능이 가장 풍부하고 성능이 뛰어남
- **단점**: 번들 사이즈가 크고, 스타일 커스터마이징에 별도 CSS 작업이 필요
### 4-3. MUI DataGrid (Free tier)
- Material UI 기반의 데이터 그리드
- 정렬, 필터, 페이지네이션, 컬럼 재배치가 내장
- **장점**: Material UI 생태계와 자연스럽게 통합, 사용법이 직관적
- **단점**: Tailwind와 함께 사용 시 스타일 충돌 이슈가 발생할 수 있음. 고급 기능은 Pro 유료 플랜 필요
> **최종 추천: TanStack Table + shadcn/ui DataTable**
> shadcn/ui와 세트로 사용하면 코드 통일성이 높고, 필요한 기능만 붙일 수 있어 관리 부담이 적습니다.
---
## 5. 개발 환경 및 배포 환경
### 5-1. 개발 환경
| 항목 | 내용 |
|---|---|
| 플랫폼 | Synology NAS (DS920+, 20GB RAM) - Docker |
| DB (개발) | localhost MariaDB |
| 실행 방법 | `docker compose up` |
| 포트 | 3001 (기존 mouse-typing과 충돌 방지) |
### 5-2. 서비스 환경
| 항목 | 내용 |
|---|---|
| 플랫폼 | Synology NAS (DS920+) - Docker |
| DB (서비스) | AWS EC2 MariaDB (chocomae 서비스와 동일 인스턴스) |
| 접근 방식 | NAS에서 AWS EC2 DB에 직접 연결 (보안그룹 인바운드 규칙에 NAS 외부 IP 허용 필요) |
### 5-3. docker-compose.yml 구성 계획
```yaml
# docker-compose.yml (개발용)
services:
choco-admin:
build: .
ports:
- "3001:3000"
environment:
- NODE_ENV=development
- DB_HOST=host.docker.internal
- DB_PORT=3306
- DB_NAME=chocomae
- DB_USER=...
- DB_PASS=...
volumes:
- .:/app
- /app/node_modules
- /app/.next
```
### 5-4. Dockerfile 계획
```dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
CMD ["npm", "start"]
```
---
## 6. 데이터베이스 주요 테이블 정리
스키마: [`docs/db-reference/schema.sql`](./db-reference/schema.sql)
| 테이블 | 설명 | 주요 컬럼 |
|---|---|---|
| `maestro` | 마에스트로(강사) 계정 | `MaestroID`, `Name`, `Email`, `AccountType`, `ActivateStatus`, `AvailableActivateDateTime` |
| `maestro_extension` | 마에스트로 연장 신청 | `MaestroExtensionID`, `MaestroID`, `AccountType`, `RequestedDateTime`, `Status` |
| `maestro_upgrade` | 마에스트로 업그레이드 신청 | `MaestroUpgradeID`, `MaestroID`, `RegisteredAccountType`, `RequestedAccountType`, `RequestedDateTime`, `Status` |
| `maestro_log` | 마에스트로 처리 이력 | `MaestroLogID`, `MaestroID`, `Type`, `LogDateTime`, `Remark` |
| `admin` | 관리자 계정 | `AdminID`, `Name`, `Password`, `Email`, `AccountType`, `ActivateStatus` |
| `player` | 학생 계정 | `PlayerID`, `MaestroID`, `Name`, `EnterCode` |
### AccountType 코드표
| 값 | 의미 |
|---|---|
| 1 | 20명 (1만원) |
| 2 | 50명 (2만원) |
| 3 | 100명 (3만원) |
| 4 | 500명 (4만원) |
| 5 | 1,000명 (5만원) |
### ActivateStatus 코드표 (maestro)
| 값 | 의미 |
|---|---|
| 0 | 미승인 |
| 1 | 체험 |
| 2 | 활성화 |
| 100 | 등록취소 |
### Status 코드표 (maestro_extension / maestro_upgrade)
| 값 | 의미 |
|---|---|
| 1 | 요청 |
| 2 | 취소 |
| 3 | 연장/업그레이드 적용 |
---
## 7. 주요 화면 목록 및 API 설계
### 7-1. 화면 구조 (Next.js App Router)
```
app/
├── (auth)/
│ └── login/ # 관리자 로그인
├── (admin)/
│ ├── layout.tsx # 공통 사이드바 + 헤더
│ ├── maestro/
│ │ ├── page.tsx # 마에스트로 전체 목록
│ │ └── [id]/
│ │ └── page.tsx # 마에스트로 상세 정보
│ ├── extension/
│ │ └── page.tsx # 연장 신청 목록 + 승인/취소
│ └── upgrade/
│ └── page.tsx # 업그레이드 신청 목록 + 승인/거절
└── api/
├── auth/[...nextauth]/
├── maestro/
│ ├── route.ts # GET: 목록 조회
│ └── [id]/route.ts # GET: 상세, PATCH: 상태 변경
├── extension/
│ ├── route.ts # GET: 목록 조회
│ └── [id]/route.ts # PATCH: 승인/취소
└── upgrade/
├── route.ts # GET: 목록 조회
└── [id]/route.ts # PATCH: 승인/거절
```
### 7-2. 화면별 기능 명세
#### [1] 마에스트로 전체 목록 (`/maestro`)
- 전체 마에스트로 목록 표시
- 검색: 이름, 이메일
- 필터: ActivateStatus (미승인 / 체험 / 활성화 / 등록취소)
- 정렬: 가입일, 만료일
- 컬럼: ID / 이름 / 이메일 / 계정유형 / 상태 / 인원수 / 사용가능일 / 상세보기
#### [2] 마에스트로 상세 정보 (`/maestro/[id]`)
- 기본 정보 (이름, 이메일, 계정 유형, 상태, 만료일)
- 플레이어(학생) 목록
- 연장 신청 이력
- 업그레이드 신청 이력
- 관리자 처리 로그
#### [3] 연장 신청 목록 (`/extension`)
- 연장 신청 목록 표시 (기본: Status=1 요청 건만)
- 필터: 상태 (요청 / 취소 / 적용)
- 컬럼: 신청ID / 마에스트로명 / 계정유형 / 신청일시 / 상태 / 승인버튼 / 취소버튼
- 승인 시: `maestro.ActivateStatus = 2`, `maestro.AvailableActivateDateTime` 1년 연장, `maestro_extension.Status = 3`
- 취소 시: `maestro_extension.Status = 2`
#### [4] 업그레이드 신청 목록 (`/upgrade`)
- 업그레이드 신청 목록 표시 (기본: Status=1 요청 건만)
- 필터: 상태 (요청 / 취소 / 적용)
- 컬럼: 신청ID / 마에스트로명 / 현재등급 / 요청등급 / 신청일시 / 상태 / 승인버튼 / 거절버튼
- 승인 시: `maestro.AccountType` 변경, `maestro_upgrade.Status = 3`
- 거절 시: `maestro_upgrade.Status = 2`
---
## 8. 개발 단계 계획
### Phase 1. 프로젝트 초기화 및 환경 구성
- [ ] Next.js 15 + TypeScript 프로젝트 생성
- [ ] Tailwind CSS + shadcn/ui 설치 및 설정
- [ ] TanStack Table 설치
- [ ] mysql2 설치 및 DB 연결 유틸리티 작성
- [ ] docker-compose.yml 작성 (개발용)
- [ ] `.env.local` 환경변수 구성
- [ ] NextAuth.js v5 설치 및 `admin` 테이블 기반 로그인 구현
### Phase 2. 공통 레이아웃 및 인증
- [ ] 로그인 페이지 (`/login`)
- [ ] 인증 미들웨어 (비로그인 시 `/login` 리다이렉트)
- [ ] 공통 레이아웃 (사이드바 네비게이션, 상단 헤더)
### Phase 3. 마에스트로 관리
- [ ] 마에스트로 전체 목록 페이지 + API
- [ ] 마에스트로 상세 정보 페이지 + API
### Phase 4. 연장 신청 관리
- [ ] 연장 신청 목록 페이지 + API
- [ ] 연장 승인 / 취소 기능 + API
### Phase 5. 업그레이드 신청 관리
- [ ] 업그레이드 신청 목록 페이지 + API
- [ ] 업그레이드 승인 / 거절 기능 + API
### Phase 6. 배포 환경 구성
- [ ] Dockerfile (프로덕션용) 작성
- [ ] docker-compose.prod.yml 작성 (Synology NAS용)
- [ ] AWS EC2 DB 보안그룹 인바운드 설정 (NAS 외부 IP 허용)
- [ ] Synology NAS Container Manager에서 배포 테스트
---
## 9. 디렉토리 구조 (목표)
```
choco-admin/
├── app/
│ ├── (auth)/
│ │ └── login/
│ ├── (admin)/
│ │ ├── layout.tsx
│ │ ├── maestro/
│ │ ├── extension/
│ │ └── upgrade/
│ └── api/
├── components/
│ ├── ui/ # shadcn/ui 컴포넌트
│ ├── data-table/ # TanStack Table 공통 컴포넌트
│ └── layout/ # 사이드바, 헤더
├── lib/
│ ├── db.ts # mysql2 연결 풀
│ └── utils.ts
├── types/
│ └── index.ts # DB 타입 정의
├── docs/
│ └── db-reference/
│ └── schema.sql
├── docker-compose.yml
├── docker-compose.prod.yml
├── Dockerfile
├── .env.local # (gitignore)
└── .env.production # (gitignore)
```
---
## 10. 보안 고려사항
- 관리자 전용 서비스이므로 외부 노출을 최소화 (NAS 내부 포트 또는 VPN 기반 접근 권장)
- `admin.Password`는 해시 검증 방식으로 NextAuth 연동 (기존 암호화 방식 확인 필요)
- DB 연결 정보는 `.env` 파일로 관리하며 Git에 포함하지 않음
- AWS EC2 보안그룹에서 MariaDB 포트(3306)를 NAS IP로만 허용
---
*작성일: 2026-05-26*
+501
View File
@@ -0,0 +1,501 @@
# choco-admin 개발 작업 계획
## 1. 프로젝트 개요
`choco-admin`은 기존 `chocomae` 웹 서비스의 관리자 페이지와 관리자 기능만 독립 분리하는 신규 관리자 웹 서비스이다.
- 기존 서비스명: `chocomae`
- 기존 서비스 개발 디렉토리: `/Users/jisangs/work/jinaju/git/web/mouse-typing`
- 신규 서비스명: `choco-admin`
- 신규 서비스 개발 디렉토리: `/Users/jisangs/work/jinaju/git/web/choco-admin`
- 개발 목표: 기존 `mouse-typing` 서비스의 관리자 기능을 Next.js 기반 독립 서비스로 재구성
- 기존 운영 환경: AWS EC2 `t3a.medium` 인스턴스 1개
- 신규 개발/운영 플랫폼: Synology NAS Docker
- 보유 NAS: Synology DS920+, RAM 20GB
## 2. 핵심 개발 방향
1. 기존 `chocomae` DB를 그대로 사용한다.
2. 관리자 UI와 서버 로직만 신규 Next.js 서비스로 분리한다.
3. 운영 DB 스키마를 임의 변경하지 않고, 기존 테이블과 상태값을 우선 존중한다.
4. 관리자 액션은 반드시 서버 사이드에서 권한 검증, 트랜잭션, 로그 기록을 거친다.
5. Synology NAS Docker에서 개발과 운영을 모두 재현 가능하게 구성한다.
## 3. 기술 스택 제안
### 기본 스택
- Runtime: Node.js LTS
- Framework: Next.js App Router
- Language: TypeScript
- Database: MariaDB
- DB Access: Prisma 또는 Drizzle ORM
- Auth: NextAuth/Auth.js 또는 자체 세션 기반 인증
- Validation: Zod
- Package Manager: pnpm
- Container: Docker, Docker Compose
### DB 접근 방식 추천
1. Prisma
- 장점: 타입 안정성, 마이그레이션/스키마 관리 경험이 좋고 개발 속도가 빠름
- 주의: 기존 MariaDB 스키마를 introspection해서 사용하는 방식이 적합함
2. Drizzle ORM
- 장점: SQL에 가까운 제어, 가벼움, 서버 액션/API Route와 잘 맞음
- 주의: 기존 DB 테이블 정의를 직접 코드로 옮기는 작업이 필요함
권장안: 초기 개발 생산성과 유지보수를 고려하면 Prisma를 우선 검토하고, 기존 DB 쿼리를 세밀하게 제어해야 하는 구간만 raw SQL을 병행한다.
## 4. CSS Framework 추천
관리자 서비스는 표, 검색, 필터, 상세 보기, 승인/거절 액션이 중심이므로 화려한 랜딩 페이지보다 유지보수성과 일관성이 중요하다.
### 1순위: Tailwind CSS + shadcn/ui
- 장점: Next.js와 궁합이 좋고, 관리자 화면에 필요한 버튼, 입력, 다이얼로그, 탭, 폼 구성이 빠름
- 장점: 컴포넌트 코드를 프로젝트 안에서 직접 소유하므로 장기 유지보수에 유리함
- 단점: Tailwind 클래스에 익숙해지는 시간이 필요함
- 추천 이유: `choco-admin`처럼 작은 팀/개인 프로젝트에서 빠르게 만들고 나중에 고치기 좋음
### 2순위: Mantine
- 장점: 컴포넌트가 풍부하고 Form, Modal, Table 주변 UI를 빠르게 만들기 좋음
- 장점: 테마 시스템과 훅이 잘 갖춰져 있음
- 단점: 디자인을 많이 커스터마이징하면 프레임워크 스타일에 묶일 수 있음
- 추천 이유: 관리자 도구를 빠르게 안정적인 UI로 완성하기 좋음
### 3순위: Chakra UI
- 장점: 접근성, 컴포넌트 API, 테마 관리가 안정적임
- 장점: Next.js 프로젝트에서 사용 사례가 많음
- 단점: 대량 데이터 테이블은 별도 라이브러리 조합이 필요함
- 추천 이유: 익숙한 컴포넌트 기반 개발을 선호할 때 적합함
최종 권장안: `Tailwind CSS + shadcn/ui`를 기본 UI 프레임워크로 사용한다.
## 5. Table 라이브러리 추천
관리자 화면은 마에스트로 목록, 연장 신청, 업그레이드 신청처럼 대부분 표 기반으로 운영되므로 정렬, 필터, 검색, 페이지네이션, 행 선택, 컬럼 표시 제어, 액션 버튼 확장이 쉬워야 한다.
### 1순위: TanStack Table
- 장점: headless 방식이라 UI 프레임워크와 자유롭게 결합 가능
- 장점: 서버 사이드 페이지네이션, 정렬, 필터링을 구현하기 좋음
- 장점: shadcn/ui의 Data Table 패턴과 잘 맞음
- 단점: 직접 조립해야 하는 부분이 있어 초기 구현량이 있음
- 추천 이유: 관리자 기능이 늘어날 가능성이 높은 `choco-admin`에 가장 유연함
### 2순위: AG Grid Community
- 장점: 엑셀 같은 고급 그리드 기능이 강함
- 장점: 컬럼 리사이즈, 고정 컬럼, 복잡한 필터 등 고급 기능이 풍부함
- 단점: UI가 무겁고, 일부 기능은 Enterprise 라이선스가 필요함
- 추천 이유: 향후 대량 데이터 운영 도구가 필요해질 때 적합함
### 3순위: Mantine React Table
- 장점: Mantine을 CSS/UI 프레임워크로 선택할 경우 통합 경험이 좋음
- 장점: TanStack Table 기반이라 기능 확장성이 좋음
- 단점: Mantine 생태계에 묶임
- 추천 이유: Mantine을 선택하는 경우 가장 빠르게 관리자 표를 만들 수 있음
최종 권장안: `TanStack Table + shadcn/ui Data Table` 조합을 사용한다.
## 6. DB 기준 관리자 대상 테이블
스키마 파일: `/Users/jisangs/work/jinaju/git/web/choco-admin/docs/db-reference/schema.sql`
### 주요 테이블
- `admin`: 관리자 계정
- `maestro`: 마에스트로 계정
- `maestro_extension`: 마에스트로 연장 신청
- `maestro_upgrade`: 마에스트로 업그레이드 신청
- `maestro_log`: 마에스트로 관련 처리 로그
- `player`: 마에스트로에 속한 학생/플레이어
### 주요 상태값
`maestro.ActivateStatus`
- `0`: 미승인
- `1`: 체험
- `2`: 활성화
- `100`: 등록취소
`maestro.AccountType`
- `1`: 20명
- `2`: 50명
- `3`: 100명
- `4`: 500명
- `5`: 1000명
`maestro_extension.Status`
- `1`: 요청
- `2`: 취소
- `3`: 연장 적용
`maestro_upgrade.Status`
- `1`: 요청
- `2`: 취소
- `3`: 업그레이드 적용
## 7. 주요 관리자 화면 계획
### 7.1 공통 레이아웃
- 로그인 화면
- 좌측 사이드바
- 상단 관리자 정보 영역
- 공통 검색/필터 패턴
- 공통 확인 다이얼로그
- 처리 성공/실패 토스트
- 접근 권한 없는 경우 안내 화면
### 7.2 마에스트로 전체 목록
목표: 전체 마에스트로 계정을 검색, 필터링, 확인할 수 있는 운영 화면을 만든다.
주요 기능:
- 전체 목록 조회
- 이름, 이메일, `MaestroID` 검색
- 계정 종류 필터
- 활성 상태 필터
- 가입/약관 동의/사용 가능 기간 기준 정렬
- 학생 수 표시
- 상세 화면 이동
표 주요 컬럼:
- `MaestroID`
- `Name`
- `Email`
- `AccountType`
- `ActivateStatus`
- `PlayerCount`
- `AvailableActivateDateTime`
- `AcceptClausesDateTime`
- `AllowEditEnterCode`
### 7.3 마에스트로 상세 정보 보기
목표: 특정 마에스트로의 계정 상태와 관련 신청 이력을 한 화면에서 확인한다.
주요 기능:
- 기본 계정 정보
- 현재 계정 종류/활성 상태 표시
- 학생 수 및 플레이어 목록 요약
- 최근 연장 신청 이력
- 최근 업그레이드 신청 이력
- 처리 로그 표시
확장 후보 기능:
- 계정 상태 수동 변경
- 학생 목록 상세 조회
- 입장번호 변경 허용 여부 수정
단, 확장 후보 기능은 기존 관리자 기능과 운영 정책 확인 후 별도 구현한다.
### 7.4 마에스트로 연장 신청 목록
목표: `maestro_extension`의 연장 요청을 검토하고 승인 또는 취소 처리한다.
주요 기능:
- 연장 신청 목록 조회
- 요청 상태별 필터
- 요청일 기준 정렬
- 마에스트로 정보 함께 표시
- 연장 승인
- 연장 취소
- 처리 후 `maestro_log` 기록
승인 처리 초안:
1. `maestro_extension.Status = 1`인지 확인한다.
2. 트랜잭션을 시작한다.
3. `maestro_extension.Status``3`으로 변경한다.
4. `maestro.AccountType`, `AvailableActivateDateTime`, `ActivateStatus` 갱신 규칙을 기존 서비스에서 확인해 동일하게 적용한다.
5. `maestro_log`에 처리 기록을 남긴다.
6. 트랜잭션을 커밋한다.
취소 처리 초안:
1. `maestro_extension.Status = 1`인지 확인한다.
2. 트랜잭션을 시작한다.
3. `maestro_extension.Status``2`로 변경한다.
4. `maestro_log`에 취소 기록을 남긴다.
5. 트랜잭션을 커밋한다.
### 7.5 마에스트로 업그레이드 신청 목록
목표: `maestro_upgrade`의 업그레이드 요청을 검토하고 승인 또는 거절 처리한다.
주요 기능:
- 업그레이드 신청 목록 조회
- 요청 상태별 필터
- 현재 계정 종류와 요청 계정 종류 비교 표시
- 요청일 기준 정렬
- 업그레이드 승인
- 업그레이드 거절
- 처리 후 `maestro_log` 기록
승인 처리 초안:
1. `maestro_upgrade.Status = 1`인지 확인한다.
2. 트랜잭션을 시작한다.
3. `maestro_upgrade.Status``3`으로 변경한다.
4. `maestro.AccountType``RequestedAccountType`으로 변경한다.
5. 필요 시 `PlayerCount` 정책을 기존 서비스에서 확인해 반영한다.
6. `maestro_log`에 처리 기록을 남긴다.
7. 트랜잭션을 커밋한다.
거절 처리 초안:
1. `maestro_upgrade.Status = 1`인지 확인한다.
2. 트랜잭션을 시작한다.
3. `maestro_upgrade.Status``2`로 변경한다.
4. `maestro_log`에 거절 기록을 남긴다.
5. 트랜잭션을 커밋한다.
## 8. 애플리케이션 구조 제안
```text
choco-admin/
app/
login/
maestros/
page.tsx
[maestroId]/
page.tsx
extension-requests/
page.tsx
upgrade-requests/
page.tsx
api/
components/
layout/
data-table/
forms/
dialogs/
lib/
auth/
db/
validators/
constants/
docs/
db-reference/
schema.sql
project-plan.md
prisma/
schema.prisma
docker/
docker-compose.yml
Dockerfile
```
## 9. Docker 개발/운영 계획
### 개발 환경
- Synology NAS Docker에서 Next.js 컨테이너 실행
- 개발 DB는 `localhost` MariaDB 사용
- `.env.local`로 DB 접속 정보 관리
- 개발 DB는 운영 DB 덤프에서 민감 정보를 제거한 샘플 데이터 사용 권장
### 운영 환경
- Synology NAS Docker에서 `choco-admin` 컨테이너 실행
- 운영 DB는 기존 AWS EC2 MariaDB에 접속
- AWS 보안 그룹에서 Synology NAS 공인 IP만 MariaDB 접속 허용
- DB 계정은 관리자 서비스 전용 계정으로 분리
- 최소 권한 원칙 적용
- 운영 배포 시 환경변수는 Synology Container Manager 또는 `.env.production`으로 관리
### Docker 구성 초안
- `Dockerfile`: Next.js production build
- `docker-compose.yml`: app service 정의
- `healthcheck`: HTTP 상태 확인 엔드포인트 사용
- `restart: unless-stopped`
- 로그는 Docker 기본 로그 또는 Synology 로그 수집 방식 사용
## 10. 보안 계획
1. 관리자 로그인은 서버 세션 기반으로 구현한다.
2. 관리자 비밀번호 저장 방식은 기존 `admin.Password` 구조를 확인한 뒤 개선 가능성을 검토한다.
3. 운영 DB 접속 정보는 저장소에 커밋하지 않는다.
4. 승인/취소/거절 같은 변경 액션은 CSRF 또는 서버 액션 보호를 적용한다.
5. 관리자 액션은 `maestro_log`에 기록한다.
6. 운영 DB 직접 수정 기능은 최소화한다.
7. 승인/거절 API는 중복 처리 방지를 위해 현재 상태를 조건으로 검사한다.
8. 모든 변경 작업은 트랜잭션으로 처리한다.
## 11. 개발 단계별 작업 계획
### Phase 0. 기존 관리자 기능 조사
- 기존 `mouse-typing` 코드에서 관리자 라우트와 처리 로직 조사
- 연장 승인 시 `AvailableActivateDateTime` 계산 방식 확인
- 업그레이드 승인 시 `PlayerCount``AccountType` 처리 방식 확인
- 기존 `admin.Password` 검증 방식 확인
- 기존 로그 기록 형식 확인
완료 기준:
- 기존 관리자 처리 규칙을 문서화한다.
- 신규 서비스에서 재현해야 할 비즈니스 규칙을 확정한다.
### Phase 1. 프로젝트 초기화
- Next.js + TypeScript 프로젝트 생성
- ESLint, Prettier 설정
- Tailwind CSS + shadcn/ui 설정
- 기본 레이아웃 구성
- 환경변수 구조 정의
- Dockerfile, docker-compose 초안 작성
완료 기준:
- 로컬 또는 Synology Docker에서 기본 페이지가 실행된다.
### Phase 2. DB 연결 및 타입 구성
- MariaDB 연결 설정
- Prisma introspection 또는 Drizzle schema 작성
- DB 연결 헬퍼 구현
- 상태값 상수화
- 공통 날짜/계정 종류 표시 유틸 작성
완료 기준:
- 개발 DB에서 `maestro`, `maestro_extension`, `maestro_upgrade` 조회가 가능하다.
### Phase 3. 인증과 관리자 세션
- 로그인 화면 구현
- 관리자 계정 검증
- 세션 생성/만료 처리
- 보호 라우트 처리
- 로그아웃 구현
완료 기준:
- 로그인하지 않은 사용자는 관리자 화면에 접근할 수 없다.
- 로그인한 관리자만 목록과 상세 화면에 접근할 수 있다.
### Phase 4. 마에스트로 목록/상세 화면
- 마에스트로 목록 API 또는 서버 액션 구현
- TanStack Table 기반 목록 화면 구현
- 검색, 필터, 정렬, 페이지네이션 구현
- 상세 화면 구현
- 상세 화면에서 연장/업그레이드/로그 요약 표시
완료 기준:
- 운영자가 마에스트로를 빠르게 검색하고 상세 정보를 확인할 수 있다.
### Phase 5. 연장 신청 관리
- 연장 신청 목록 구현
- 상태 필터와 검색 구현
- 승인/취소 확인 다이얼로그 구현
- 승인/취소 서버 액션 구현
- 트랜잭션과 로그 기록 적용
완료 기준:
- 요청 상태의 연장 신청을 승인 또는 취소할 수 있다.
- 중복 처리와 이미 처리된 건의 재처리가 방지된다.
### Phase 6. 업그레이드 신청 관리
- 업그레이드 신청 목록 구현
- 현재/요청 계정 비교 표시
- 승인/거절 확인 다이얼로그 구현
- 승인/거절 서버 액션 구현
- 트랜잭션과 로그 기록 적용
완료 기준:
- 요청 상태의 업그레이드 신청을 승인 또는 거절할 수 있다.
- 처리 결과가 마에스트로 계정에 정확히 반영된다.
### Phase 7. 운영 배포 준비
- Synology NAS Docker Compose 운영 설정 작성
- 운영 환경변수 정리
- AWS EC2 MariaDB 접근 보안 그룹 설정 가이드 작성
- 백업/롤백 절차 작성
- 관리자 액션 테스트 체크리스트 작성
완료 기준:
- Synology NAS에서 운영 컨테이너를 실행할 수 있다.
- 운영 DB 연결 전 점검 항목이 문서화된다.
### Phase 8. 검증 및 안정화
- 주요 화면 수동 테스트
- 승인/취소/거절 트랜잭션 테스트
- 권한 없는 접근 테스트
- Docker 재시작 테스트
- 운영 DB read-only 리허설 후 실제 변경 기능 활성화
완료 기준:
- 핵심 관리자 업무가 신규 서비스에서 안정적으로 수행된다.
## 12. 우선 확인이 필요한 질문
1. 기존 `mouse-typing` 관리자 코드에서 연장 승인 시 정확히 며칠/몇 개월을 연장하는가?
2. 업그레이드 승인 시 `PlayerCount`를 즉시 변경하는가, 아니면 `AccountType`만 변경하는가?
3. `admin.Password`는 평문, 해시, 자체 암호화 중 어떤 방식인가?
4. 운영 MariaDB가 외부 접속을 허용할 수 있는 네트워크 구조인가?
5. 관리자 계정은 기존 `admin` 테이블을 그대로 사용할 것인가, 신규 인증 테이블을 둘 것인가?
6. 운영 초기에 읽기 전용 모드로 먼저 배포한 뒤 변경 기능을 켤 것인가?
## 13. 추천 MVP 범위
1차 MVP는 아래 기능까지만 포함한다.
- 관리자 로그인
- 마에스트로 전체 목록
- 마에스트로 상세 정보 보기
- 연장 신청 목록
- 연장 승인/취소
- 업그레이드 신청 목록
- 업그레이드 승인/거절
- 관리자 액션 로그 기록
- Docker 기반 실행
MVP 이후 확장 후보:
- 관리자 계정 관리
- 마에스트로 상태 직접 변경
- 학생 목록 상세 관리
- 데이터 내보내기 CSV
- 처리 통계 대시보드
- 감사 로그 전용 화면
## 14. 최종 추천 조합
- Framework: Next.js App Router
- Language: TypeScript
- UI/CSS: Tailwind CSS + shadcn/ui
- Table: TanStack Table
- DB: MariaDB 기존 `chocomae` DB
- ORM: Prisma 우선 검토
- Validation: Zod
- Runtime/Deploy: Docker on Synology NAS
- 운영 DB 연결: AWS EC2 MariaDB에 제한된 IP와 전용 계정으로 접속
+409
View File
@@ -0,0 +1,409 @@
# choco-admin 프로젝트 계획서
## 1. 프로젝트 개요
| 항목 | 내용 |
|---|---|
| 서비스명 | choco-admin |
| 목적 | chocomae 웹 서비스(mouse-typing)의 관리자 기능을 독립 웹 서비스로 분리 |
| 기존 서비스 경로 | `/Users/jisangs/work/jinaju/git/web/mouse-typing` |
| 신규 서비스 경로 | `/Users/jisangs/work/jinaju/git/web/choco-admin` |
| 기존 운영 환경 | AWS EC2 t3a.medium 인스턴스 1개 |
| 사용 DB | 기존 chocomae DB (MariaDB 10.11.13) 그대로 사용 |
---
## 2. 핵심 개발 방향
1. 기존 `chocomae` DB를 그대로 사용한다. DB 스키마는 임의로 변경하지 않는다.
2. 관리자 UI와 서버 로직만 신규 Next.js 서비스로 분리한다.
3. 기존 테이블 구조와 상태값을 그대로 존중하고, 기존 서비스의 비즈니스 규칙을 먼저 파악한 뒤 동일하게 구현한다.
4. 승인·취소·거절 같은 변경 액션은 반드시 서버 사이드에서 권한 검증 → 트랜잭션 → 로그 기록 순서로 처리한다.
5. 중복 처리 방지를 위해 모든 변경 API는 현재 상태를 조건으로 먼저 검사한다.
---
## 3. 기술 스택
| 구분 | 기술 |
|---|---|
| 런타임 | Node.js LTS |
| 프레임워크 | Next.js 15 (App Router) |
| 언어 | TypeScript |
| 패키지 매니저 | pnpm |
| UI / CSS | Tailwind CSS + shadcn/ui |
| Table | TanStack Table (React Table v8) |
| DB 클라이언트 | mysql2 (MariaDB 호환) |
| ORM | Prisma (기존 DB introspection 방식으로 활용) |
| 유효성 검증 | Zod |
| 인증 | NextAuth.js v5 (기존 `admin` 테이블 활용) |
| 환경변수 관리 | `.env.local` / `.env.production` |
### Prisma vs Drizzle ORM
두 가지 모두 MariaDB를 지원하나, 이 프로젝트에서는 **Prisma**를 우선 사용한다.
- 기존 DB를 `prisma db pull`(introspection)로 그대로 가져올 수 있어 초기 세팅이 빠름
- TypeScript 타입 자동 생성으로 컬럼명 오타를 컴파일 단계에서 잡을 수 있음
- 세밀한 SQL 제어가 필요한 구간은 `$queryRaw` / `$executeRaw`로 raw SQL 병행 가능
---
## 4. 개발 환경 및 배포 환경
### 4-1. 개발 환경
| 항목 | 내용 |
|---|---|
| 하드웨어 | 맥미니 |
| IDE | IntelliJ IDEA |
| 실행 방법 | IntelliJ 터미널에서 `pnpm dev` |
| 포트 | 3001 (기존 mouse-typing과 충돌 방지) |
| DB (개발) | 맥미니 로컬 MariaDB (`localhost:3306`) |
| 환경변수 | `.env.local` |
### 4-2. 배포(서비스) 환경
| 항목 | 내용 |
|---|---|
| 플랫폼 | Synology NAS DS920+ (RAM 20GB) — Docker |
| 실행 방법 | Synology Container Manager (`docker compose up`) |
| DB (서비스) | AWS EC2 MariaDB (chocomae 서비스와 동일 인스턴스) |
| DB 접근 | AWS 보안그룹에서 NAS 외부 IP만 3306 포트 허용 |
| DB 계정 | choco-admin 전용 최소 권한 계정으로 분리 |
| 환경변수 | `.env.production` 또는 Container Manager 환경변수 설정 |
### 4-3. Dockerfile / docker-compose (배포용)
```dockerfile
# Dockerfile
FROM node:22-alpine
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
CMD ["pnpm", "start"]
```
```yaml
# docker-compose.yml
services:
choco-admin:
build: .
ports:
- "3001:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=mysql://USER:PASS@AWS_EC2_HOST:3306/chocomae
- NEXTAUTH_SECRET=...
- NEXTAUTH_URL=http://NAS_IP:3001
restart: unless-stopped
```
---
## 5. 데이터베이스 주요 테이블
스키마: [`docs/db-reference/schema.sql`](./db-reference/schema.sql)
| 테이블 | 설명 | 주요 컬럼 |
|---|---|---|
| `maestro` | 마에스트로(강사) 계정 | `MaestroID`, `Name`, `Email`, `AccountType`, `ActivateStatus`, `AvailableActivateDateTime`, `PlayerCount` |
| `maestro_extension` | 연장 신청 | `MaestroExtensionID`, `MaestroID`, `AccountType`, `RequestedDateTime`, `Status` |
| `maestro_upgrade` | 업그레이드 신청 | `MaestroUpgradeID`, `MaestroID`, `RegisteredAccountType`, `RequestedAccountType`, `RequestedDateTime`, `Status` |
| `maestro_log` | 처리 이력 로그 | `MaestroLogID`, `MaestroID`, `Type`, `LogDateTime`, `Remark` |
| `admin` | 관리자 계정 | `AdminID`, `Name`, `Password`, `Email`, `AccountType`, `ActivateStatus` |
| `player` | 학생 계정 | `PlayerID`, `MaestroID`, `Name`, `EnterCode` |
### 상태값 코드표
**`maestro.AccountType`**
| 값 | 의미 |
|---|---|
| 1 | 20명 (1만원) |
| 2 | 50명 (2만원) |
| 3 | 100명 (3만원) |
| 4 | 500명 (4만원) |
| 5 | 1,000명 (5만원) |
**`maestro.ActivateStatus`**
| 값 | 의미 |
|---|---|
| 0 | 미승인 |
| 1 | 체험 |
| 2 | 활성화 |
| 100 | 등록취소 |
**`maestro_extension.Status` / `maestro_upgrade.Status`**
| 값 | 의미 |
|---|---|
| 1 | 요청 |
| 2 | 취소/거절 |
| 3 | 적용 완료 |
---
## 6. 애플리케이션 구조
```
choco-admin/
├── app/
│ ├── (auth)/
│ │ └── login/
│ │ └── page.tsx # 관리자 로그인
│ ├── (admin)/
│ │ ├── layout.tsx # 공통 사이드바 + 헤더
│ │ ├── maestros/
│ │ │ ├── page.tsx # 마에스트로 전체 목록
│ │ │ └── [maestroId]/
│ │ │ └── page.tsx # 마에스트로 상세 정보
│ │ ├── extension-requests/
│ │ │ └── page.tsx # 연장 신청 목록 + 승인/취소
│ │ └── upgrade-requests/
│ │ └── page.tsx # 업그레이드 신청 목록 + 승인/거절
│ └── api/
│ ├── auth/[...nextauth]/
│ ├── maestros/
│ │ ├── route.ts # GET: 목록
│ │ └── [id]/route.ts # GET: 상세, PATCH: 상태 변경
│ ├── extension-requests/
│ │ └── [id]/route.ts # PATCH: 승인/취소
│ └── upgrade-requests/
│ └── [id]/route.ts # PATCH: 승인/거절
├── components/
│ ├── ui/ # shadcn/ui 컴포넌트
│ ├── data-table/ # TanStack Table 공통 컴포넌트
│ ├── layout/ # 사이드바, 헤더
│ ├── forms/
│ └── dialogs/ # 승인/취소 확인 다이얼로그
├── lib/
│ ├── db.ts # Prisma Client 싱글톤
│ ├── auth.ts # NextAuth 설정
│ ├── validators/ # Zod 스키마
│ └── constants.ts # 상태값 상수
├── types/
│ └── index.ts
├── prisma/
│ └── schema.prisma # DB introspection 결과
├── docs/
│ └── db-reference/
│ └── schema.sql
├── .env.local # gitignore
├── .env.production # gitignore
├── Dockerfile
└── docker-compose.yml
```
---
## 7. 주요 화면 기능 명세
### 7-1. 공통 레이아웃
- 로그인 화면 (미인증 시 `/login` 리다이렉트)
- 좌측 사이드바 네비게이션
- 공통 확인 다이얼로그 (승인/취소/거절 전 확인)
- 처리 성공/실패 토스트 알림
### 7-2. 마에스트로 전체 목록 (`/maestros`)
- 전체 목록 조회 (서버 사이드 페이지네이션)
- 검색: 이름, 이메일, MaestroID
- 필터: ActivateStatus (미승인 / 체험 / 활성화 / 등록취소)
- 필터: AccountType (20명 / 50명 / 100명 / 500명 / 1,000명)
- 정렬: 가입일, 사용 가능일
- 컬럼: ID / 이름 / 이메일 / 계정 유형 / 상태 / 학생 수 / 사용 가능일 / 상세보기
### 7-3. 마에스트로 상세 정보 (`/maestros/[maestroId]`)
- 기본 계정 정보 (이름, 이메일, 계정 유형, 상태, 만료일, 약관 동의일)
- 플레이어(학생) 목록 요약
- 연장 신청 이력
- 업그레이드 신청 이력
- 관리자 처리 로그 (`maestro_log`)
### 7-4. 연장 신청 목록 (`/extension-requests`)
- 연장 신청 목록 조회 (기본 필터: Status=1 요청 건)
- 필터: 상태 (요청 / 취소 / 적용)
- 컬럼: 신청ID / 마에스트로명 / 계정유형 / 신청일시 / 상태 / 승인 / 취소
**승인 처리 순서:**
1. `maestro_extension.Status = 1` 인지 확인 (중복 처리 방지)
2. 트랜잭션 시작
3. `maestro_extension.Status → 3`
4. `maestro.AvailableActivateDateTime` 연장, `maestro.ActivateStatus → 2` (기존 서비스 로직 확인 후 동일 적용)
5. `maestro_log` 기록
6. 트랜잭션 커밋
**취소 처리 순서:**
1. `maestro_extension.Status = 1` 인지 확인
2. 트랜잭션 시작
3. `maestro_extension.Status → 2`
4. `maestro_log` 기록
5. 트랜잭션 커밋
### 7-5. 업그레이드 신청 목록 (`/upgrade-requests`)
- 업그레이드 신청 목록 조회 (기본 필터: Status=1 요청 건)
- 필터: 상태 (요청 / 취소 / 적용)
- 컬럼: 신청ID / 마에스트로명 / 현재등급 / 요청등급 / 신청일시 / 상태 / 승인 / 거절
**승인 처리 순서:**
1. `maestro_upgrade.Status = 1` 인지 확인 (중복 처리 방지)
2. 트랜잭션 시작
3. `maestro_upgrade.Status → 3`
4. `maestro.AccountType → RequestedAccountType` 변경 (PlayerCount 갱신 정책은 기존 서비스 확인 후 동일 적용)
5. `maestro_log` 기록
6. 트랜잭션 커밋
**거절 처리 순서:**
1. `maestro_upgrade.Status = 1` 인지 확인
2. 트랜잭션 시작
3. `maestro_upgrade.Status → 2`
4. `maestro_log` 기록
5. 트랜잭션 커밋
---
## 8. 보안 고려사항
1. 관리자 로그인은 NextAuth 서버 세션 기반으로 구현한다.
2. 기존 `admin.Password` 저장 방식(평문/해시/자체 암호화)을 먼저 확인한 뒤 동일 방식 또는 해시 업그레이드를 결정한다.
3. 승인·취소·거절 액션은 Next.js Server Action 또는 API Route에서 CSRF 보호를 적용한다.
4. DB 연결 정보는 `.env` 파일로 관리하며 Git에 커밋하지 않는다.
5. 배포 DB 계정은 choco-admin 전용 계정으로 분리하고 최소 권한(SELECT + 필요한 테이블만 UPDATE)을 적용한다.
6. AWS EC2 보안그룹에서 MariaDB 포트(3306)를 NAS 외부 IP로만 허용한다.
7. 관리자 전용 서비스이므로 외부에 직접 노출하지 않고 VPN 또는 NAS 내부 포트로 접근하는 방식을 권장한다.
---
## 9. 개발 단계 계획
### Phase 0. 기존 관리자 코드 조사
> 기존 서비스 비즈니스 규칙을 파악해 재현 실수를 방지한다.
- [ ] `mouse-typing` 관리자 라우트와 처리 로직 분석 (`src/web/admin/`, `src/web/server/admin/`)
- [ ] 연장 승인 시 `AvailableActivateDateTime` 계산 방식 확인 (몇 개월/년 연장인지)
- [ ] 업그레이드 승인 시 `PlayerCount` 갱신 여부 확인
- [ ] `admin.Password` 검증 방식 확인 (평문 / MD5 / bcrypt 등)
- [ ] `maestro_log` 기록 형식(`Type`, `Remark`) 확인
- [ ] 조사 결과를 `docs/business-rules.md`에 문서화
### Phase 1. 프로젝트 초기화
- [ ] `pnpm create next-app` (Next.js 15, TypeScript, App Router, Tailwind CSS)
- [ ] shadcn/ui 초기화 (`pnpm dlx shadcn@latest init`)
- [ ] TanStack Table 설치 (`pnpm add @tanstack/react-table`)
- [ ] Prisma 설치 및 MariaDB introspection (`pnpm add prisma`, `prisma db pull`)
- [ ] Zod 설치 (`pnpm add zod`)
- [ ] NextAuth.js v5 설치
- [ ] ESLint / Prettier 설정
- [ ] `.env.local` 환경변수 구조 정의
- [ ] IntelliJ에서 `pnpm dev` 실행 확인
### Phase 2. DB 연결 및 타입 구성
- [ ] Prisma Client 싱글톤 (`lib/db.ts`)
- [ ] 상태값 상수 정의 (`lib/constants.ts`)
- [ ] 공통 유틸 작성 (날짜 포맷, AccountType 레이블 변환 등)
- [ ] 개발 DB에서 `maestro`, `maestro_extension`, `maestro_upgrade` 조회 확인
### Phase 3. 인증 및 공통 레이아웃
- [ ] 로그인 페이지 (`/login`)
- [ ] NextAuth Credentials Provider — `admin` 테이블 기반 검증
- [ ] 인증 미들웨어 (`middleware.ts`) — 비로그인 시 `/login` 리다이렉트
- [ ] 공통 레이아웃 (`(admin)/layout.tsx`) — 사이드바, 헤더
- [ ] 로그아웃 기능
### Phase 4. 마에스트로 목록 및 상세
- [ ] 마에스트로 목록 API (`GET /api/maestros`) — 검색·필터·페이지네이션 포함
- [ ] TanStack Table 기반 목록 화면
- [ ] 마에스트로 상세 API (`GET /api/maestros/[id]`)
- [ ] 상세 화면 — 연장/업그레이드 이력, 학생 목록 요약, 처리 로그
### Phase 5. 연장 신청 관리
- [ ] 연장 신청 목록 API + 화면
- [ ] 승인/취소 확인 다이얼로그 (shadcn/ui AlertDialog)
- [ ] 승인 API (`PATCH /api/extension-requests/[id]`) — 트랜잭션 + maestro_log
- [ ] 취소 API — 트랜잭션 + maestro_log
### Phase 6. 업그레이드 신청 관리
- [ ] 업그레이드 신청 목록 API + 화면
- [ ] 승인/거절 확인 다이얼로그
- [ ] 승인 API (`PATCH /api/upgrade-requests/[id]`) — 트랜잭션 + maestro_log
- [ ] 거절 API — 트랜잭션 + maestro_log
### Phase 7. 배포 환경 구성
- [ ] Dockerfile (프로덕션용 pnpm 빌드)
- [ ] `docker-compose.yml` (Synology NAS Container Manager용)
- [ ] AWS EC2 보안그룹 인바운드 설정 (NAS IP → 3306 허용)
- [ ] Synology NAS에서 컨테이너 실행 테스트
- [ ] 운영 DB read-only 리허설 후 변경 기능 활성화
### Phase 8. 검증 및 안정화
- [ ] 승인/취소/거절 트랜잭션 시나리오 테스트
- [ ] 중복 처리 방지 (이미 처리된 건 재처리 시 에러 확인)
- [ ] 비인증 접근 차단 확인
- [ ] Docker 재시작 후 정상 동작 확인
---
## 10. MVP 범위
**1차 MVP (위 Phase 0~7):**
- 관리자 로그인
- 마에스트로 전체 목록 및 상세 정보 보기
- 연장 신청 목록 / 승인 / 취소
- 업그레이드 신청 목록 / 승인 / 거절
- 관리자 액션 로그 기록
- Docker 기반 NAS 배포
**MVP 이후 확장 후보:**
- 마에스트로 상태 직접 변경
- 학생 목록 상세 관리
- 데이터 내보내기 (CSV)
- 처리 통계 대시보드
- 감사 로그 전용 화면
- 관리자 계정 관리
---
## 11. 구현 전 확인이 필요한 사항
기존 `mouse-typing` 서비스 코드(`src/web/server/admin/`)에서 반드시 확인해야 할 비즈니스 규칙들이다.
1. 연장 승인 시 `AvailableActivateDateTime`을 정확히 얼마나 연장하는가? (1년? 계정 유형별 다름?)
: 계정 유형별로 차이 없고, 1년 연장
2. 업그레이드 승인 시 `PlayerCount`를 즉시 변경하는가, 아니면 `AccountType`만 변경하는가?
: AccountType만 변경
3. `admin.Password`는 어떤 방식으로 저장/검증되는가? (평문, MD5, bcrypt 등)
: MariaDB의 Password() 함수를 이용해서 저장/검증됨
4. `maestro_log``Type` 컬럼에 어떤 값들이 사용되는가? (`Remark` 형식 포함)
: 다음과 같은 값들이 사용됨
* add_maestro
* update_maestro
* add_maestro
* register_maestro
* update_maestro_name
* extension_maestro
* upgrade_maestro
* update_maestro_email
5. 운영 MariaDB가 외부 IP 접속을 허용할 수 있는 네트워크 구조인가?
: 외부 IP 접속을 허용하고 있다
---
*작성일: 2026-05-26*