Files
todos2/docs/PLAN.md
jungwoo choi 074b5133bf feat: 풀스택 할일관리 앱 구현 (통합 모달 + 간트차트)
- Backend: FastAPI + MongoDB + Redis (카테고리, 할일 CRUD, 파일 첨부, 검색, 대시보드)
- Frontend: Next.js 15 + Tailwind + React Query + Zustand
- 통합 TodoModal: 생성/수정 모달 통합, 탭 구조 (기본/태그와 첨부)
- 간트차트: 카테고리별 할일 타임라인 시각화
- TodoCard: 제목/카테고리/우선순위/태그/첨부 한줄 표시
- Docker Compose 배포 (Frontend:3010, Backend:8010, MongoDB:27021, Redis:6391)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 15:45:03 +09:00

8.8 KiB

todos2 - 전략 기획안 (Strategic Plan)

버전: 1.0.0 | 작성일: 2026-02-10 | 상태: 기획 완료

1. 프로젝트 개요

todos2는 단순 할일 관리를 넘어, 카테고리/태그/우선순위/마감일/검색/대시보드 기능을 갖춘 확장형 할일 관리 애플리케이션이다.

1.1 목표

  • 할일의 체계적 분류 및 관리 (카테고리, 태그, 우선순위)
  • 마감일 기반 일정 관리 및 시각적 알림
  • 검색 및 필터링을 통한 빠른 할일 탐색
  • 대시보드를 통한 진행 현황 한눈에 파악
  • 일괄 작업을 통한 효율적인 다중 할일 처리

1.2 대상 사용자

  • 개인 할일 관리가 필요한 사용자
  • 프로젝트별/카테고리별 작업 분류가 필요한 사용자

2. 핵심 기능

# 기능 설명 우선순위
1 할일 CRUD 할일 생성, 조회, 수정, 삭제 Must
2 카테고리 관리 카테고리 CRUD, 할일별 카테고리 분류 Must
3 태그 시스템 할일에 다중 태그 부여, 태그별 필터링 Must
4 우선순위 높음/중간/낮음 3단계 우선순위 설정 Must
5 마감일 관리 마감일 설정, 임박/초과 알림 표시 Must
6 검색 제목/내용/태그 기반 전문 검색 Should
7 대시보드 완료율, 카테고리별/우선순위별 통계 차트 Should
8 일괄 작업 다중 선택 후 완료/삭제/카테고리 변경 Should

3. 기술 스택

3.1 백엔드

기술 버전 용도
Python 3.11 런타임
FastAPI >= 0.104 REST API 프레임워크
Motor >= 3.3 MongoDB 비동기 드라이버
Pydantic v2 >= 2.5 데이터 검증 및 직렬화
Uvicorn >= 0.24 ASGI 서버
Redis (aioredis) >= 2.0 캐싱 (대시보드 통계)

3.2 프론트엔드

기술 버전 용도
Next.js 15 (App Router) React 프레임워크
TypeScript 5.x 타입 안정성
Tailwind CSS 4.x 유틸리티 기반 스타일링
shadcn/ui latest UI 컴포넌트 라이브러리
Recharts 2.x 대시보드 차트
Tanstack Query 5.x 서버 상태 관리 및 캐싱
Zustand 5.x 클라이언트 상태 관리

3.3 인프라

기술 용도
MongoDB 7.0 메인 데이터베이스
Redis 7 캐싱 레이어
Docker Compose 로컬 개발 환경

4. 프로젝트 구조

todos2/
├── docker-compose.yml
├── CLAUDE.md
├── PLAN.md
├── FEATURE_SPEC.md
├── SCREEN_DESIGN.pptx
├── SCREEN_DESIGN.md
│
├── backend/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── app/
│       ├── __init__.py
│       ├── main.py              # FastAPI 앱 진입점
│       ├── database.py          # MongoDB 연결 설정
│       ├── models/
│       │   ├── __init__.py
│       │   ├── todo.py          # Todo 모델
│       │   ├── category.py      # Category 모델
│       │   └── tag.py           # Tag 모델
│       ├── routers/
│       │   ├── __init__.py
│       │   ├── todos.py         # 할일 CRUD API
│       │   ├── categories.py    # 카테고리 API
│       │   ├── tags.py          # 태그 API
│       │   ├── search.py        # 검색 API
│       │   ├── dashboard.py     # 대시보드 통계 API
│       │   └── batch.py         # 일괄 작업 API
│       └── services/
│           ├── __init__.py
│           ├── todo_service.py
│           ├── category_service.py
│           ├── tag_service.py
│           ├── search_service.py
│           └── dashboard_service.py
│
└── frontend/
    ├── Dockerfile
    ├── package.json
    ├── next.config.ts
    ├── tailwind.config.ts
    ├── tsconfig.json
    └── src/
        ├── app/
        │   ├── layout.tsx           # 루트 레이아웃
        │   ├── page.tsx             # 대시보드 (메인)
        │   ├── todos/
        │   │   └── page.tsx         # 할일 목록
        │   ├── categories/
        │   │   └── page.tsx         # 카테고리 관리
        │   └── search/
        │       └── page.tsx         # 검색 결과
        ├── components/
        │   ├── layout/
        │   │   ├── Header.tsx
        │   │   ├── Sidebar.tsx
        │   │   └── MainLayout.tsx
        │   ├── todos/
        │   │   ├── TodoCard.tsx
        │   │   ├── TodoForm.tsx
        │   │   ├── TodoList.tsx
        │   │   ├── TodoFilter.tsx
        │   │   └── BatchActions.tsx
        │   ├── categories/
        │   │   ├── CategoryList.tsx
        │   │   └── CategoryForm.tsx
        │   ├── tags/
        │   │   ├── TagBadge.tsx
        │   │   ├── TagSelect.tsx
        │   │   └── TagManager.tsx
        │   ├── dashboard/
        │   │   ├── StatsCards.tsx
        │   │   ├── CompletionChart.tsx
        │   │   ├── CategoryChart.tsx
        │   │   └── PriorityChart.tsx
        │   └── search/
        │       ├── SearchBar.tsx
        │       └── SearchResults.tsx
        ├── hooks/
        │   ├── useTodos.ts
        │   ├── useCategories.ts
        │   ├── useTags.ts
        │   ├── useDashboard.ts
        │   └── useSearch.ts
        ├── lib/
        │   ├── api.ts               # API 클라이언트
        │   └── utils.ts             # 유틸리티 함수
        ├── store/
        │   └── uiStore.ts           # UI 상태 (사이드바, 필터 등)
        └── types/
            └── index.ts             # TypeScript 타입 정의

5. 데이터 모델

5.1 Todo

{
  "_id": "ObjectId",
  "title": "string (필수, 1~200자)",
  "content": "string (선택, 최대 2000자)",
  "completed": "boolean (기본: false)",
  "priority": "enum: high | medium | low (기본: medium)",
  "category_id": "ObjectId | null",
  "tags": ["string"],
  "due_date": "datetime | null",
  "created_at": "datetime",
  "updated_at": "datetime"
}

5.2 Category

{
  "_id": "ObjectId",
  "name": "string (필수, 1~50자, 고유)",
  "color": "string (hex color, 기본: #6B7280)",
  "order": "integer (정렬 순서)",
  "created_at": "datetime"
}

5.3 Tag (인라인)

태그는 별도 컬렉션 없이 Todo 문서 내 배열로 관리한다. 태그 목록은 todos 컬렉션에서 distinct 쿼리로 추출한다.


6. 개발 우선순위 (Phase별)

Phase 1: 핵심 기반 (MVP)

목표: 기본 할일 관리가 가능한 최소 기능 제품

  1. 프로젝트 초기 세팅 (백엔드/프론트엔드 스캐폴딩)
  2. MongoDB 연결 및 데이터 모델 정의
  3. 할일 CRUD API + UI
  4. 카테고리 CRUD API + UI
  5. 기본 레이아웃 (Header, Sidebar, MainLayout)

Phase 2: 확장 기능

목표: 분류/필터/우선순위로 할일 관리 고도화

  1. 태그 시스템 (태그 입력, 표시, 필터링)
  2. 우선순위 설정 (높음/중간/낮음)
  3. 마감일 설정 및 임박/초과 알림 UI
  4. 검색 기능 (제목/내용/태그)

Phase 3: 분석 및 효율

목표: 통계 및 일괄 작업으로 생산성 향상

  1. 대시보드 통계 API
  2. 대시보드 차트 UI (완료율, 카테고리별, 우선순위별)
  3. 일괄 작업 (다중 선택, 일괄 완료/삭제/카테고리 변경)

7. API 설계 요약

Method Endpoint 설명
GET /api/todos 할일 목록 (필터/페이지네이션)
POST /api/todos 할일 생성
GET /api/todos/{id} 할일 상세
PUT /api/todos/{id} 할일 수정
DELETE /api/todos/{id} 할일 삭제
POST /api/todos/batch 일괄 작업
GET /api/categories 카테고리 목록
POST /api/categories 카테고리 생성
PUT /api/categories/{id} 카테고리 수정
DELETE /api/categories/{id} 카테고리 삭제
GET /api/tags 사용 중인 태그 목록
GET /api/search 검색
GET /api/dashboard/stats 대시보드 통계

8. 비기능 요구사항

항목 기준
API 응답 시간 95% 요청 200ms 이내
페이지네이션 기본 20건, 최대 100건
검색 MongoDB text index 활용
캐싱 대시보드 통계 Redis 캐시 (TTL 60초)
CORS 프론트엔드 도메인 허용
에러 처리 표준 HTTP 상태 코드 + JSON 에러 응답