# ๐Ÿ“‹ ์ฃผ๊ฐ„์—…๋ฌด๋ณด๊ณ  ์‹œ์Šคํ…œ (Weekly Report) SI ํ”„๋กœ์ ํŠธ ํŒ€์„ ์œ„ํ•œ ์ฃผ๊ฐ„์—…๋ฌด๋ณด๊ณ  ์ž‘์„ฑ ๋ฐ ์ทจํ•ฉ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ ### ๐Ÿ“ ์ฃผ๊ฐ„๋ณด๊ณ  ์ž‘์„ฑ - ํ”„๋กœ์ ํŠธ๋ณ„ ๊ธˆ์ฃผ ์‹ค์  / ์ฐจ์ฃผ ๊ณ„ํš ์ž‘์„ฑ - Task ๋‹จ์œ„๋กœ ์ž‘์—… ๋‚ด์šฉ, ์‹œ๊ฐ„, ์™„๋ฃŒ ์—ฌ๋ถ€ ๊ด€๋ฆฌ - ์ด์Šˆ/๋ฆฌ์Šคํฌ, ํœด๊ฐ€์ผ์ •, ๊ธฐํƒ€์‚ฌํ•ญ ์ž…๋ ฅ - ์ž‘์„ฑ โ†’ ์ œ์ถœ โ†’ ์ทจํ•ฉ ์›Œํฌํ”Œ๋กœ์šฐ ### ๐Ÿค– PMO AI ๋ฆฌ๋ทฐ - OpenAI ๊ธฐ๋ฐ˜ ์ฃผ๊ฐ„๋ณด๊ณ  ์ž๋™ ํ”ผ๋“œ๋ฐฑ - ์‹ค์ /๊ณ„ํš์˜ ๊ตฌ์ฒด์„ฑ ๊ฒ€ํ†  - ์ผ์ • ๋ช…ํ™•์„ฑ ๋ฐ ์‹œ๊ฐ„ ์‚ฐ์ • ์ ์ ˆ์„ฑ ํ‰๊ฐ€ - ๊ตฌ์ฒด์ ์ธ ์ž‘์„ฑ ์˜ˆ์‹œ์™€ ๊ฐœ์„  ๊ฐ€์ด๋“œ ์ œ๊ณต ### ๐Ÿ“Š ์ทจํ•ฉ ๋ณด๊ณ ์„œ - ์ฃผ์ฐจ๋ณ„ ์ „์ฒด ๋ณด๊ณ ์„œ ์ทจํ•ฉ - ํ”„๋กœ์ ํŠธ๋ณ„ ์‹ค์ /๊ณ„ํš AI ์š”์•ฝ (OpenAI) - ์ธ์›๋ณ„ ํˆฌ์ž… ์‹œ๊ฐ„ ํ˜„ํ™ฉ - ์›๋ฌธ ๋ณด๊ธฐ ๊ธฐ๋Šฅ ### ๐Ÿ‘ฅ ์ง์›/ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ - ์ง์› ๋“ฑ๋ก ๋ฐ ๊ด€๋ฆฌ - ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ - ํ”„๋กœ์ ํŠธ๋ณ„ ํˆฌ์ž… ์ธ๋ ฅ ํ˜„ํ™ฉ ## ๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ | ๊ตฌ๋ถ„ | ๊ธฐ์ˆ  | |------|------| | Frontend | Vue 3, Nuxt 3 | | Backend | Nitro (Nuxt Server) | | Database | PostgreSQL | | AI | OpenAI GPT-4o-mini | | UI | Bootstrap 5, Bootstrap Icons | ## ๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ``` weeklyreport/ โ”œโ”€โ”€ frontend/ # ํ”„๋ก ํŠธ์—”๋“œ ํŽ˜์ด์ง€ โ”‚ โ”œโ”€โ”€ components/ # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ โ”‚ โ”œโ”€โ”€ composables/ # Vue Composables โ”‚ โ”œโ”€โ”€ report/ # ์ฃผ๊ฐ„๋ณด๊ณ  ๊ด€๋ จ โ”‚ โ”‚ โ”œโ”€โ”€ weekly/ # ๊ฐœ์ธ ์ฃผ๊ฐ„๋ณด๊ณ  โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ bulk-import.vue # AI ์ผ๊ด„ ๋“ฑ๋ก โ”‚ โ”‚ โ””โ”€โ”€ summary/ # ์ทจํ•ฉ ๋ณด๊ณ ์„œ โ”‚ โ”œโ”€โ”€ employee/ # ์ง์› ๊ด€๋ฆฌ โ”‚ โ”œโ”€โ”€ project/ # ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ โ”‚ โ””โ”€โ”€ mypage/ # ๋งˆ์ดํŽ˜์ด์ง€ โ”œโ”€โ”€ backend/ โ”‚ โ”œโ”€โ”€ api/ # API ์—”๋“œํฌ์ธํŠธ โ”‚ โ”‚ โ”œโ”€โ”€ auth/ # ์ธ์ฆ โ”‚ โ”‚ โ”œโ”€โ”€ employee/ # ์ง์› API โ”‚ โ”‚ โ”œโ”€โ”€ project/ # ํ”„๋กœ์ ํŠธ API โ”‚ โ”‚ โ””โ”€โ”€ report/ # ๋ณด๊ณ ์„œ API โ”‚ โ””โ”€โ”€ utils/ # ์œ ํ‹ธ๋ฆฌํ‹ฐ (DB ๋“ฑ) โ”œโ”€โ”€ nuxt.config.ts # Nuxt ์„ค์ • โ””โ”€โ”€ package.json ``` ## ๐Ÿ”— ๋ฉ”๋‰ด ๊ตฌ์กฐ | ๋ฉ”๋‰ด | ๊ฒฝ๋กœ | ์„ค๋ช… | ๊ถŒํ•œ | |------|------|------|------| | ๋กœ๊ทธ์ธ | `/login` | ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ | ์ „์ฒด | | ํ™ˆ | `/` | ๋Œ€์‹œ๋ณด๋“œ | ๋กœ๊ทธ์ธ | | **์ฃผ๊ฐ„๋ณด๊ณ ** | | | | | โ”œ ๋ชฉ๋ก | `/report/weekly` | ์ฃผ๊ฐ„๋ณด๊ณ  ๋ชฉ๋ก | ๋กœ๊ทธ์ธ | | โ”œ ์ž‘์„ฑ | `/report/weekly/write` | ์ฃผ๊ฐ„๋ณด๊ณ  ์ž‘์„ฑ | ๋กœ๊ทธ์ธ | | โ”œ ์ผ๊ด„์ž‘์„ฑ | `/report/weekly/bulk-import` | AI ๊ธฐ๋ฐ˜ ์ผ๊ด„ ๋“ฑ๋ก | ๋กœ๊ทธ์ธ | | โ”œ ์ƒ์„ธ | `/report/weekly/[id]` | ์ฃผ๊ฐ„๋ณด๊ณ  ์ƒ์„ธ๋ณด๊ธฐ | ๋กœ๊ทธ์ธ | | โ”” ์ทจํ•ฉํ˜„ํ™ฉ | `/report/weekly/aggregate` | ์ฃผ์ฐจ๋ณ„ ์ทจํ•ฉ ํ˜„ํ™ฉ | ๋กœ๊ทธ์ธ | | **์ทจํ•ฉ๋ณด๊ณ ์„œ** | | | | | โ”œ ๋ชฉ๋ก | `/report/summary` | ์ทจํ•ฉ ๋ณด๊ณ ์„œ ๋ชฉ๋ก | ๊ด€๋ฆฌ์ž | | โ”” ์ƒ์„ธ | `/report/summary/[id]` | ์ทจํ•ฉ ๋ณด๊ณ ์„œ ์ƒ์„ธ | ๊ด€๋ฆฌ์ž | | **๊ด€๋ฆฌ** | | | | | โ”œ ์ง์› ๋ชฉ๋ก | `/employee` | ์ง์› ๊ด€๋ฆฌ | ๊ด€๋ฆฌ์ž | | โ”œ ์ง์› ์ƒ์„ธ | `/employee/[id]` | ์ง์› ์ •๋ณด ์ƒ์„ธ | ๊ด€๋ฆฌ์ž | | โ”œ ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก | `/project` | ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ | ๊ด€๋ฆฌ์ž | | โ”” ํ”„๋กœ์ ํŠธ ์ƒ์„ธ | `/project/[id]` | ํ”„๋กœ์ ํŠธ ์ •๋ณด ์ƒ์„ธ | ๊ด€๋ฆฌ์ž | | **๋งˆ์ดํŽ˜์ด์ง€** | `/mypage` | ๋‚ด ์ •๋ณด | ๋กœ๊ทธ์ธ | | **ํ”ผ๋“œ๋ฐฑ** | `/feedback` | ํ”ผ๋“œ๋ฐฑ | ๋กœ๊ทธ์ธ | ## ๐Ÿ—„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ### ์ฃผ์š” ํ…Œ์ด๋ธ” | ํ…Œ์ด๋ธ”๋ช… | ์„ค๋ช… | |----------|------| | `wr_employee_info` | ์ง์› ์ •๋ณด | | `wr_project_info` | ํ”„๋กœ์ ํŠธ ์ •๋ณด | | `wr_weekly_report` | ์ฃผ๊ฐ„๋ณด๊ณ  ๋งˆ์Šคํ„ฐ | | `wr_weekly_report_task` | ์ฃผ๊ฐ„๋ณด๊ณ  Task (์‹ค์ /๊ณ„ํš) | | `wr_aggregated_report_summary` | ์ทจํ•ฉ ๋ณด๊ณ ์„œ | ## ๐Ÿš€ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ### ์š”๊ตฌ์‚ฌํ•ญ - Node.js 18+ - PostgreSQL 14+ - OpenAI API Key ### ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (.env) ```env DATABASE_URL=postgresql://user:pass@host:port/weeklyreport OPENAI_API_KEY=sk-xxx ``` ### ์„ค์น˜ ```bash npm install ``` ### ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ```bash npm run dev # http://localhost:2026 ``` ### ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ```bash npm run build npm run preview ``` ## ๐Ÿ“ก ์ฃผ์š” API ### ์ธ์ฆ | Method | Endpoint | ์„ค๋ช… | |--------|----------|------| | POST | `/api/auth/login` | ๋กœ๊ทธ์ธ | | POST | `/api/auth/logout` | ๋กœ๊ทธ์•„์›ƒ | | GET | `/api/auth/me` | ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด | ### ์ฃผ๊ฐ„๋ณด๊ณ  | Method | Endpoint | ์„ค๋ช… | |--------|----------|------| | GET | `/api/report/weekly/list` | ์ฃผ๊ฐ„๋ณด๊ณ  ๋ชฉ๋ก | | POST | `/api/report/weekly/save` | ์ฃผ๊ฐ„๋ณด๊ณ  ์ €์žฅ | | GET | `/api/report/weekly/[id]/detail` | ์ฃผ๊ฐ„๋ณด๊ณ  ์ƒ์„ธ | | POST | `/api/report/review` | PMO AI ๋ฆฌ๋ทฐ ์š”์ฒญ | ### ์ทจํ•ฉ ๋ณด๊ณ ์„œ | Method | Endpoint | ์„ค๋ช… | |--------|----------|------| | GET | `/api/report/summary/weekly-list` | ์ฃผ์ฐจ๋ณ„ ์ทจํ•ฉ ๋ชฉ๋ก | | POST | `/api/report/summary/aggregate` | ์ทจํ•ฉ ์‹คํ–‰ | | GET | `/api/report/summary/week/detail` | ์ฃผ์ฐจ๋ณ„ ์ƒ์„ธ | ### ์ง์›/ํ”„๋กœ์ ํŠธ | Method | Endpoint | ์„ค๋ช… | |--------|----------|------| | GET | `/api/employee/list` | ์ง์› ๋ชฉ๋ก | | POST | `/api/employee/create` | ์ง์› ๋“ฑ๋ก | | GET | `/api/project/list` | ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก | | POST | `/api/project/create` | ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ | ## ๐Ÿ“ธ ํ™”๋ฉด ๊ตฌ์„ฑ ### ์ฃผ๊ฐ„๋ณด๊ณ  ์ž‘์„ฑ - ํ”„๋กœ์ ํŠธ ์„ ํƒ ํ›„ Task ์ถ”๊ฐ€ - ๊ธˆ์ฃผ ์‹ค์ : ์ž‘์—…๋‚ด์šฉ, ์‹œ๊ฐ„, ์™„๋ฃŒ์—ฌ๋ถ€ - ์ฐจ์ฃผ ๊ณ„ํš: ๊ณ„ํš๋‚ด์šฉ, ์˜ˆ์ƒ์‹œ๊ฐ„ - PMO AI ๋ฆฌ๋ทฐ ์ž๋™ ์ƒ์„ฑ ### ์ทจํ•ฉ ๋ณด๊ณ ์„œ - ์ฃผ์ฐจ๋ณ„ ํ”„๋กœ์ ํŠธ ํ˜„ํ™ฉ - AI ๊ธฐ๋ฐ˜ ์‹ค์ /๊ณ„ํš ์š”์•ฝ - ์ธ์›๋ณ„ ํˆฌ์ž… ์‹œ๊ฐ„ ํ…Œ์ด๋ธ” - ์›๋ฌธ ๋ณด๊ธฐ (๋ชจ๋‹ฌ) ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค Private - ํ„ฐ๋ณด์†Œํ”„ํŠธ ๋‚ด๋ถ€์šฉ --- ยฉ 2026 TurboSoft