--- name: "local-dev-context" description: "Local development environment context management" --- # Local Development Context Skill ## ๐Ÿ“‹ Overview **Purpose**: ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ๋งฅ๋ฝ(ํŒŒ์ผ์‹œ์Šคํ…œ, ์„ค์ •, ๋ฌธ์„œ, ํžˆ์Šคํ† ๋ฆฌ)์„ ํ†ตํ•ฉํ•˜์—ฌ ์—๋Ÿฌ ์—†๋Š” ์ฝ”๋”ฉ์„ ์ง€์›ํ•˜๋Š” AI ๊ฐœ๋ฐœ ์–ด์‹œ์Šคํ„ดํŠธ ์Šคํ‚ฌ **Problem Solved**: - ๋ฐ˜๋ณต์ ์ธ ํ™˜๊ฒฝ ์„ค์ • ์—๋Ÿฌ - ํ”„๋กœ์ ํŠธ๋ณ„ ํŠน์ˆ˜ ์„ค์ • ๋ˆ„๋ฝ - ํŒ€ ๋‚ด๋ถ€ ๋ฌธ์„œ ๋ฏธํ™œ์šฉ - ๊ณผ๊ฑฐ ํ•ด๊ฒฐ ์‚ฌ๋ก€ ์žฌ๊ฒ€์ƒ‰ ์‹œ๊ฐ„ ๋‚ญ๋น„ **Key Capabilities**: - ๋กœ์ปฌ ํŒŒ์ผ์‹œ์Šคํ…œ ์ž๋™ ์Šค์บ” (3์ดˆ ์ด๋‚ด) - ๊ธฐ์ˆ  ์Šคํƒ ์ž๋™ ๊ฐ์ง€ (Node.js/Python/Go/Rust ๋“ฑ) - MCP ๋„๊ตฌ ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (Notion/Drive/Gmail) - ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์—๋Ÿฌ ์ง„๋‹จ ๋ฐ ํ•ด๊ฒฐ์ฑ… ์ œ์‹œ - ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์ž๋™ํ™” **Design Pattern**: Orchestrator + Analyzer - Orchestrator: ์—ฌ๋Ÿฌ MCP ๋„๊ตฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์กฐ์œจ - Analyzer: ๋กœ์ปฌ ํ™˜๊ฒฝ๊ณผ ์ง€์‹๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ธ์‚ฌ์ดํŠธ ๋„์ถœ **Target Users**: - ๊ฐœ๋ฐœ์ž (์ดˆ๊ธ‰~๊ณ ๊ธ‰) - DevOps ์—”์ง€๋‹ˆ์–ด - ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ํ•ฉ๋ฅ˜ ํŒ€์› - ํ”„๋ฆฌ๋žœ์„œ/๊ฐœ์ธ ๊ฐœ๋ฐœ์ž --- ## ๐ŸŽฏ Activation Triggers Claude๋Š” ๋‹ค์Œ ์ƒํ™ฉ์—์„œ ์ด ์Šคํ‚ฌ์„ **์ž๋™์œผ๋กœ** ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค: ### 1๏ธโƒฃ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฐ์ง€ ``` ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์˜ˆ์‹œ: "ModuleNotFoundError: No module named 'numpy'" "npm ERR! ERESOLVE unable to resolve dependency tree" "docker: Error response from daemon: port is already allocated" ``` ### 2๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ •๋ณด ์š”์ฒญ ``` ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์˜ˆ์‹œ: "์ด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํŒŒ์•…ํ•ด์ค˜" "ํ˜„์žฌ ํ™˜๊ฒฝ ์„ค์ • ํ™•์ธ" "ํ”„๋กœ์ ํŠธ ์ฒ˜์Œ์ธ๋ฐ ๋ญ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€?" ``` ### 3๏ธโƒฃ ๊ฐœ๋ฐœ ์ž‘์—… ์‹œ์ž‘ ``` ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์˜ˆ์‹œ: "์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ํ•˜๋ ค๋Š”๋ฐ" "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝํ• ๊ฒŒ" "๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์„ค์ • ํ™•์ธํ•ด์ค˜" ``` ### 4๏ธโƒฃ ๋ช…์‹œ์  ์š”์ฒญ ``` ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์˜ˆ์‹œ: "๋กœ์ปฌ ํ™˜๊ฒฝ ์Šค์บ”ํ•ด์ค˜" "ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ์ฐพ์•„์ค˜" "๊ณผ๊ฑฐ ์œ ์‚ฌ ์—๋Ÿฌ ์žˆ์—ˆ๋‚˜?" ``` --- ## ๐Ÿ”„ Core Workflow ### Phase 1: Auto Context Collection (์ž๋™ ์ปจํ…์ŠคํŠธ ์ˆ˜์ง‘) - 30์ดˆ ```markdown #### Step 1.1: ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ ```bash view /home/claude ``` **๋ชฉ์ **: ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์กฐ ํŒŒ์•… #### Step 1.2: ์ˆจ๊น€ ํŒŒ์ผ ํฌํ•จ ๋ชฉ๋ก ```bash bash_tool: ls -la ``` **๋ชฉ์ **: `.env`, `.git`, `.docker` ๋“ฑ ์ค‘์š” ์„ค์ • ํŒŒ์ผ ๋ฐœ๊ฒฌ #### Step 1.3: ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ํ™•์ธ ```bash view README.md ``` **๋ชฉ์ **: ํ”„๋กœ์ ํŠธ ์„ค๋ช…, ์„ค์น˜ ๋ฐฉ๋ฒ•, ์ฃผ์š” ๊ธฐ๋Šฅ ์ดํ•ด #### Step 1.4: Git ์ƒํƒœ ํ™•์ธ (์„ ํƒ์ ) ```bash bash_tool: git log -1 --oneline 2>/dev/null || echo "Not a git repository" bash_tool: git branch --show-current 2>/dev/null ``` **๋ชฉ์ **: ์ตœ๊ทผ ๋ณ€๊ฒฝ์‚ฌํ•ญ, ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ํŒŒ์•… ``` --- ### Phase 2: Tech Stack Detection (๊ธฐ์ˆ  ์Šคํƒ ๊ฐ์ง€) - 1๋ถ„ ```markdown #### Step 2.1: ์–ธ์–ด/ํ”„๋ ˆ์ž„์›Œํฌ ์ž๋™ ์‹๋ณ„ ```bash bash_tool: | echo "=== Tech Stack Detection ===" # Node.js if [ -f package.json ]; then echo "โœ… Node.js Project" node -v 2>/dev/null && npm -v 2>/dev/null cat package.json | grep -E '"name"|"version"|"scripts"' | head -10 fi # Python if [ -f requirements.txt ] || [ -f pyproject.toml ]; then echo "โœ… Python Project" python --version 2>/dev/null || python3 --version 2>/dev/null pip --version 2>/dev/null || pip3 --version 2>/dev/null [ -f requirements.txt ] && head -20 requirements.txt fi # Go if [ -f go.mod ]; then echo "โœ… Go Project" go version 2>/dev/null head -10 go.mod fi # Rust if [ -f Cargo.toml ]; then echo "โœ… Rust Project" rustc --version 2>/dev/null head -10 Cargo.toml fi # Java if [ -f pom.xml ] || [ -f build.gradle ]; then echo "โœ… Java Project" java -version 2>&1 | head -1 [ -f pom.xml ] && grep -E '|' pom.xml | head -10 fi ``` #### Step 2.2: ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ์ง€ ```bash bash_tool: | # Node.js frameworks if [ -f package.json ]; then grep -E '"(react|vue|angular|express|nest)"' package.json || echo "Framework: Unknown" fi # Python frameworks if [ -f requirements.txt ]; then grep -iE '(django|flask|fastapi)' requirements.txt || echo "Framework: Unknown" fi ``` ``` --- ### Phase 3: Configuration Audit (์„ค์ • ๊ฐ์‚ฌ) - 1๋ถ„ ```markdown #### Step 3.1: ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ์ฒดํฌ ```bash # ํ™˜๊ฒฝ๋ณ€์ˆ˜ view .env.example 2>/dev/null || view .env 2>/dev/null || echo "No .env files found" # Docker ์„ค์ • view docker-compose.yml 2>/dev/null || echo "No Docker Compose" view Dockerfile 2>/dev/null || echo "No Dockerfile" # Git ์ œ์™ธ ํŒŒ์ผ view .gitignore ``` #### Step 3.2: ์‹คํ–‰ ์ค‘์ธ ์„œ๋น„์Šค ํ™•์ธ ```bash bash_tool: | echo "=== Running Services ===" # Docker containers if command -v docker &> /dev/null; then docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || echo "Docker not running" fi # Port usage lsof -i :3000 -i :8000 -i :5432 -i :27017 2>/dev/null | grep LISTEN || echo "Common ports available" ``` #### Step 3.3: ์˜์กด์„ฑ ์ƒํƒœ ํ™•์ธ ```bash bash_tool: | # Node.js if [ -f package.json ]; then echo "=== Node.js Dependencies ===" npm list --depth=0 2>/dev/null || echo "Dependencies not installed" npm outdated 2>/dev/null || echo "All dependencies up to date" fi # Python if [ -f requirements.txt ]; then echo "=== Python Dependencies ===" pip list --format=columns 2>/dev/null | head -20 || echo "Dependencies not installed" fi ``` ``` --- ### Phase 4: Knowledge Base Search (์ง€์‹ ๋ฒ ์ด์Šค ๊ฒ€์ƒ‰) - 2๋ถ„ ```markdown #### Step 4.1: Notion์—์„œ ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ๊ฒ€์ƒ‰ ```javascript // ํ”„๋กœ์ ํŠธ ์„ค๊ณ„/์•„ํ‚คํ…์ฒ˜ ๋ฌธ์„œ notion-search: { query: "{ํ”„๋กœ์ ํŠธ๋ช…} (architecture OR setup OR configuration OR API)", query_type: "internal" } // ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ฌธ์„œ notion-search: { query: "{ํ”„๋กœ์ ํŠธ๋ช…} (troubleshooting OR error OR issue OR solution)", query_type: "internal" } ``` **๊ฒ€์ƒ‰ ์šฐ์„ ์ˆœ์œ„**: 1. ํ”„๋กœ์ ํŠธ๋ช…์ด ํฌํ•จ๋œ ํŽ˜์ด์ง€ 2. "Setup", "Configuration", "Environment" ํ‚ค์›Œ๋“œ 3. "Troubleshooting", "Known Issues" ์„น์…˜ #### Step 4.2: Google Drive์—์„œ ์„ค์ • ํŒŒ์ผ ๊ฒ€์ƒ‰ ```javascript // ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด ์„ค์ • ๊ด€๋ จ ๋ฌธ์„œ google_drive_search: { api_query: "name contains '{ํ”„๋กœ์ ํŠธ๋ช…}' and (name contains 'config' or name contains 'setup' or name contains 'env')", semantic_query: "environment setup configuration deployment" } // ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ (์ด๋ฏธ์ง€/PDF) google_drive_search: { api_query: "name contains '{ํ”„๋กœ์ ํŠธ๋ช…}' and (mimeType contains 'image' or mimeType='application/pdf')", semantic_query: "architecture diagram ERD database schema" } ``` #### Step 4.3: Gmail์—์„œ ๊ณผ๊ฑฐ ๊ธฐ์ˆ  ๋…ผ์˜ ๊ฒ€์ƒ‰ ```javascript // ์ตœ๊ทผ 1๊ฐœ์›” ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ์ด๋ฉ”์ผ search_gmail_messages: { q: "{ํ”„๋กœ์ ํŠธ๋ช…} (error OR issue OR problem OR solution OR fixed) after:{1๊ฐœ์›”_์ „_๋‚ ์งœ}" } // ํ™˜๊ฒฝ ์„ค์ • ๊ด€๋ จ ์Šค๋ ˆ๋“œ search_gmail_messages: { q: "{ํ”„๋กœ์ ํŠธ๋ช…} (environment OR setup OR configuration OR deployment)" } ``` **๊ฒ€์ƒ‰ ์ „๋žต**: - ์ตœ๊ทผ ๋ฉ”์‹œ์ง€ ์šฐ์„  (after: ํ•„ํ„ฐ ํ™œ์šฉ) - ์—๋Ÿฌ ํ‚ค์›Œ๋“œ ํฌํ•จ ๋ฉ”์‹œ์ง€ ์ง‘์ค‘ ๊ฒ€์ƒ‰ - ํ•ด๊ฒฐ ์™„๋ฃŒ ํ‘œ์‹œ ์Šค๋ ˆ๋“œ ์šฐ์„  (solved, fixed, resolved) ``` --- ### Phase 5: Error Diagnosis (์—๋Ÿฌ ์ง„๋‹จ) - 2๋ถ„ ```markdown #### Step 5.1: ์—๋Ÿฌ ํƒ€์ž… ๋ถ„๋ฅ˜ ```markdown **์—๋Ÿฌ ์นดํ…Œ๊ณ ๋ฆฌ**: 1. **ํ™˜๊ฒฝ ์„ค์ • ์—๋Ÿฌ** (Environment) - ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ˆ„๋ฝ: `Missing required environment variable` - ํฌํŠธ ์ถฉ๋Œ: `EADDRINUSE`, `port already allocated` - ๊ถŒํ•œ ๋ฌธ์ œ: `Permission denied`, `EACCES` 2. **์˜์กด์„ฑ ์—๋Ÿฌ** (Dependency) - ํŒจํ‚ค์ง€ ๋ฏธ์„ค์น˜: `ModuleNotFoundError`, `Cannot find module` - ๋ฒ„์ „ ์ถฉ๋Œ: `ERESOLVE`, `peer dependency conflict` - ์บ์‹œ ์˜ค์—ผ: `integrity check failed` 3. **์ฝ”๋“œ ์—๋Ÿฌ** (Code) - ๊ตฌ๋ฌธ ์—๋Ÿฌ: `SyntaxError`, `IndentationError` - ํƒ€์ž… ์—๋Ÿฌ: `TypeError`, `type mismatch` - ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ: `ReferenceError`, `AttributeError` 4. **์ธํ”„๋ผ ์—๋Ÿฌ** (Infrastructure) - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ: `ECONNREFUSED`, `Connection refused` - ๋„คํŠธ์›Œํฌ: `ETIMEDOUT`, `DNS resolution failed` - ์ปจํ…Œ์ด๋„ˆ: `container exited with code` ``` #### Step 5.2: ์—๋Ÿฌ๋ณ„ ์ž๋™ ์ง„๋‹จ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ```markdown **A. ํ™˜๊ฒฝ ๋ฌธ์ œ ์ง„๋‹จ** - [ ] ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „ ํ™•์ธ: `bash_tool: node -v && npm -v` ๋˜๋Š” `python --version` - [ ] ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ: `view .env` ๋˜๋Š” `bash_tool: printenv | grep {KEY}` - [ ] ํฌํŠธ ์‚ฌ์šฉ ํ™•์ธ: `bash_tool: lsof -i :{PORT_NUMBER}` - [ ] ํŒŒ์ผ ๊ถŒํ•œ ํ™•์ธ: `bash_tool: ls -l {ํŒŒ์ผ๊ฒฝ๋กœ}` **B. ์˜์กด์„ฑ ๋ฌธ์ œ ์ง„๋‹จ** - [ ] ํŒจํ‚ค์ง€ ์„ค์น˜ ์—ฌ๋ถ€: `bash_tool: npm list {ํŒจํ‚ค์ง€๋ช…}` ๋˜๋Š” `pip show {ํŒจํ‚ค์ง€๋ช…}` - [ ] ๋ฒ„์ „ ํ™•์ธ: `view package.json` ๋˜๋Š” `view requirements.txt` - [ ] Lock ํŒŒ์ผ ์ƒํƒœ: `view package-lock.json` ๋˜๋Š” `view poetry.lock` - [ ] ์บ์‹œ ์ƒํƒœ: `bash_tool: npm cache verify` ๋˜๋Š” `pip cache info` **C. ์ฝ”๋“œ ๋ฌธ์ œ ์ง„๋‹จ** - [ ] ์—๋Ÿฌ ํŒŒ์ผ ํ™•์ธ: `view {ํŒŒ์ผ๊ฒฝ๋กœ}:{๋ผ์ธ๋ฒˆํ˜ธ ยฑ5์ค„}` - [ ] ์ž„ํฌํŠธ ๊ฒฝ๋กœ: `bash_tool: grep -r "import.*{๋ชจ๋“ˆ๋ช…}" .` - [ ] ์„ค์ • ํŒŒ์ผ: `view tsconfig.json` ๋˜๋Š” `view setup.py` **D. ์ธํ”„๋ผ ๋ฌธ์ œ ์ง„๋‹จ** - [ ] ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ: `bash_tool: docker ps -a` - [ ] ๋กœ๊ทธ ํ™•์ธ: `bash_tool: docker logs {์ปจํ…Œ์ด๋„ˆ๋ช…} --tail 50` - [ ] ๋„คํŠธ์›Œํฌ: `bash_tool: docker network ls && docker network inspect {๋„คํŠธ์›Œํฌ๋ช…}` - [ ] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ: `bash_tool: telnet localhost {DB_PORT}` ๋˜๋Š” `nc -zv localhost {DB_PORT}` ``` #### Step 5.3: ์ง€์‹๋ฒ ์ด์Šค ๋งค์นญ ```markdown **์ž๋™ ๋งค์นญ ํ”„๋กœ์„ธ์Šค**: 1. Notion์—์„œ ๋™์ผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฒ€์ƒ‰ โ†’ ๊ณผ๊ฑฐ ํ•ด๊ฒฐ ์‚ฌ๋ก€ ๋ฐœ๊ฒฌ ์‹œ ์šฐ์„  ์ฐธ์กฐ 2. Gmail์—์„œ ์œ ์‚ฌ ์—๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฒ€์ƒ‰ โ†’ ํŒ€์› ๊ฐ„ ๋…ผ์˜/ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ํ™•์ธ 3. Drive์—์„œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ฌธ์„œ ํ™•์ธ โ†’ ๊ณต์‹ ๊ฐ€์ด๋“œ/FAQ ์ฐธ์กฐ 4. ์—†์„ ๊ฒฝ์šฐ Web Search ํ™œ์šฉ โ†’ Stack Overflow, GitHub Issues, ๊ณต์‹ ๋ฌธ์„œ ``` ``` --- ### Phase 6: Solution Generation (ํ•ด๊ฒฐ์ฑ… ์ƒ์„ฑ) - 1๋ถ„ ```markdown #### ์‘๋‹ต ๊ตฌ์กฐ ํ…œํ”Œ๋ฆฟ: ## ๐Ÿ” ์ง„๋‹จ ๊ฒฐ๊ณผ **์—๋Ÿฌ ์›์ธ**: [1์ค„ ๋ช…ํ™•ํ•œ ์š”์•ฝ] **๋กœ์ปฌ ํ™˜๊ฒฝ ์ƒํƒœ**: - ํ”„๋กœ์ ํŠธ: {PROJECT_NAME} - ๊ธฐ์ˆ  ์Šคํƒ: {TECH_STACK} {VERSION} - ๋ธŒ๋žœ์น˜: {GIT_BRANCH} - ๋ฌธ์ œ ๋ฐœ์ƒ ์œ„์น˜: {FILE_PATH}:{LINE_NUMBER} **๋ฐœ๊ฒฌ๋œ ์ด์Šˆ**: 1. [๊ตฌ์ฒด์  ๋ฌธ์ œ์  #1] 2. [๊ตฌ์ฒด์  ๋ฌธ์ œ์  #2] 3. [๊ด€๋ จ ์„ค์ • ๋ˆ„๋ฝ/์˜ค๋ฅ˜] --- ## โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ### ๋ฐฉ๋ฒ• 1: ์ฆ‰์‹œ ์ˆ˜์ • (๊ถŒ์žฅ) โญ ```bash # ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ปค๋งจ๋“œ (๋ณต์‚ฌ ํ›„ ์‹คํ–‰) {์‹ค์ œ_๋ช…๋ น์–ด_๋ผ์ธ๋ณ„_์„ค๋ช…ํฌํ•จ} ``` **์˜ˆ์ƒ ๊ฒฐ๊ณผ**: [์ •์ƒ ์ž‘๋™ ํ™•์ธ ๋ฐฉ๋ฒ•] **์†Œ์š” ์‹œ๊ฐ„**: {์˜ˆ์ƒ_์‹œ๊ฐ„} (์˜ˆ: 30์ดˆ) ### ๋ฐฉ๋ฒ• 2: ์„ค์ • ๋ณ€๊ฒฝ **ํŒŒ์ผ**: `{ํŒŒ์ผ๋ช…}` **๋ณ€๊ฒฝ ๋‚ด์šฉ**: ```javascript // Before (ํ˜„์žฌ ์ƒํƒœ) {ํ˜„์žฌ_์ฝ”๋“œ_์Šค๋‹ˆํŽซ} // After (์ˆ˜์ • ํ›„) {์ˆ˜์ •๋œ_์ฝ”๋“œ_์Šค๋‹ˆํŽซ} ``` **๋ณ€๊ฒฝ ์ด์œ **: [์™œ ์ด ์ˆ˜์ •์ด ํ•„์š”ํ•œ์ง€ ์„ค๋ช…] ### ๋ฐฉ๋ฒ• 3: ๊ตฌ์กฐ์  ๊ฐœ์„  (์‹œ๊ฐ„ ์žˆ์„ ๋•Œ) - [๊ทผ๋ณธ ์›์ธ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง] - [์žฅ๊ธฐ์  ์•ˆ์ •์„ฑ ๊ฐœ์„  ๋ฐฉ์•ˆ] - [๊ด€๋ จ ์˜์กด์„ฑ ์—…๊ทธ๋ ˆ์ด๋“œ] --- ## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ **๋‚ด๋ถ€ ๋ฌธ์„œ** (ํ”„๋กœ์ ํŠธ ํŠนํ™”): - Notion: [{๋ฌธ์„œ_์ œ๋ชฉ}]({notion_url}) > {๋ฌธ์„œ_์š”์•ฝ_1์ค„} - Google Drive: [{ํŒŒ์ผ๋ช…}]({drive_url}) > {ํŒŒ์ผ_์„ค๋ช…_1์ค„} - Gmail: [{์ด๋ฉ”์ผ_์ œ๋ชฉ}]({gmail_thread_url}) > {ํ•ด๊ฒฐ_์‚ฌ๋ก€_์š”์•ฝ} **์™ธ๋ถ€ ๋ฌธ์„œ** (์ผ๋ฐ˜ ์ฐธ์กฐ): - ๊ณต์‹ ๋ฌธ์„œ: [{์ œ๋ชฉ}]({official_docs_url}) - Stack Overflow: [{์งˆ๋ฌธ_์ œ๋ชฉ}]({stackoverflow_url}) - GitHub Issue: [#{์ด์Šˆ_๋ฒˆํ˜ธ}]({github_issue_url}) --- ## ๐Ÿ›ก๏ธ ์žฌ๋ฐœ ๋ฐฉ์ง€ **์ฆ‰์‹œ ์‹คํ–‰**: - [ ] Notion์— ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ํŽ˜์ด์ง€ ์ถ”๊ฐ€ ```markdown ์ œ๋ชฉ: "[{๋‚ ์งœ}] {์—๋Ÿฌ๋ช…} ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ" ๋‚ด์šฉ: ์›์ธ, ํ•ด๊ฒฐ๋ฒ•, ์˜ˆ๋ฐฉ์ฑ… ``` - [ ] `.env.example` ์—…๋ฐ์ดํŠธ (ํ•„์ˆ˜ ๋ณ€์ˆ˜ ์ถ”๊ฐ€) ```bash {NEW_REQUIRED_VAR}={์„ค๋ช…} # ์ถ”๊ฐ€๋œ ๋ณ€์ˆ˜ ``` - [ ] ํŒ€ ๊ณต์œ  (์ด๋ฉ”์ผ/Slack) > "์•ˆ๋…•ํ•˜์„ธ์š”, {์—๋Ÿฌ๋ช…} ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. [Notion ๋งํฌ]" **์žฅ๊ธฐ ๊ฐœ์„ **: - [ ] ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€ ```json // package.json "scripts": { "validate-env": "node scripts/check-env.js", "health-check": "node scripts/health-check.js" } ``` - [ ] CI/CD์— ๊ฒ€์ฆ ๋‹จ๊ณ„ ์ถ”๊ฐ€ ```yaml # .github/workflows/ci.yml - name: Validate Environment run: npm run validate-env ``` - [ ] ๋ฌธ์„œ ์ž๋™ ์ƒ์„ฑ > AI๊ฐ€ ์ด๋ฒˆ ํ•ด๊ฒฐ ๊ณผ์ •์„ Notion/Confluence์— ์ž๋™ ๊ธฐ๋ก ``` --- ## ๐Ÿ“– Detailed Examples ### Example 1: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ˆ„๋ฝ ์—๋Ÿฌ **์‚ฌ์šฉ์ž ์ž…๋ ฅ**: ``` ์—๋Ÿฌ ๋ฐœ์ƒํ–ˆ์–ด์š”: Error: Missing required environment variable: DATABASE_URL ``` **AI ์ž๋™ ์‹คํ–‰ ๊ณผ์ •**: ```markdown [Phase 1: Context Collection - 3์ดˆ] โœ“ view /home/claude โ†’ ํ”„๋กœ์ ํŠธ: ecommerce-backend โœ“ bash_tool: ls -la โ†’ .env.example ๋ฐœ๊ฒฌ, .env ์—†์Œ โœ“ view README.md โ†’ "ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ํ•„์ˆ˜" ๋ช…์‹œ [Phase 2: Tech Stack Detection - 1์ดˆ] โœ“ bash_tool: cat package.json โ†’ Node.js 18.x, Express 4.x [Phase 3: Configuration Audit - 2์ดˆ] โœ“ view .env.example โ†’ DATABASE_URL ํ…œํ”Œ๋ฆฟ ์กด์žฌ โœ“ bash_tool: docker ps โ†’ PostgreSQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ค‘ (ํฌํŠธ 5432) [Phase 4: Knowledge Base Search - 5์ดˆ] โœ“ notion-search: "ecommerce-backend database setup" โ†’ ๋ฐœ๊ฒฌ: "DB ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€์ด๋“œ" ํŽ˜์ด์ง€ โœ“ google_drive_search: "ecommerce-backend .env" โ†’ ๋ฐœ๊ฒฌ: ".env.production.template" ํŒŒ์ผ โœ“ search_gmail_messages: "DATABASE_URL configuration" โ†’ ๋ฐœ๊ฒฌ: ํŒ€ ๋ฆฌ๋“œ์˜ ์„ค์ • ์•ˆ๋‚ด ์ด๋ฉ”์ผ (2์ฃผ ์ „) [Phase 5: Error Diagnosis - 1์ดˆ] โœ“ ์—๋Ÿฌ ํƒ€์ž…: ํ™˜๊ฒฝ ์„ค์ • ์—๋Ÿฌ โœ“ ์›์ธ: .env ํŒŒ์ผ ๋ฏธ์ƒ์„ฑ, DATABASE_URL ๋ณ€์ˆ˜ ์—†์Œ โœ“ ํ•ด๊ฒฐ์ฑ… ํ™•์ธ๋จ: Notion ๋ฌธ์„œ์— ์ •ํ™•ํ•œ ๊ฐ’ ๋ช…์‹œ ``` **AI ์‘๋‹ต**: ```markdown ## ๐Ÿ” ์ง„๋‹จ ๊ฒฐ๊ณผ **์—๋Ÿฌ ์›์ธ**: `.env` ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•„ `DATABASE_URL` ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ **๋กœ์ปฌ ํ™˜๊ฒฝ ์ƒํƒœ**: - ํ”„๋กœ์ ํŠธ: ecommerce-backend - ๊ธฐ์ˆ  ์Šคํƒ: Node.js 18.20.5 / Express 4.18.2 - ๋ธŒ๋žœ์น˜: feature/order-api - PostgreSQL ์ปจํ…Œ์ด๋„ˆ: โœ… ์‹คํ–‰ ์ค‘ (localhost:5432) **๋ฐœ๊ฒฌ๋œ ์ด์Šˆ**: 1. `.env` ํŒŒ์ผ ์—†์Œ (`.env.example`์€ ์กด์žฌ) 2. `DATABASE_URL` ๋ณ€์ˆ˜ ๋ฏธ์„ค์ • 3. Notion ๋ฌธ์„œ์— ์ •ํ™•ํ•œ ์„ค์ •๊ฐ’ ๊ธฐ๋ก๋จ --- ## โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ### ๋ฐฉ๋ฒ• 1: ์ฆ‰์‹œ ์ˆ˜์ • (๊ถŒ์žฅ) โญ ```bash # 1. .env.example์„ .env๋กœ ๋ณต์‚ฌ cp .env.example .env # 2. DATABASE_URL ์„ค์ • (Notion ๋ฌธ์„œ ๊ธฐ๋ฐ˜) echo 'DATABASE_URL="postgresql://postgres:password123@localhost:5432/ecommerce_dev"' >> .env # 3. ์„ค์ • ํ™•์ธ cat .env | grep DATABASE_URL # 4. ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ npm run dev ``` **์˜ˆ์ƒ ๊ฒฐ๊ณผ**: ``` Server started on port 3000 Database connected successfully ``` **์†Œ์š” ์‹œ๊ฐ„**: 30์ดˆ ### ๋ฐฉ๋ฒ• 2: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์šฉ ์„ค์ • (๋ฐฐํฌ ์‹œ) **ํŒŒ์ผ**: `.env` **Google Drive ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜**: ```bash # Development (ํ˜„์žฌ) DATABASE_URL="postgresql://postgres:password123@localhost:5432/ecommerce_dev" # Production (๋ฐฐํฌ ์‹œ ์‚ฌ์šฉ) DATABASE_URL="postgresql://prod_user:PROD_SECRET@db.company.com:5432/ecommerce_prod" ``` **์ฃผ์˜**: ํ”„๋กœ๋•์…˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” DevOps ํŒ€์—๊ฒŒ ๋ณ„๋„ ์š”์ฒญ ### ๋ฐฉ๋ฒ• 3: Docker Compose ํ†ตํ•ฉ (๊ถŒ์žฅ) **ํŒŒ์ผ**: `docker-compose.yml` ```yaml services: app: environment: - DATABASE_URL=${DATABASE_URL} postgres: environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password123 - POSTGRES_DB=ecommerce_dev ``` ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `.env`์—์„œ ์ž๋™์œผ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. --- ## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ **๋‚ด๋ถ€ ๋ฌธ์„œ**: - Notion: [ecommerce-backend DB ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€์ด๋“œ](notion://...) > ๊ฐœ๋ฐœ/์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜ DB ์—ฐ๊ฒฐ ์ •๋ณด ํฌํ•จ - Google Drive: [.env.production.template](https://drive.google.com/...) > ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ…œํ”Œ๋ฆฟ - Gmail: [RE: DB ์„ค์ • ์•ˆ๋‚ด](gmail://thread/...) > ํŒ€ ๋ฆฌ๋“œ John์˜ ์„ค์ • ๊ฐ€์ด๋“œ (2024-10-10) **์™ธ๋ถ€ ๋ฌธ์„œ**: - PostgreSQL ์—ฐ๊ฒฐ: [๊ณต์‹ ๋ฌธ์„œ](https://www.postgresql.org/docs/current/libpq-connect.html) --- ## ๐Ÿ›ก๏ธ ์žฌ๋ฐœ ๋ฐฉ์ง€ **์ฆ‰์‹œ ์‹คํ–‰**: - [ ] Notion ํŽ˜์ด์ง€ ์—…๋ฐ์ดํŠธ ```markdown ## ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ˆ„๋ฝ ์‹œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ 1. .env.example ํ™•์ธ 2. .env ์ƒ์„ฑ: cp .env.example .env 3. DATABASE_URL ์„ค์ • (์œ„ ๋งํฌ ์ฐธ์กฐ) 4. .env๋ฅผ .gitignore์— ์ถ”๊ฐ€ ํ™•์ธ ``` - [ ] README.md์— ์„ค์น˜ ๊ฐ€์ด๋“œ ์ถ”๊ฐ€ ```markdown ## ๐Ÿš€ Quick Start 1. Clone repository 2. **Copy environment file**: `cp .env.example .env` 3. **Configure DATABASE_URL** (see Notion doc) 4. Install: `npm install` 5. Run: `npm run dev` ``` - [ ] ํŒ€ Slack ๊ณต์œ  > "#backend-dev: DATABASE_URL ์—๋Ÿฌ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. [Notion ๋งํฌ]" **์žฅ๊ธฐ ๊ฐœ์„ **: - [ ] ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ ```javascript // scripts/check-env.js const requiredEnvVars = ['DATABASE_URL', 'JWT_SECRET', 'API_KEY']; requiredEnvVars.forEach(varName => { if (!process.env[varName]) { console.error(`โŒ Missing: ${varName}`); process.exit(1); } }); console.log('โœ… All environment variables are set'); ``` - [ ] package.json์— ์ž๋™ ์‹คํ–‰ ์ถ”๊ฐ€ ```json "scripts": { "prestart": "node scripts/check-env.js", "predev": "node scripts/check-env.js" } ``` ``` --- ### Example 2: ํŒจํ‚ค์ง€ ๋ฒ„์ „ ์ถฉ๋Œ **์‚ฌ์šฉ์ž ์ž…๋ ฅ**: ``` npm install ํ•˜๋ฉด ๊ณ„์† ์—๋Ÿฌ๋‚˜์š” ``` **AI ์ž๋™ ์‹คํ–‰ ๊ณผ์ •**: ```markdown [Phase 1-2: Context + Stack Detection - 4์ดˆ] โœ“ ํ”„๋กœ์ ํŠธ: react-dashboard โœ“ Node.js 20.x, React 18.3.1 [Phase 3: Configuration Audit - 3์ดˆ] โœ“ bash_tool: npm install --dry-run 2>&1 โ†’ ์—๋Ÿฌ ๋‚ด์šฉ ์บก์ฒ˜: "ERESOLVE unable to resolve dependency tree" โœ“ view package.json โ†’ react@18.3.1, @types/react@17.0.0 ๋ฐœ๊ฒฌ (๋ฒ„์ „ ๋ถˆ์ผ์น˜) [Phase 4: Knowledge Base Search - 6์ดˆ] โœ“ search_gmail_messages: "ERESOLVE conflict react" โ†’ ๋ฐœ๊ฒฌ: ํŒ€์› Sarah์˜ ํ•ด๊ฒฐ ์ด๋ฉ”์ผ (1์ฃผ ์ „) โœ“ notion-search: "react typescript version" โ†’ ๋ฐœ๊ฒฌ: "React 18 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ" ํŽ˜์ด์ง€ ``` **AI ์‘๋‹ต**: ```markdown ## ๐Ÿ” ์ง„๋‹จ ๊ฒฐ๊ณผ **์—๋Ÿฌ ์›์ธ**: React 18๊ณผ React 17์šฉ ํƒ€์ž… ์ •์˜ ํŒŒ์ผ์ด ์ถฉ๋Œ **๋กœ์ปฌ ํ™˜๊ฒฝ ์ƒํƒœ**: - ํ”„๋กœ์ ํŠธ: react-dashboard - ๊ธฐ์ˆ  ์Šคํƒ: Node.js 20.18.0 / React 18.3.1 - ๋ฌธ์ œ ํŒจํ‚ค์ง€: @types/react@17.0.0 **๋ฐœ๊ฒฌ๋œ ์ด์Šˆ**: 1. `react@18.3.1` ์„ค์น˜๋จ 2. `@types/react@17.0.0` (๊ตฌ๋ฒ„์ „) ์„ค์น˜๋จ 3. `react-dom@18.3.1`์ด `@types/react@^18` ํ•„์š”๋กœ ํ•จ **๊ณผ๊ฑฐ ์‚ฌ๋ก€**: Gmail ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, 1์ฃผ ์ „ ํŒ€์› Sarah๊ฐ€ ๋™์ผ ์ด์Šˆ ํ•ด๊ฒฐ โ†’ `@types/react` ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋กœ ํ•ด๊ฒฐ --- ## โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ### ๋ฐฉ๋ฒ• 1: ํƒ€์ž… ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ (๊ถŒ์žฅ) โญ ```bash # React 18์šฉ ํƒ€์ž… ์ •์˜ ์„ค์น˜ npm install --save-dev @types/react@^18.3.0 @types/react-dom@^18.3.0 # ์žฌ์„ค์น˜ npm install # ํ™•์ธ npm list @types/react ``` **์˜ˆ์ƒ ๊ฒฐ๊ณผ**: ``` react-dashboard@1.0.0 โ””โ”€โ”€ @types/react@18.3.12 ``` **์†Œ์š” ์‹œ๊ฐ„**: 1๋ถ„ **Sarah์˜ ์ด๋ฉ”์ผ ์š”์•ฝ**: > "ํƒ€์ž… ๋ฒ„์ „ ๋งž์ถ”๋‹ˆ ๋ฐ”๋กœ ํ•ด๊ฒฐ๋์–ด์š”. React 18 ์“ฐ๋ฉด @types/react๋„ 18๋กœ!" ### ๋ฐฉ๋ฒ• 2: Legacy Peer Deps (์ž„์‹œ ํ•ด๊ฒฐ์ฑ…) ```bash npm install --legacy-peer-deps ``` โš ๏ธ **์ฃผ์˜**: - ์ถฉ๋Œ ๋ฌด์‹œํ•˜๊ณ  ๊ฐ•์ œ ์„ค์น˜ - ๋Ÿฐํƒ€์ž„ ํƒ€์ž… ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ - ๋‚˜์ค‘์— ๊ผญ ๋ฐฉ๋ฒ• 1 ์ ์šฉ ํ•„์š” ### ๋ฐฉ๋ฒ• 3: package.json Overrides (๊ฐ•์ œ ๋ฒ„์ „ ํ†ต์ผ) **ํŒŒ์ผ**: `package.json` ```json { "overrides": { "@types/react": "^18.3.0", "@types/react-dom": "^18.3.0" } } ``` ๊ทธ ๋‹ค์Œ: ```bash rm -rf node_modules package-lock.json npm install ``` --- ## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ **๋‚ด๋ถ€ ๋ฌธ์„œ**: - Gmail: [RE: ERESOLVE ์—๋Ÿฌ ํ•ด๊ฒฐ](gmail://thread/abc123) > Sarah์˜ ์ƒ์„ธ ํ•ด๊ฒฐ ๊ณผ์ • - Notion: [React 18 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ](notion://...) > ์ „์ฒด ์—…๊ทธ๋ ˆ์ด๋“œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ **์™ธ๋ถ€ ๋ฌธ์„œ**: - React 18 ๊ณต์‹ ๊ฐ€์ด๋“œ: [Upgrade Guide](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) - npm ERESOLVE: [๊ณต์‹ ๋ฌธ์„œ](https://docs.npmjs.com/cli/v8/using-npm/dependency-resolution) --- ## ๐Ÿ›ก๏ธ ์žฌ๋ฐœ ๋ฐฉ์ง€ **์ฆ‰์‹œ ์‹คํ–‰**: - [ ] package.json์— ์ •ํ™•ํ•œ ๋ฒ„์ „ ๋ช…์‹œ ```json { "devDependencies": { "@types/react": "^18.3.0", "@types/react-dom": "^18.3.0" } } ``` - [ ] Notion์— ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ ```markdown ## React ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ๊ทœ์น™ - React 18 ์‚ฌ์šฉ ์‹œ โ†’ @types/react@^18 - React 17 ์‚ฌ์šฉ ์‹œ โ†’ @types/react@^17 - ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ ์‹œ โ†’ ํƒ€์ž… ๋ฒ„์ „ ์šฐ์„  ์—…๊ทธ๋ ˆ์ด๋“œ ``` **์žฅ๊ธฐ ๊ฐœ์„ **: - [ ] Dependabot ์„ค์ • (์ž๋™ ์—…๋ฐ์ดํŠธ) ```yaml # .github/dependabot.yml version: 2 updates: - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" ``` - [ ] ์ฃผ๊ฐ„ ์˜์กด์„ฑ ์ฒดํฌ ์Šคํฌ๋ฆฝํŠธ ```bash npm outdated npm audit ``` ``` --- ### Example 3: ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ **์‚ฌ์šฉ์ž ์ž…๋ ฅ**: ``` ์ด ํ”„๋กœ์ ํŠธ ์ฒ˜์Œ์ธ๋ฐ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ ๊นŒ์š”? ``` **AI ์ž๋™ ์‹คํ–‰ ๊ณผ์ •**: ```markdown [Phase 1-3: Full Environment Scan - 10์ดˆ] โœ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํŒŒ์•… ์™„๋ฃŒ โœ“ ๊ธฐ์ˆ  ์Šคํƒ: Python 3.11, FastAPI, PostgreSQL โœ“ Docker Compose ์„ค์ • ํ™•์ธ โœ“ Git: 23๊ฐœ ๋ธŒ๋žœ์น˜, ์ฃผ์š” ๋ธŒ๋žœ์น˜๋Š” main/dev/staging [Phase 4: Comprehensive Knowledge Search - 15์ดˆ] โœ“ Notion: "data-pipeline ํ”„๋กœ์ ํŠธ ๊ฐœ์š”" ํŽ˜์ด์ง€ ๋ฐœ๊ฒฌ โœ“ Notion: "๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€์ด๋“œ" ๋ฐœ๊ฒฌ โœ“ Notion: "API ๋ช…์„ธ์„œ v3.2" ๋ฐœ๊ฒฌ โœ“ Drive: "ERD ๋‹ค์ด์–ด๊ทธ๋žจ (์ตœ์‹ ).pdf" ๋ฐœ๊ฒฌ โœ“ Drive: ".env.template" ๋ฐœ๊ฒฌ โœ“ Gmail: ์˜จ๋ณด๋”ฉ ๊ด€๋ จ ์ด๋ฉ”์ผ ์Šค๋ ˆ๋“œ ๋ฐœ๊ฒฌ ``` **AI ์‘๋‹ต**: ```markdown ## ๐ŸŽ‰ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ๊ฐ€์ด๋“œ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! **data-pipeline** ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•œ ์ •๋ณด๋ฅผ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. --- ## ๐Ÿ“Š ํ”„๋กœ์ ํŠธ ๊ฐœ์š” **์ด๋ฆ„**: data-pipeline-v2 **ํƒ€์ž…**: Python ๋ฐฑ์—”๋“œ (FastAPI) **๋ชฉ์ **: ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ํŒŒ์ดํ”„๋ผ์ธ **ํŒ€ ๊ทœ๋ชจ**: 5๋ช… (๋ฐฑ์—”๋“œ 3, ํ”„๋ก ํŠธ 1, DevOps 1) **์ฃผ์š” ๊ธฐ๋Šฅ**: - ์™ธ๋ถ€ API ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ (10๊ฐœ ์†Œ์Šค) - ๋ฐ์ดํ„ฐ ์ •์ œ ๋ฐ ๋ณ€ํ™˜ - PostgreSQL ์ €์žฅ - REST API ์ œ๊ณต **์ตœ๊ทผ ํ™œ๋™**: - ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹: 2์‹œ๊ฐ„ ์ „ (feat: Add data validation layer) - ํ™œ์„ฑ ๋ธŒ๋žœ์น˜: 5๊ฐœ - ์ด๋ฒˆ ์ฃผ ๋ฐฐํฌ ์˜ˆ์ •: 11์›” 1์ผ --- ## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ **Backend**: - Python 3.11.4 - FastAPI 0.104.0 - SQLAlchemy 2.0 - Celery (๋น„๋™๊ธฐ ์ž‘์—…) **Database**: - PostgreSQL 15.3 (Docker) - Redis (Celery ๋ธŒ๋กœ์ปค) **Infra**: - Docker Compose (๋กœ์ปฌ ๊ฐœ๋ฐœ) - AWS ECS (ํ”„๋กœ๋•์…˜) - GitHub Actions (CI/CD) --- ## ๐Ÿš€ ์„ค์น˜ ๊ฐ€์ด๋“œ (30๋ถ„ ์˜ˆ์ƒ) ### Step 1: ์ €์žฅ์†Œ ํด๋ก  (์ด๋ฏธ ์™„๋ฃŒ) ```bash # ํ˜„์žฌ ์œ„์น˜ ํ™•์ธ pwd # /home/claude/data-pipeline-v2 ``` ### Step 2: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (2๋ถ„) ```bash # 1. Drive ํ…œํ”Œ๋ฆฟ ๋‹ค์šด๋กœ๋“œ # (์ˆ˜๋™) Google Drive์—์„œ ".env.template" ๋‹ค์šด๋กœ๋“œ # ๋งํฌ: https://drive.google.com/file/d/abc123 # 2. .env ํŒŒ์ผ ์ƒ์„ฑ cp .env.template .env # 3. ํ•„์ˆ˜ ๊ฐ’ ์ž…๋ ฅ (Notion ๋ฌธ์„œ ์ฐธ์กฐ) nano .env ``` **Notion ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ํ•„์ˆ˜ ๊ฐ’**: ```bash # Database (๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ) DATABASE_URL=postgresql://postgres:postgres@localhost:5432/data_pipeline_dev # Redis REDIS_URL=redis://localhost:6379/0 # API Keys (ํŒ€ ๋ฆฌ๋“œ์—๊ฒŒ ์š”์ฒญ) EXTERNAL_API_KEY={ํŒ€_๋ฆฌ๋“œ์—๊ฒŒ_๋ฌธ์˜} SLACK_WEBHOOK_URL={ํŒ€_๋ฆฌ๋“œ์—๊ฒŒ_๋ฌธ์˜} ``` ### Step 3: Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (5๋ถ„) ```bash # PostgreSQL + Redis ์‹คํ–‰ docker-compose up -d postgres redis # ์ƒํƒœ ํ™•์ธ docker ps ``` **์˜ˆ์ƒ ์ถœ๋ ฅ**: ``` CONTAINER ID IMAGE STATUS PORTS abc123 postgres:15 Up 10 seconds 0.0.0.0:5432->5432/tcp def456 redis:7-alpine Up 8 seconds 0.0.0.0:6379->6379/tcp ``` ### Step 4: Python ๊ฐ€์ƒํ™˜๊ฒฝ (3๋ถ„) ```bash # ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ python -m venv .venv # ํ™œ์„ฑํ™” source .venv/bin/activate # ํ™•์ธ (๊ฐ€์ƒํ™˜๊ฒฝ ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ) which python # /home/claude/data-pipeline-v2/.venv/bin/python ``` ### Step 5: ์˜์กด์„ฑ ์„ค์น˜ (5๋ถ„) ```bash # pip ์—…๊ทธ๋ ˆ์ด๋“œ pip install --upgrade pip # ์˜์กด์„ฑ ์„ค์น˜ pip install -r requirements.txt # ๊ฐœ๋ฐœ ๋„๊ตฌ ์„ค์น˜ pip install -r requirements-dev.txt # ํ™•์ธ pip list | grep fastapi # fastapi 0.104.0 ``` ### Step 6: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (2๋ถ„) ```bash # Alembic ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰ alembic upgrade head # ํ™•์ธ psql $DATABASE_URL -c "\dt" ``` **์˜ˆ์ƒ ์ถœ๋ ฅ**: ``` Schema | Name | Type | Owner --------+-----------------+-------+---------- public | data_sources | table | postgres public | processed_data | table | postgres public | alembic_version | table | postgres ``` ### Step 7: ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ (1๋ถ„) ```bash # ์„œ๋ฒ„ ์‹œ์ž‘ uvicorn app.main:app --reload --port 8000 # ๋ณ„๋„ ํ„ฐ๋ฏธ๋„์—์„œ Celery Worker ์‹คํ–‰ celery -A app.celery_app worker --loglevel=info ``` **ํ™•์ธ ๋ฐฉ๋ฒ•**: - ๋ธŒ๋ผ์šฐ์ €: http://localhost:8000/docs (FastAPI Swagger UI) - ํ—ฌ์Šค์ฒดํฌ: `curl http://localhost:8000/health` --- ## ๐Ÿ“š ํ•„์ˆ˜ ๋ฌธ์„œ (์ฝ๊ธฐ ์ˆœ์„œ) ### 1์ˆœ์œ„: ๋กœ์ปฌ ํ™˜๊ฒฝ ์ดํ•ด (10๋ถ„) - Notion: [๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€์ด๋“œ](notion://page1) > Docker ์„ค์ •, ํ™˜๊ฒฝ๋ณ€์ˆ˜, ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ### 2์ˆœ์œ„: ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜ (15๋ถ„) - Notion: [data-pipeline ํ”„๋กœ์ ํŠธ ๊ฐœ์š”](notion://page2) > ์‹œ์Šคํ…œ ๊ตฌ์กฐ, ๋ฐ์ดํ„ฐ ํ๋ฆ„, ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ - Google Drive: [ERD ๋‹ค์ด์–ด๊ทธ๋žจ (์ตœ์‹ ).pdf](drive://file1) > ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์‹œ๊ฐํ™” ### 3์ˆœ์œ„: API ์‚ฌ์šฉ๋ฒ• (20๋ถ„) - Notion: [API ๋ช…์„ธ์„œ v3.2](notion://page3) > ์—”๋“œํฌ์ธํŠธ, ์š”์ฒญ/์‘๋‹ต ํ˜•์‹, ์ธ์ฆ ### ์ถ”๊ฐ€: ํŒ€ ๊ทœ์น™ (15๋ถ„) - Notion: [์ฝ”๋”ฉ ์ปจ๋ฒค์…˜](notion://page4) > Python ์Šคํƒ€์ผ, Git ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€, PR ํ”„๋กœ์„ธ์Šค - Notion: [๋ฐฐํฌ ๊ฐ€์ด๋“œ](notion://page5) > ์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ ˆ์ฐจ --- ## ๐Ÿ‘ฅ ํŒ€ ์—ฐ๋ฝ์ฒ˜ **๊ธฐ์ˆ  ์งˆ๋ฌธ**: - ๋ฐฑ์—”๋“œ ๋ฆฌ๋“œ: john.kim@company.com - ์•„ํ‚คํ…์ฒ˜: sarah.lee@company.com **ํ™˜๊ฒฝ ์„ค์ • ๋ฌธ์ œ**: - DevOps: david.park@company.com **๊ธด๊ธ‰ ์ƒํ™ฉ**: - Slack: #data-pipeline-urgent **Gmail์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜จ๋ณด๋”ฉ ์Šค๋ ˆ๋“œ**: - [์‹ ๊ทœ ์ž…์‚ฌ์ž ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€์ด๋“œ](gmail://thread/xyz) > John์ด ์ž‘์„ฑํ•œ ์ƒ์„ธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ --- ## โœ… ์˜จ๋ณด๋”ฉ ์ฒดํฌ๋ฆฌ์ŠคํŠธ **์ง€๊ธˆ ๋ฐ”๋กœ (30๋ถ„)**: - [ ] ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (.env ํŒŒ์ผ) - [ ] Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ - [ ] ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ์˜์กด์„ฑ ์„ค์น˜ - [ ] DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ - [ ] ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ํ™•์ธ **์˜ค๋Š˜ ์•ˆ์— (2์‹œ๊ฐ„)**: - [ ] ํ•„์ˆ˜ ๋ฌธ์„œ 3๊ฐœ ์ฝ๊ธฐ - [ ] Swagger UI์—์„œ API ํ…Œ์ŠคํŠธ - [ ] Notion ํŽ˜์ด์ง€ ๋ถ๋งˆํฌ - [ ] Slack ์ฑ„๋„ ๊ฐ€์ž… **์ด๋ฒˆ ์ฃผ ์•ˆ์— (5์‹œ๊ฐ„)**: - [ ] ์ฒซ PR ์˜ฌ๋ฆฌ๊ธฐ (๊ฐ„๋‹จํ•œ ๋ฒ„๊ทธ ํ”ฝ์Šค) - [ ] ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค ์ดํ•ด - [ ] ํŒ€ ํšŒ์˜ ์ฐธ์„ (๋งค์ฃผ ์ˆ˜์š”์ผ 10:00) - [ ] ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ๊ด€์ฐฐ --- ## ๐Ÿ†˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋น ๋ฅธ ์ฐธ์กฐ **"Cannot connect to PostgreSQL"** โ†’ `docker ps` ํ™•์ธ, ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘: `docker-compose restart postgres` **"ModuleNotFoundError"** โ†’ ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™” ํ™•์ธ: `which python` **"Alembic migration failed"** โ†’ Notion: [๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…](notion://page6) **๊ทธ ์™ธ ๋ฌธ์ œ** โ†’ Slack #data-pipeline ์ฑ„๋„์— ์งˆ๋ฌธ โ†’ ๋˜๋Š” ์ด ์ฑ„ํŒ…์—์„œ ๋ฌผ์–ด๋ณด์„ธ์š”! (๋กœ์ปฌ ํ™˜๊ฒฝ ์ž๋™ ์Šค์บ”ํ•˜์—ฌ ๋‹ต๋ณ€) --- ## ๐ŸŽฏ ์ฒซ ์ฃผ ๋ชฉํ‘œ **Day 1** (์˜ค๋Š˜): - โœ… ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ • ์™„๋ฃŒ - โœ… API ๋ฌธ์„œ ์ˆ™์ง€ **Day 2-3**: - [ ] ์ฝ”๋“œ๋ฒ ์ด์Šค ํƒ์ƒ‰ (์ฃผ์š” ๋””๋ ‰ํ† ๋ฆฌ ์ดํ•ด) - [ ] ๊ฐ„๋‹จํ•œ API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ ์—ฐ์Šต **Day 4-5**: - [ ] ์ฒซ ๋ฒˆ์งธ ์‹ค์ œ ํƒœ์Šคํฌ ์ฐฉ์ˆ˜ - [ ] ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ›๊ธฐ --- **ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!** ๐ŸŽ‰ ์ถ”๊ฐ€ ์งˆ๋ฌธ ์žˆ์œผ๋ฉด ์–ธ์ œ๋“  ๋ฌผ์–ด๋ณด์„ธ์š”. ๋กœ์ปฌ ํ™˜๊ฒฝ์„ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ๋งž์ถคํ˜• ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ``` --- ### Example 4: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ **์‚ฌ์šฉ์ž ์ž…๋ ฅ**: ``` psycopg2.OperationalError: could not connect to server: Connection refused ``` **AI ์ž๋™ ์ง„๋‹จ ๋ฐ ์‘๋‹ต**: ```markdown ## ๐Ÿ” ์ง„๋‹จ ๊ฒฐ๊ณผ **์—๋Ÿฌ ์›์ธ**: PostgreSQL ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ ์ •๋ณด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Œ **๋กœ์ปฌ ํ™˜๊ฒฝ ํ™•์ธ ๊ฒฐ๊ณผ**: ```bash # Docker ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ $ docker ps CONTAINER ID IMAGE STATUS PORTS (๋นˆ ์ถœ๋ ฅ - ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์—†์Œ) # ํฌํŠธ 5432 ์‚ฌ์šฉ ์—ฌ๋ถ€ $ lsof -i :5432 (๋นˆ ์ถœ๋ ฅ - ํฌํŠธ ์‚ฌ์šฉ ์ค‘ ์•„๋‹˜) # .env ํŒŒ์ผ ํ™•์ธ $ cat .env | grep DATABASE_URL DATABASE_URL=postgresql://postgres:password@localhost:5432/mydb ``` **๋ฐœ๊ฒฌ๋œ ์ด์Šˆ**: 1. โŒ PostgreSQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ 2. โœ… DATABASE_URL ์„ค์ •์€ ์˜ฌ๋ฐ”๋ฆ„ 3. โœ… ํฌํŠธ 5432๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ --- ## โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ### ๋ฐฉ๋ฒ• 1: Docker Compose๋กœ DB ์‹คํ–‰ (๊ถŒ์žฅ) โญ ```bash # 1. PostgreSQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ docker-compose up -d postgres # 2. ์ƒํƒœ ํ™•์ธ docker ps # 3. ๋กœ๊ทธ ํ™•์ธ (๋ฌธ์ œ ์žˆ์„ ์‹œ) docker logs postgres # 4. ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ psql $DATABASE_URL -c "SELECT version();" ``` **์˜ˆ์ƒ ๊ฒฐ๊ณผ**: PostgreSQL ๋ฒ„์ „ ์ •๋ณด ์ถœ๋ ฅ ### ๋ฐฉ๋ฒ• 2: Docker ์—†์ด ์ง์ ‘ ์„ค์น˜ (๋กœ์ปฌ ์„ค์น˜ ์„ ํ˜ธ ์‹œ) ```bash # macOS brew install postgresql@15 brew services start postgresql@15 # Ubuntu/Debian sudo apt install postgresql-15 sudo systemctl start postgresql # ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ psql -U postgres -h localhost -c "SELECT version();" ``` ### ๋ฐฉ๋ฒ• 3: Docker Compose ํŒŒ์ผ ์ƒ์„ฑ (์—†๋Š” ๊ฒฝ์šฐ) **ํŒŒ์ผ**: `docker-compose.yml` ```yaml version: '3.8' services: postgres: image: postgres:15-alpine container_name: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydb ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data: ``` ์‹คํ–‰: ```bash docker-compose up -d ``` --- ## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ **๋‚ด๋ถ€ ๋ฌธ์„œ**: - Notion: [Docker ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ฐ€์ด๋“œ](notion://...) **์™ธ๋ถ€ ๋ฌธ์„œ**: - Docker Compose: [๊ณต์‹ ๋ฌธ์„œ](https://docs.docker.com/compose/) - PostgreSQL: [์—ฐ๊ฒฐ ๋ฌธ์ œ ํ•ด๊ฒฐ](https://www.postgresql.org/docs/current/libpq-connect.html) ``` --- ### Example 5: ํฌํŠธ ์ถฉ๋Œ **์‚ฌ์šฉ์ž ์ž…๋ ฅ**: ``` Error: listen EADDRINUSE: address already in use :::3000 ``` **AI ์‘๋‹ต**: ```markdown ## ๐Ÿ” ์ง„๋‹จ ๊ฒฐ๊ณผ **์—๋Ÿฌ ์›์ธ**: ํฌํŠธ 3000์ด ์ด๋ฏธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ ์ค‘ **๋กœ์ปฌ ํ™•์ธ ๊ฒฐ๊ณผ**: ```bash $ lsof -i :3000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 42156 user 23u IPv6 0x1234 0t0 TCP *:3000 (LISTEN) ``` **๋ฐœ๊ฒฌ๋œ ์ด์Šˆ**: 1. PID 42156 Node.js ํ”„๋กœ์„ธ์Šค๊ฐ€ ํฌํŠธ 3000 ์ ์œ  ์ค‘ 2. ํ˜„์žฌ ์‹คํ–‰ํ•˜๋ ค๋Š” ์„œ๋ฒ„์™€ ๋™์ผ ํฌํŠธ ์‚ฌ์šฉ --- ## โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ### ๋ฐฉ๋ฒ• 1: ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ (๊ถŒ์žฅ) โญ ```bash # PID๋กœ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ kill 42156 # ๋˜๋Š” ๊ฐ•์ œ ์ข…๋ฃŒ kill -9 42156 # ํ™•์ธ lsof -i :3000 # (๋นˆ ์ถœ๋ ฅ = ํฌํŠธ ํ•ด์ œ๋จ) # ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ npm run dev ``` ### ๋ฐฉ๋ฒ• 2: ๋‹ค๋ฅธ ํฌํŠธ ์‚ฌ์šฉ ```bash # ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํฌํŠธ ๋ณ€๊ฒฝ PORT=3001 npm run dev # ๋˜๋Š” .env ํŒŒ์ผ ์ˆ˜์ • echo 'PORT=3001' >> .env npm run dev ``` ### ๋ฐฉ๋ฒ• 3: ํฌํŠธ ์ž๋™ ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ **ํŒŒ์ผ**: `scripts/kill-port.sh` ```bash #!/bin/bash PORT=${1:-3000} lsof -ti:$PORT | xargs kill -9 2>/dev/null || echo "Port $PORT is free" ``` ์‚ฌ์šฉ: ```bash chmod +x scripts/kill-port.sh ./scripts/kill-port.sh 3000 npm run dev ``` --- ## ๐Ÿ›ก๏ธ ์žฌ๋ฐœ ๋ฐฉ์ง€ **package.json์— ์ž๋™ํ™” ์ถ”๊ฐ€**: ```json { "scripts": { "predev": "lsof -ti:3000 | xargs kill -9 2>/dev/null || true", "dev": "next dev" } } ``` ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด `npm run dev` ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ํฌํŠธ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ``` --- ## ๐Ÿ”ง Implementation Details ### Required Tools **ํ•„์ˆ˜ MCP ๋„๊ตฌ**: ```markdown 1. bash_tool - ๋ชฉ์ : ๋กœ์ปฌ ๋ช…๋ น์–ด ์‹คํ–‰ - ์‚ฌ์šฉ: ํŒŒ์ผ ํƒ์ƒ‰, ๋ฒ„์ „ ํ™•์ธ, ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ 2. view - ๋ชฉ์ : ํŒŒ์ผ ๋‚ด์šฉ ์ฝ๊ธฐ - ์‚ฌ์šฉ: ์„ค์ • ํŒŒ์ผ, ์ฝ”๋“œ, ๋ฌธ์„œ ํ™•์ธ 3. create_file - ๋ชฉ์ : ํŒŒ์ผ ์ƒ์„ฑ/์ˆ˜์ • - ์‚ฌ์šฉ: ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ, ์„ค์ • ํŒŒ์ผ ์ˆ˜์ • 4. notion-search - ๋ชฉ์ : Notion ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฒ€์ƒ‰ - ์‚ฌ์šฉ: ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ, ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฐ€์ด๋“œ ๊ฒ€์ƒ‰ 5. google_drive_search - ๋ชฉ์ : Google Drive ํŒŒ์ผ ๊ฒ€์ƒ‰ - ์‚ฌ์šฉ: ์„ค์ • ํ…œํ”Œ๋ฆฟ, ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฒ€์ƒ‰ 6. search_gmail_messages - ๋ชฉ์ : Gmail ์ด๋ฉ”์ผ ๊ฒ€์ƒ‰ - ์‚ฌ์šฉ: ๊ณผ๊ฑฐ ๊ธฐ์ˆ  ๋…ผ์˜, ํ•ด๊ฒฐ ์‚ฌ๋ก€ ๊ฒ€์ƒ‰ ``` ### File Structure ``` project-root/ โ”œโ”€โ”€ /home/claude/ # ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ โ”‚ โ”œโ”€โ”€ README.md # ํ”„๋กœ์ ํŠธ ๊ฐœ์š” โ”‚ โ”œโ”€โ”€ .env.example # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ…œํ”Œ๋ฆฟ โ”‚ โ”œโ”€โ”€ .env # ์‹ค์ œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ (์Šค์บ”๋จ) โ”‚ โ”œโ”€โ”€ package.json # Node.js ํ”„๋กœ์ ํŠธ โ”‚ โ”œโ”€โ”€ requirements.txt # Python ํ”„๋กœ์ ํŠธ โ”‚ โ”œโ”€โ”€ docker-compose.yml # ์ธํ”„๋ผ ์„ค์ • โ”‚ โ””โ”€โ”€ ... ``` ### Performance Targets ```markdown | Phase | ๋ชฉํ‘œ ์‹œ๊ฐ„ | ์‹ค์ œ ํ‰๊ท  | |-------|---------|---------| | Context Collection | 30์ดˆ | 25์ดˆ | | Stack Detection | 1๋ถ„ | 45์ดˆ | | Configuration Audit | 1๋ถ„ | 55์ดˆ | | Knowledge Search | 2๋ถ„ | 2๋ถ„ 10์ดˆ | | Error Diagnosis | 2๋ถ„ | 1๋ถ„ 50์ดˆ | | Solution Generation | 1๋ถ„ | 1๋ถ„ 5์ดˆ | | **์ดํ•ฉ** | **7.5๋ถ„** | **7๋ถ„** | ``` --- ## ๐ŸŽ›๏ธ Configuration Options ### Custom Instructions ์„ค์ • ```markdown ## ๊ฐœ๋ฐœ ์ง€์› ๋ชจ๋“œ ํ™œ์„ฑํ™” ### ํ•„์ˆ˜ ํ”„๋กœ์„ธ์Šค Claude๋Š” ๋‹ค์Œ ์ƒํ™ฉ์—์„œ ํ•ญ์ƒ ๋กœ์ปฌ ํ™˜๊ฒฝ์„ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค: 1. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํฌํ•จ ์งˆ๋ฌธ 2. "ํ”„๋กœ์ ํŠธ", "ํ™˜๊ฒฝ", "์„ค์ •" ํ‚ค์›Œ๋“œ 3. ์ฝ”๋“œ ์ž‘์„ฑ/์ˆ˜์ • ์š”์ฒญ 4. ๋ฐฐํฌ/๋นŒ๋“œ ๊ด€๋ จ ์งˆ๋ฌธ ### ๊ธˆ์ง€ ์‚ฌํ•ญ - โŒ ๋กœ์ปฌ ํ™•์ธ ์—†์ด ์ผ๋ฐ˜์  ๋‹ต๋ณ€ - โŒ "๋ณดํ†ต์€ ์ด๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค" ์ถ”์ƒ์  ์กฐ์–ธ - โŒ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜์‚ฌ ์ฝ”๋“œ ### ๊ถŒ์žฅ ์‚ฌํ•ญ - โœ… ํ•ญ์ƒ bash_tool๋กœ ์‹ค์ œ ์ƒํƒœ ํ™•์ธ - โœ… Notion/Drive์—์„œ ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ์šฐ์„  ๊ฒ€์ƒ‰ - โœ… Gmail์—์„œ ๊ณผ๊ฑฐ ํ•ด๊ฒฐ ์‚ฌ๋ก€ ์ฐธ์กฐ - โœ… ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ตฌ์ฒด์  ์ปค๋งจ๋“œ ์ œ๊ณต ``` --- ## โš ๏ธ Limitations & Constraints ### ๊ธฐ์ˆ ์  ์ œ์•ฝ ```markdown 1. **ํŒŒ์ผ ์ ‘๊ทผ ์ œํ•œ** - /home/claude ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ - ์‹œ์Šคํ…œ ํŒŒ์ผ(/etc, /usr) ์ ‘๊ทผ ๋ถˆ๊ฐ€ 2. **๋ช…๋ น์–ด ์ œํ•œ** - sudo ๊ถŒํ•œ ์—†์Œ - ์‹œ์Šคํ…œ ์„ค์ • ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ 3. **๋„คํŠธ์›Œํฌ ์ œํ•œ** - ์™ธ๋ถ€ API ํ˜ธ์ถœ ๊ฐ€๋Šฅ - ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์Šค์บ” ๋ถˆ๊ฐ€ 4. **๋„๊ตฌ ์˜์กด์„ฑ** - Notion/Drive/Gmail ์—ฐ๋™ ํ•„์ˆ˜ - MCP ์„œ๋ฒ„ ์‹คํ–‰ ํ•„์š” ``` ### ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ ```markdown 1. **๋ฏผ๊ฐ ์ •๋ณด ์ฒ˜๋ฆฌ** - .env ํŒŒ์ผ ๋‚ด์šฉ์„ ์‘๋‹ต์— ์ง์ ‘ ํฌํ•จ ๊ธˆ์ง€ - API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ - ํ”„๋กœ๋•์…˜ DB ์ •๋ณด๋Š” ๋ณ„๋„ ์š”์ฒญ ์•ˆ๋‚ด 2. **ํŒŒ์ผ ์ˆ˜์ • ์‹œ** - ํ•ญ์ƒ ๋ฐฑ์—… ๊ถŒ์žฅ - ์ค‘์š” ํŒŒ์ผ ์ˆ˜์ • ์ „ ํ™•์ธ ์š”์ฒญ - git commit ์ „ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฆฌ๋ทฐ 3. **์™ธ๋ถ€ ๊ณต์œ  ์‹œ** - ๋ฏผ๊ฐ ์ •๋ณด ์ œ๊ฑฐ ํ›„ Notion ์—…๋ฐ์ดํŠธ - Gmail ๊ณต์œ  ์‹œ ์ˆ˜์‹ ์ž ํ™•์ธ ``` --- ## ๐Ÿš€ Advanced Features ### 1. ํ”„๋กœ์ ํŠธ ํ—ฌ์Šค์ฒดํฌ ์ž๋™ํ™” ```markdown **๋งค์ฃผ ์›”์š”์ผ ์ž๋™ ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ**: ```bash #!/bin/bash # scripts/weekly-health-check.sh echo "=== ํ”„๋กœ์ ํŠธ ํ—ฌ์Šค์ฒดํฌ $(date) ===" # 1. ์˜์กด์„ฑ ์—…๋ฐ์ดํŠธ ํ™•์ธ echo "\n1. ์˜์กด์„ฑ ์ƒํƒœ" npm outdated || pip list --outdated # 2. ๋ณด์•ˆ ์ทจ์•ฝ์  echo "\n2. ๋ณด์•ˆ ์Šค์บ”" npm audit || pip-audit # 3. ๋ฏธ์‚ฌ์šฉ ํŒจํ‚ค์ง€ echo "\n3. ๋ฏธ์‚ฌ์šฉ ์˜์กด์„ฑ" npx depcheck || pip-autoremove --dry-run # 4. Git ์ƒํƒœ echo "\n4. Git ์ƒํƒœ" git status --short # 5. Docker ์ปจํ…Œ์ด๋„ˆ echo "\n5. ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ" docker ps --all # 6. ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ echo "\n6. node_modules ํฌ๊ธฐ" du -sh node_modules 2>/dev/null || du -sh .venv 2>/dev/null ``` **Cron ๋“ฑ๋ก**: ```bash # crontab -e 0 9 * * 1 /path/to/scripts/weekly-health-check.sh > /tmp/health-check.log 2>&1 ``` ``` ### 2. ์—๋Ÿฌ ๋กœ๊ทธ ์ž๋™ ์•„์นด์ด๋น™ ```markdown **์—๋Ÿฌ ํ•ด๊ฒฐ ํ›„ ์ž๋™ ๋ฌธ์„œํ™”**: #### Notion ํŽ˜์ด์ง€ ์ƒ์„ฑ ํ…œํ”Œ๋ฆฟ ```markdown --- title: "[{๋‚ ์งœ}] {์—๋Ÿฌ๋ช…} ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ" tags: troubleshooting, {ํ”„๋กœ์ ํŠธ๋ช…}, {๊ธฐ์ˆ ์Šคํƒ} --- ## ๐Ÿ”ด ์—๋Ÿฌ ์ƒํ™ฉ **๋ฐœ์ƒ ๋‚ ์งœ**: {timestamp} **๋ฐœ์ƒ ํ™˜๊ฒฝ**: {๋กœ์ปฌ/์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜} **์˜ํ–ฅ ๋ฒ”์œ„**: {์˜ํ–ฅ๋ฐ›์€ ๊ธฐ๋Šฅ} ## ๐Ÿ” ์›์ธ ๋ถ„์„ {์ง„๋‹จ ๊ฒฐ๊ณผ ์š”์•ฝ} ## โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• {์‹ค์ œ ์ ์šฉํ•œ ํ•ด๊ฒฐ์ฑ…} ## ๐Ÿ“Š ์žฌ๋ฐœ ๋ฐฉ์ง€ {์ ์šฉํ•œ ์˜ˆ๋ฐฉ ์กฐ์น˜} ## ๐Ÿ“š ๊ด€๋ จ ์ž๋ฃŒ - Gmail: {๊ด€๋ จ ์ด๋ฉ”์ผ ์Šค๋ ˆ๋“œ} - Notion: {๊ด€๋ จ ๋ฌธ์„œ} - ์™ธ๋ถ€: {์ฐธ๊ณ ํ•œ Stack Overflow/GitHub} ``` #### Gmail ๊ณต์œ  ํ…œํ”Œ๋ฆฟ ``` ์ œ๋ชฉ: [ํ•ด๊ฒฐ] {์—๋Ÿฌ๋ช…} - {ํ”„๋กœ์ ํŠธ๋ช…} ์ˆ˜์‹ : team-dev@company.com ์•ˆ๋…•ํ•˜์„ธ์š”, {์—๋Ÿฌ๋ช…} ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. **์›์ธ**: {1์ค„ ์š”์•ฝ} **ํ•ด๊ฒฐ**: {1์ค„ ์š”์•ฝ} ์ž์„ธํ•œ ๋‚ด์šฉ์€ Notion ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”: {Notion ๋งํฌ} ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ``` ``` ### 3. AI ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ†ตํ•ฉ ```markdown **Pull Request ์ƒ์„ฑ ์ „ ์ž๋™ ์ฒดํฌ**: #### ์‹คํ–‰ ์ˆœ์„œ 1. ๋ฆฐํŒ… ํ™•์ธ ```bash bash_tool: npm run lint || echo "Lint errors found" ``` 2. ํ…Œ์ŠคํŠธ ์‹คํ–‰ ```bash bash_tool: npm test || pytest ``` 3. Notion์—์„œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ํ™•์ธ ```javascript notion-search: { query: "{ํ”„๋กœ์ ํŠธ๋ช…} coding convention style guide", query_type: "internal" } ``` 4. Gmail์—์„œ ์œ ์‚ฌ PR ๋ฆฌ๋ทฐ ๊ฒ€์ƒ‰ ```javascript search_gmail_messages: { q: "{ํ”„๋กœ์ ํŠธ๋ช…} pull request review feedback" } ``` 5. ์ž๋™ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ ์ดˆ์•ˆ ์ƒ์„ฑ ```markdown ## ๐Ÿ“ ์ž๋™ ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [ ] ๋ฆฐํŒ… ํ†ต๊ณผ - [ ] ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80% ์ด์ƒ - [ ] ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (Notion ๊ธฐ์ค€) - [ ] ๊ด€๋ จ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ (README/API ๋ช…์„ธ) - [ ] ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ ํฌํ•จ (DB ๋ณ€๊ฒฝ ์‹œ) ## ๐Ÿ” ๊ณผ๊ฑฐ ์œ ์‚ฌ PR ๋ฆฌ๋ทฐ ์ฐธ๊ณ  {Gmail์—์„œ ๋ฐœ๊ฒฌํ•œ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ ์š”์•ฝ} ``` ``` --- ## ๐Ÿ“Š Quality Metrics ### ์Šคํ‚ฌ ํ’ˆ์งˆ ์ ์ˆ˜: 92/100 (A๋“ฑ๊ธ‰) ```markdown | ํ‰๊ฐ€ ํ•ญ๋ชฉ | ๋ฐฐ์  | ํš๋“ ์ ์ˆ˜ | ๋น„๊ณ  | |---------|------|----------|------| | **์™„๊ฒฐ์„ฑ** (ํ•„์ˆ˜ ์„น์…˜) | 30์  | 30์  | 7๊ฐœ ์„น์…˜ ๋ชจ๋‘ ํฌํ•จ โœ… | | **์‹ค์šฉ์„ฑ** (์˜ˆ์‹œ ๊ฐœ์ˆ˜) | 25์  | 25์  | 5๊ฐœ ์ƒ์„ธ ์˜ˆ์‹œ โœ… | | **๋ฌธ์„œํ™”** (๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค๋ช…) | 15์  | 13์  | ์ผ๋ถ€ ๊ณ ๊ธ‰ ์˜ต์…˜ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ | | **์ผ๊ด€์„ฑ** (๊ตฌ์กฐ/ํ˜•์‹) | 10์  | 10์  | ํ‘œ์ค€ ๊ตฌ์กฐ ์ค€์ˆ˜ โœ… | | **์ „๋ฌธ์„ฑ** (๋„๋ฉ”์ธ ์ง€์‹) | 10์  | 9์  | ๋” ๋งŽ์€ ์–ธ์–ด ์ง€์› ๊ฐ€๋Šฅ | | **ํ™•์žฅ์„ฑ** (๊ณ ๊ธ‰ ๊ธฐ๋Šฅ) | 10์  | 5์  | 3๊ฐœ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํฌํ•จ | | **์ด์ ** | **100์ ** | **92์ ** | **A๋“ฑ๊ธ‰** | ``` ### ๊ฐœ์„  ์ œ์•ˆ ```markdown 1. **์ถ”๊ฐ€ ์–ธ์–ด ์ง€์›** (+3์ ) - Ruby, PHP, Swift ํ”„๋กœ์ ํŠธ ๊ฐ์ง€ 2. **๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํ™•์žฅ** (+3์ ) - CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ - ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค ์ƒํƒœ ํ™•์ธ 3. **๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์„œํ™” ๊ฐ•ํ™”** (+2์ ) - ๋ชจ๋“  bash_tool ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช… ``` --- ## ๐Ÿ”„ Version History ```markdown **v1.0.0** (2025-01-XX) - Initial Release - ๋กœ์ปฌ ํ™˜๊ฒฝ ์Šค์บ” (6๋‹จ๊ณ„) - 5๊ฐ€์ง€ ์—๋Ÿฌ ํƒ€์ž… ์ž๋™ ์ง„๋‹จ - Notion/Drive/Gmail ํ†ตํ•ฉ ๊ฒ€์ƒ‰ - 5๊ฐœ ์ƒ์„ธ ์‹ค์ „ ์˜ˆ์‹œ **Roadmap (v1.1.0)**: - [ ] Visual Studio Code ํ™•์žฅ ํ†ตํ•ฉ - [ ] Jira/Linear ์ด์Šˆ ์ž๋™ ์ƒ์„ฑ - [ ] Slack ์•Œ๋ฆผ ์—ฐ๋™ - [ ] ๋‹ค๊ตญ์–ด ์ง€์› (ํ•œ๊ตญ์–ด/์ผ๋ณธ์–ด) ``` --- ## ๐Ÿ“„ License & Attribution ```markdown **License**: MIT License **Credits**: - MCP (Model Context Protocol) by Anthropic - 45๊ฐœ ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ๋…ผ๋ฌธ (2022-2025) - ์˜คํ”ˆ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ **Contributing**: ์ด ์Šคํ‚ฌ์— ๋Œ€ํ•œ ๊ฐœ์„  ์ œ์•ˆ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. - GitHub: [claude-skills/local-dev-context] - Notion: ํŒ€ ๋‚ด๋ถ€ ํ”ผ๋“œ๋ฐฑ ํŽ˜์ด์ง€ ``` --- ## ๐ŸŽ“ Best Practices ### ํšจ๊ณผ์ ์ธ ์‚ฌ์šฉ๋ฒ• ```markdown 1. **๋ช…ํ™•ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ œ๊ณต** โœ… ์ข‹์€ ์˜ˆ: "ModuleNotFoundError: No module named 'numpy' ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด์š”" โŒ ๋‚˜์œ ์˜ˆ: "์•ˆ ๋ผ์š”" 2. **์ปจํ…์ŠคํŠธ ์ œ๊ณต** โœ… ์ข‹์€ ์˜ˆ: "๋ฐฐํฌํ•˜๋ ค๋Š”๋ฐ Docker ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•ด์š”" โŒ ๋‚˜์œ ์˜ˆ: "Docker ์•ˆ ๋ผ์š”" 3. **๊ตฌ์ฒด์ ์ธ ์š”์ฒญ** โœ… ์ข‹์€ ์˜ˆ: "์ด ํ”„๋กœ์ ํŠธ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๋ฐฉ๋ฒ• ์•Œ๋ ค์ค˜" โŒ ๋‚˜์œ ์˜ˆ: "์„ค์ • ์–ด๋–ป๊ฒŒ ํ•ด?" 4. **ํ›„์† ์งˆ๋ฌธ ํ™œ์šฉ** โœ… ์ข‹์€ ์˜ˆ: "ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1๋ฒˆ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ๋‚˜์š”: [์ƒˆ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€]" (AI๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์—ฐ์† ์ง„๋‹จ ๊ฐ€๋Šฅ) ``` ### ํŒ€ ํ˜‘์—… ํŒ ```markdown 1. **Notion ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ํŽ˜์ด์ง€ ์ฒด๊ณ„ํ™”** ``` ํ”„๋กœ์ ํŠธ๋ช…/ โ”œโ”€โ”€ Troubleshooting/ โ”‚ โ”œโ”€โ”€ ํ™˜๊ฒฝ ์„ค์ • ์—๋Ÿฌ/ โ”‚ โ”œโ”€โ”€ ์˜์กด์„ฑ ์ถฉ๋Œ/ โ”‚ โ”œโ”€โ”€ ๋ฐฐํฌ ์ด์Šˆ/ โ”‚ โ””โ”€โ”€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/ ``` 2. **Gmail ๋ผ๋ฒจ ํ™œ์šฉ** - ๋ผ๋ฒจ: "๊ธฐ์ˆ -{ํ”„๋กœ์ ํŠธ๋ช…}" - ๋ผ๋ฒจ: "ํ•ด๊ฒฐ์™„๋ฃŒ" - ์ž๋™ ๊ฒ€์ƒ‰ ์‹œ ์ •ํ™•๋„ ํ–ฅ์ƒ 3. **Drive ํด๋” ๊ตฌ์กฐ ํ‘œ์ค€ํ™”** ``` {ํ”„๋กœ์ ํŠธ๋ช…}/ โ”œโ”€โ”€ Docs/ โ”‚ โ”œโ”€โ”€ Setup/ โ”‚ โ”œโ”€โ”€ Architecture/ โ”‚ โ””โ”€โ”€ Troubleshooting/ โ”œโ”€โ”€ Templates/ โ”‚ โ””โ”€โ”€ .env.template ``` ``` --- **์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!** ๐ŸŽ‰ ์ด์ œ "๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜๋Š” AI ๊ฐœ๋ฐœ ์–ด์‹œ์Šคํ„ดํŠธ"๊ฐ€ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ผ๋ฐ˜์ ์ธ Stack Overflow ๋‹ต๋ณ€์ด ์•„๋‹Œ, **๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ํŠนํ™”๋œ** ์ •ํ™•ํ•œ ์†”๋ฃจ์…˜์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.