# ๐Ÿ“ฑ Todo Project **๋ฉ”๋ชจ โ†’ ์ˆ˜์‹ ํ•จ โ†’ Todo ๊ด€๋ฆฌ**์˜ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ ## ๐ŸŽฏ ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ ``` ๐Ÿ“ ๋ฉ”๋ชจ ์ž‘์„ฑ โ†’ ๐Ÿ“ฅ ์ˆ˜์‹ ํ•จ ํ™•์ธ โ†’ โœ… Todo ๋ณ€ํ™˜ โ†’ ๐Ÿ“‹ Todo ๊ด€๋ฆฌ ``` ### 3๊ฐœ ํŽ˜์ด์ง€๋กœ ์™„์„ฑ๋˜๋Š” ์‹ฌํ”Œํ•œ ๊ตฌ์กฐ: 1. **๐Ÿ“ ์ƒˆ ๋ฉ”๋ชจ** (`/upload.html`) - ๋น ๋ฅธ ๋ฉ”๋ชจ ์ž‘์„ฑ 2. **๐Ÿ“ฅ ์ˆ˜์‹ ํ•จ** (`/inbox.html`) - ๋ฉ”๋ชจ ํ™•์ธ & Todo ๋ณ€ํ™˜ 3. **๐Ÿ“‹ Todo ๋ชฉ๋ก** (`/todo-list.html`) - ์˜ค๋Š˜ ํ•  ์ผ ๊ด€๋ฆฌ ## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ - ๐Ÿ–Š๏ธ **๋น ๋ฅธ ๋ฉ”๋ชจ ์ž‘์„ฑ**: ํ…์ŠคํŠธ + ์ด๋ฏธ์ง€ (์ตœ๋Œ€ 5์žฅ) - ๐Ÿ“… **์‹œ์ž‘์ผ ๊ธฐ๋ฐ˜ Todo**: ํ•ด์•ผ ํ•  ์‹œ์ ์ด ๋œ Todo๋งŒ ํ‘œ์‹œ - ๐Ÿท๏ธ **์Šค๋งˆํŠธ ์ƒํƒœ ๊ด€๋ฆฌ**: ์˜ค๋Š˜ ์‹œ์ž‘ / ์ง„ํ–‰ ์ค‘ ์ž๋™ ๊ตฌ๋ถ„ - ๐Ÿ“ฑ **๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”**: ์นด๋ฉ”๋ผ/๊ฐค๋Ÿฌ๋ฆฌ ์—…๋กœ๋“œ ์ง€์› - ๐Ÿ”„ **์ง€์—ฐ ๊ด€๋ฆฌ**: +3์ผ, +5์ผ, ๋‚ ์งœ ์„ ํƒ ์—ฐ์žฅ - ๐ŸŽจ **๋นˆํ‹ฐ์ง€ UI**: ์–‘ํ”ผ์ง€ ํ…Œ๋งˆ์˜ ์•„๋ฆ„๋‹ค์šด ์ธํ„ฐํŽ˜์ด์Šค ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ```bash # ํ”„๋กœ์ ํŠธ ํด๋ก  git clone https://git.hyungi.net/hyungi/Todo-Project.git cd Todo-Project # Docker๋กœ ์‹คํ–‰ docker-compose up -d # ์ ‘์† open http://localhost:4000 ``` **๊ธฐ๋ณธ ๊ณ„์ •**: `hyungi` / `admin` ## ๐Ÿ—๏ธ ๊ธฐ์ˆ  ์Šคํƒ ### Frontend - **HTML5/CSS3/JavaScript**: ๋ฐ”๋‹๋ผ JS๋กœ ๊ฐ€๋ฒผ์šด ๊ตฌํ˜„ - **Tailwind CSS**: ๋น ๋ฅธ ์Šคํƒ€์ผ๋ง - **PWA**: ํ™ˆํ™”๋ฉด ์ถ”๊ฐ€ ์ง€์› - **Nginx**: ์ •์  ํŒŒ์ผ ์„œ๋น™ & API ํ”„๋ก์‹œ ### Backend - **FastAPI**: ๊ณ ์„ฑ๋Šฅ Python API - **SQLAlchemy**: ๋น„๋™๊ธฐ ORM - **PostgreSQL**: ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - **Pydantic**: ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ### Infrastructure - **Docker Compose**: ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ - **Nginx**: ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ - **Volume**: ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ## ๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ ### ๐Ÿ“‹ todos ํ…Œ์ด๋ธ” ```sql Column | Type | ์„ค๋ช… -------------|--------------------------|------------------ id | uuid | ๊ณ ์œ  ID user_id | uuid | ์‚ฌ์šฉ์ž ID title | varchar(200) | ์ œ๋ชฉ (๋ฉ”๋ชจ๋Š” ์„ ํƒ์‚ฌํ•ญ) description | text | ๋‚ด์šฉ (ํ•„์ˆ˜) category | enum | MEMO | TODO status | enum | pending | completed start_date | timestamp | Todo ์‹œ์ž‘์ผ image_urls | text | ์ด๋ฏธ์ง€ URLs (JSON) created_at | timestamp | ์ƒ์„ฑ์ผ updated_at | timestamp | ์ˆ˜์ •์ผ completed_at | timestamp | ์™„๋ฃŒ์ผ ``` ### ๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ธ๋ฑ์Šค - `idx_todos_workflow`: ๋ณตํ•ฉ ์›Œํฌํ”Œ๋กœ์šฐ ์กฐํšŒ ์ตœ์ ํ™” - `idx_todos_start_date`: ์‹œ์ž‘์ผ ๊ธฐ์ค€ ์กฐํšŒ - `idx_todos_category_status`: ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ƒํƒœ ์กฐํšŒ ## ๐Ÿ”„ API ์—”๋“œํฌ์ธํŠธ ### ์ธ์ฆ - `POST /api/auth/login` - ๋กœ๊ทธ์ธ - `GET /api/auth/me` - ์‚ฌ์šฉ์ž ์ •๋ณด ### Todo/๋ฉ”๋ชจ ๊ด€๋ฆฌ - `POST /api/todos` - ๋ฉ”๋ชจ/Todo ์ƒ์„ฑ - `GET /api/todos?category=memo` - ๋ฉ”๋ชจ ๋ชฉ๋ก (์ˆ˜์‹ ํ•จ) - `GET /api/todos?category=todo` - Todo ๋ชฉ๋ก - `PUT /api/todos/{id}` - Todo ์ˆ˜์ • (์นดํ…Œ๊ณ ๋ฆฌ ๋ณ€ํ™˜, ์ƒํƒœ ๋ณ€๊ฒฝ) - `POST /api/todos/upload-image` - ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ## ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์ง€์› ### PWA ๊ธฐ๋Šฅ - ํ™ˆํ™”๋ฉด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ - ์˜คํ”„๋ผ์ธ ์ง€์› (์˜ˆ์ •) - ํ‘ธ์‹œ ์•Œ๋ฆผ (์˜ˆ์ •) ### ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™” - ํ„ฐ์น˜ ์นœํ™”์  UI - ์นด๋ฉ”๋ผ/๊ฐค๋Ÿฌ๋ฆฌ ์ ‘๊ทผ - ํ‚ค๋ณด๋“œ ๋Œ€์‘ ์Šคํฌ๋กค - ์ด๋ฏธ์ง€ ์ž๋™ ์••์ถ• ## ๐ŸŽจ UI/UX ํŠน์ง• ### ๋นˆํ‹ฐ์ง€ ์–‘ํ”ผ์ง€ ํ…Œ๋งˆ - ๋”ฐ๋œปํ•œ ์„ธํ”ผ์•„ ์ƒ‰์ƒ - ์†๊ธ€์”จ ๋А๋‚Œ์˜ ํฐํŠธ - ๊ทธ๋ฆผ์ž์™€ ํ…Œ๋‘๋ฆฌ ํšจ๊ณผ - ์ง๊ด€์ ์ธ ์•„์ด์ฝ˜ ### ๋ฐ˜์‘ํ˜• ๋””์ž์ธ - ๋ฐ์Šคํฌํ†ฑ: ๋„“์€ ๋ ˆ์ด์•„์›ƒ - ๋ชจ๋ฐ”์ผ: ์„ธ๋กœ ์ตœ์ ํ™” - ํ„ฐ์น˜ ์ œ์Šค์ฒ˜ ์ง€์› ## ๐Ÿ”ง ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ### ๋กœ์ปฌ ๊ฐœ๋ฐœ ```bash # ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ cd backend pip install -e . uvicorn src.main:app --reload --port 9000 # ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ cd frontend python -m http.server 8000 ``` ### ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ```env # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค DATABASE_URL=postgresql+asyncpg://todo_user:todo_password@localhost:5432/todo_db # JWT ์„ค์ • SECRET_KEY=your-secret-key ACCESS_TOKEN_EXPIRE_MINUTES=30 # ํŒŒ์ผ ์—…๋กœ๋“œ UPLOAD_DIR=/data/uploads MAX_FILE_SIZE=5242880 # 5MB ``` ## ๐Ÿ“ˆ ์„ฑ๋Šฅ ์ตœ์ ํ™” ### ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋กœ ์ฟผ๋ฆฌ ์ตœ์ ํ™” - ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ถ„๋ฆฌ๋กœ ํšจ์œจ์  ์กฐํšŒ - ์ด๋ฏธ์ง€ URL JSON ์ €์žฅ์œผ๋กœ ์ •๊ทœํ™” ์ตœ์†Œํ™” ### ํ”„๋ก ํŠธ์—”๋“œ - ๋ฐ”๋‹๋ผ JS๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์†Œํ™” - ์ด๋ฏธ์ง€ ํด๋ผ์ด์–ธํŠธ ์••์ถ• - ๋ถˆํ•„์š”ํ•œ ๋กœ๊น… ์ œ๊ฑฐ - Nginx ์ •์  ํŒŒ์ผ ์บ์‹ฑ ## ๐Ÿš€ ๋ฐฐํฌ ### Docker Compose (๊ถŒ์žฅ) ```bash docker-compose up -d ``` ### ์‹œ๋†€๋กœ์ง€ NAS ์ž์„ธํ•œ ์„ค์น˜ ๊ฐ€์ด๋“œ: [SYNOLOGY_INSTALL.md](SYNOLOGY_INSTALL.md) ## ๐Ÿ“– ์ถ”๊ฐ€ ๋ฌธ์„œ - [๐Ÿ“š ์ข…ํ•ฉ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ](COMPREHENSIVE_GUIDE.md) - ์ƒ์„ธํ•œ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ - [๐Ÿ  ์‹œ๋†€๋กœ์ง€ ์„ค์น˜](SYNOLOGY_INSTALL.md) - NAS ์„ค์น˜ ๋ฐฉ๋ฒ• ## ๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ 1. Fork the Project 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the Branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค ์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ## ๐Ÿ“ž ๋ฌธ์˜ ํ”„๋กœ์ ํŠธ ๋งํฌ: [https://git.hyungi.net/hyungi/Todo-Project](https://git.hyungi.net/hyungi/Todo-Project)