# 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*