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 완벽 호환
- 단점: 기능을 직접 조립해야 하므로 초기 설정 비용이 있음
- 대용량 데이터에 특화된 고성능 그리드 라이브러리
- 정렬, 필터, 그룹핑, 엑셀 내보내기, 인라인 편집 등 풍부한 기능이 내장
- 무료 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 구성 계획
5-4. Dockerfile 계획
6. 데이터베이스 주요 테이블 정리
스키마: docs/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)
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. 프로젝트 초기화 및 환경 구성
Phase 2. 공통 레이아웃 및 인증
Phase 3. 마에스트로 관리
Phase 4. 연장 신청 관리
Phase 5. 업그레이드 신청 관리
Phase 6. 배포 환경 구성
9. 디렉토리 구조 (목표)
10. 보안 고려사항
- 관리자 전용 서비스이므로 외부 노출을 최소화 (NAS 내부 포트 또는 VPN 기반 접근 권장)
admin.Password는 해시 검증 방식으로 NextAuth 연동 (기존 암호화 방식 확인 필요)
- DB 연결 정보는
.env 파일로 관리하며 Git에 포함하지 않음
- AWS EC2 보안그룹에서 MariaDB 포트(3306)를 NAS IP로만 허용
작성일: 2026-05-26