@su-record/vibe 2.2.2 โ†’ 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.claude/settings.json +152 -152
  2. package/.claude/vibe/constitution.md +184 -184
  3. package/.claude/vibe/rules/core/communication-guide.md +104 -104
  4. package/.claude/vibe/rules/core/development-philosophy.md +52 -52
  5. package/.claude/vibe/rules/core/quick-start.md +120 -120
  6. package/.claude/vibe/rules/quality/bdd-contract-testing.md +388 -388
  7. package/.claude/vibe/rules/quality/checklist.md +276 -276
  8. package/.claude/vibe/rules/quality/testing-strategy.md +437 -437
  9. package/.claude/vibe/rules/standards/anti-patterns.md +369 -369
  10. package/.claude/vibe/rules/standards/code-structure.md +291 -291
  11. package/.claude/vibe/rules/standards/complexity-metrics.md +312 -312
  12. package/.claude/vibe/rules/standards/naming-conventions.md +198 -198
  13. package/.claude/vibe/setup.sh +31 -31
  14. package/CLAUDE.md +323 -323
  15. package/LICENSE +21 -21
  16. package/README.md +724 -721
  17. package/agents/explorer.md +48 -0
  18. package/agents/implementer.md +53 -0
  19. package/agents/research/best-practices-agent.md +139 -0
  20. package/agents/research/codebase-patterns-agent.md +147 -0
  21. package/agents/research/framework-docs-agent.md +181 -0
  22. package/agents/research/security-advisory-agent.md +167 -0
  23. package/agents/review/architecture-reviewer.md +107 -0
  24. package/agents/review/complexity-reviewer.md +116 -0
  25. package/agents/review/data-integrity-reviewer.md +88 -0
  26. package/agents/review/git-history-reviewer.md +103 -0
  27. package/agents/review/performance-reviewer.md +86 -0
  28. package/agents/review/python-reviewer.md +152 -0
  29. package/agents/review/rails-reviewer.md +139 -0
  30. package/agents/review/react-reviewer.md +144 -0
  31. package/agents/review/security-reviewer.md +80 -0
  32. package/agents/review/simplicity-reviewer.md +140 -0
  33. package/agents/review/test-coverage-reviewer.md +116 -0
  34. package/agents/review/typescript-reviewer.md +127 -0
  35. package/agents/searcher.md +54 -0
  36. package/agents/simplifier.md +119 -0
  37. package/agents/tester.md +49 -0
  38. package/commands/vibe.analyze.md +239 -0
  39. package/commands/vibe.compound.md +261 -0
  40. package/commands/vibe.continue.md +88 -0
  41. package/commands/vibe.diagram.md +178 -0
  42. package/commands/vibe.e2e.md +266 -0
  43. package/commands/vibe.reason.md +306 -0
  44. package/commands/vibe.review.md +324 -0
  45. package/commands/vibe.run.md +836 -0
  46. package/commands/vibe.setup.md +97 -0
  47. package/commands/vibe.spec.md +383 -0
  48. package/commands/vibe.ui.md +137 -0
  49. package/commands/vibe.verify.md +238 -0
  50. package/dist/cli/index.js +389 -389
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/lib/MemoryManager.js +92 -92
  53. package/dist/lib/PythonParser.js +108 -108
  54. package/dist/lib/gemini-mcp.js +15 -15
  55. package/dist/lib/gemini-oauth.js +35 -35
  56. package/dist/lib/gpt-mcp.js +17 -17
  57. package/dist/lib/gpt-oauth.js +44 -44
  58. package/dist/tools/analytics/getUsageAnalytics.js +12 -12
  59. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  60. package/dist/tools/memory/getMemoryGraph.js +12 -12
  61. package/dist/tools/memory/getSessionContext.js +9 -9
  62. package/dist/tools/memory/linkMemories.js +14 -14
  63. package/dist/tools/memory/listMemories.js +4 -4
  64. package/dist/tools/memory/recallMemory.js +4 -4
  65. package/dist/tools/memory/saveMemory.js +4 -4
  66. package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
  67. package/dist/tools/planning/generatePrd.js +46 -46
  68. package/dist/tools/prompt/enhancePromptGemini.js +160 -160
  69. package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
  70. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  71. package/package.json +69 -66
  72. package/skills/git-worktree.md +178 -0
  73. package/skills/priority-todos.md +236 -0
  74. package/templates/constitution-template.md +184 -184
  75. package/templates/contract-backend-template.md +517 -517
  76. package/templates/contract-frontend-template.md +594 -594
  77. package/templates/feature-template.md +96 -96
  78. package/templates/hooks-template.json +103 -103
  79. package/templates/spec-template.md +199 -199
  80. package/.claude/vibe/rules/tools/mcp-hi-ai-guide.md +0 -665
  81. package/.claude/vibe/rules/tools/mcp-workflow.md +0 -51
@@ -1,104 +1,104 @@
1
- # ๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ฐ€์ด๋“œ
2
-
3
- ## โš ๏ธ ์ตœ์šฐ์„  ๊ทœ์น™: ํ•œ๊ตญ์–ด๋กœ ์‘๋‹ต
4
-
5
- **๋ชจ๋“  ๋Œ€ํ™”, ์„ค๋ช…, ์ฃผ์„์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.**
6
-
7
- - โœ… AI ์‘๋‹ต: ํ•œ๊ตญ์–ด
8
- - โœ… ์ฝ”๋“œ ์ฃผ์„: ํ•œ๊ตญ์–ด
9
- - โœ… ๋ฌธ์„œ: ํ•œ๊ตญ์–ด
10
- - โœ… ์—๋Ÿฌ ๋ฉ”์‹œ์ง€: ํ•œ๊ตญ์–ด
11
- - โš ๏ธ ์˜ˆ์™ธ: ์ฝ”๋“œ ์ž์ฒด (ํ•จ์ˆ˜๋ช…, ๋ณ€์ˆ˜๋ช… ๋“ฑ)๋Š” ์˜์–ด
12
-
13
- ## 3.1 ์ฝ”๋“œ ์ œ๊ณต ํ˜•์‹
14
-
15
- ```markdown
16
- ### ์ž‘์—… ๋ฒ”์œ„
17
-
18
- "์š”์ฒญํ•˜์‹  ๋Œ€๋กœ UserProfile ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง๋งŒ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค."
19
-
20
- ### ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ
21
-
22
- ์ฃผ๋ฌธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง ๊ฐœ์„  - Optimistic updates ์ ์šฉ
23
-
24
- ### ์ฝ”๋“œ
25
-
26
- [์™„์ „ํ•œ ์ฝ”๋“œ ๋ธ”๋ก]
27
-
28
- ### ์ฐธ๊ณ ์‚ฌํ•ญ
29
-
30
- - ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ž๋™ ๋กค๋ฐฑ
31
- - ๋„คํŠธ์›Œํฌ ์žฌ์‹œ๋„ 3ํšŒ
32
- ```
33
-
34
- ## 3.2 ๋ฆฌ๋ทฐ ์‘๋‹ต ํ˜•์‹
35
-
36
- ```markdown
37
- ### ๊ฐœ์„ ์ 
38
-
39
- 1. memoization ๋ˆ„๋ฝ (์„ฑ๋Šฅ)
40
- 2. error boundary ๋ฏธ์ ์šฉ (์•ˆ์ •์„ฑ)
41
-
42
- ### ๊ถŒ์žฅ์‚ฌํ•ญ
43
-
44
- useMemo ์ ์šฉ ๋ฐ ErrorBoundary๋กœ ๊ฐ์‹ธ๊ธฐ
45
- ```
46
-
47
- ## 3.3 ์—๋Ÿฌ ๋ณด๊ณ  ํ˜•์‹
48
-
49
- ```markdown
50
- ### ๋ฌธ์ œ
51
-
52
- [๋ฐœ์ƒํ•œ ๋ฌธ์ œ ๋ช…ํ™•ํžˆ ์„ค๋ช…]
53
-
54
- ### ์›์ธ
55
-
56
- [๋ถ„์„๋œ ์›์ธ]
57
-
58
- ### ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
59
-
60
- [๊ตฌ์ฒด์ ์ธ ํ•ด๊ฒฐ ๋‹จ๊ณ„]
61
-
62
- ### ์˜ˆ๋ฐฉ์ฑ…
63
-
64
- [ํ–ฅํ›„ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•]
65
- ```
66
-
67
- ## 3.4 ๋ณ€๊ฒฝ์‚ฌํ•ญ ์„ค๋ช… ์›์น™
68
-
69
- - **๋ช…ํ™•์„ฑ**: ๋ฌด์—‡์„ ์™œ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ
70
- - **๊ฐ„๊ฒฐ์„ฑ**: ํ•ต์‹ฌ๋งŒ ์ „๋‹ฌ
71
- - **์™„์ „์„ฑ**: ๋ถ€์ž‘์šฉ๊ณผ ์ฃผ์˜์‚ฌํ•ญ ํฌํ•จ
72
- - **์ถ”์ ์„ฑ**: ๊ด€๋ จ ์ด์Šˆ/์š”์ฒญ ์ฐธ์กฐ
73
-
74
- ## 3.5 ํŠน์ˆ˜ ๋ช…๋ น์–ด ์‹คํ–‰
75
-
76
- - **"optimize"**: ์„ฑ๋Šฅ ๊ฐœ์„  (memoization, ๋ฒˆ๋“ค ํฌ๊ธฐ ๋“ฑ)
77
- - **"enhance accessibility"**: ARIA, ํ‚ค๋ณด๋“œ ์ง€์› ๋“ฑ ์ถ”๊ฐ€
78
- - **"strengthen types"**: any ์ œ๊ฑฐ, ํƒ€์ž… ์•ˆ์ „์„ฑ ํ–ฅ์ƒ
79
- - **"cleanup"**: ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ (์š”์ฒญ ์‹œ์—๋งŒ)
80
- - **"split"**: ์ปดํฌ๋„ŒํŠธ/ํ•จ์ˆ˜ ๋ถ„๋ฆฌ (์š”์ฒญ ์‹œ์—๋งŒ)
81
-
82
- ## 3.6 ์งˆ๋ฌธ ํ˜•์‹
83
-
84
- ### ๋ช…ํ™•์„ฑ์ด ํ•„์š”ํ•  ๋•Œ
85
-
86
- ```markdown
87
- ๋‹ค์Œ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”:
88
-
89
- 1. [๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ 1]
90
- 2. [๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ 2]
91
-
92
- ์ด ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ๋” ์ •ํ™•ํ•œ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
93
- ```
94
-
95
- ### ๋Œ€์•ˆ ์ œ์‹œ
96
-
97
- ```markdown
98
- ์š”์ฒญํ•˜์‹  ๋ฐฉ๋ฒ• ์™ธ์— ๋‹ค์Œ ๋Œ€์•ˆ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
99
-
100
- **๋ฐฉ๋ฒ• A**: [์„ค๋ช…] - ์žฅ์ : [์žฅ์ ], ๋‹จ์ : [๋‹จ์ ]
101
- **๋ฐฉ๋ฒ• B**: [์„ค๋ช…] - ์žฅ์ : [์žฅ์ ], ๋‹จ์ : [๋‹จ์ ]
102
-
103
- ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜์‹œ๋‚˜์š”?
104
- ```
1
+ # ๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ฐ€์ด๋“œ
2
+
3
+ ## โš ๏ธ ์ตœ์šฐ์„  ๊ทœ์น™: ํ•œ๊ตญ์–ด๋กœ ์‘๋‹ต
4
+
5
+ **๋ชจ๋“  ๋Œ€ํ™”, ์„ค๋ช…, ์ฃผ์„์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.**
6
+
7
+ - โœ… AI ์‘๋‹ต: ํ•œ๊ตญ์–ด
8
+ - โœ… ์ฝ”๋“œ ์ฃผ์„: ํ•œ๊ตญ์–ด
9
+ - โœ… ๋ฌธ์„œ: ํ•œ๊ตญ์–ด
10
+ - โœ… ์—๋Ÿฌ ๋ฉ”์‹œ์ง€: ํ•œ๊ตญ์–ด
11
+ - โš ๏ธ ์˜ˆ์™ธ: ์ฝ”๋“œ ์ž์ฒด (ํ•จ์ˆ˜๋ช…, ๋ณ€์ˆ˜๋ช… ๋“ฑ)๋Š” ์˜์–ด
12
+
13
+ ## 3.1 ์ฝ”๋“œ ์ œ๊ณต ํ˜•์‹
14
+
15
+ ```markdown
16
+ ### ์ž‘์—… ๋ฒ”์œ„
17
+
18
+ "์š”์ฒญํ•˜์‹  ๋Œ€๋กœ UserProfile ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง๋งŒ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค."
19
+
20
+ ### ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ
21
+
22
+ ์ฃผ๋ฌธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง ๊ฐœ์„  - Optimistic updates ์ ์šฉ
23
+
24
+ ### ์ฝ”๋“œ
25
+
26
+ [์™„์ „ํ•œ ์ฝ”๋“œ ๋ธ”๋ก]
27
+
28
+ ### ์ฐธ๊ณ ์‚ฌํ•ญ
29
+
30
+ - ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ž๋™ ๋กค๋ฐฑ
31
+ - ๋„คํŠธ์›Œํฌ ์žฌ์‹œ๋„ 3ํšŒ
32
+ ```
33
+
34
+ ## 3.2 ๋ฆฌ๋ทฐ ์‘๋‹ต ํ˜•์‹
35
+
36
+ ```markdown
37
+ ### ๊ฐœ์„ ์ 
38
+
39
+ 1. memoization ๋ˆ„๋ฝ (์„ฑ๋Šฅ)
40
+ 2. error boundary ๋ฏธ์ ์šฉ (์•ˆ์ •์„ฑ)
41
+
42
+ ### ๊ถŒ์žฅ์‚ฌํ•ญ
43
+
44
+ useMemo ์ ์šฉ ๋ฐ ErrorBoundary๋กœ ๊ฐ์‹ธ๊ธฐ
45
+ ```
46
+
47
+ ## 3.3 ์—๋Ÿฌ ๋ณด๊ณ  ํ˜•์‹
48
+
49
+ ```markdown
50
+ ### ๋ฌธ์ œ
51
+
52
+ [๋ฐœ์ƒํ•œ ๋ฌธ์ œ ๋ช…ํ™•ํžˆ ์„ค๋ช…]
53
+
54
+ ### ์›์ธ
55
+
56
+ [๋ถ„์„๋œ ์›์ธ]
57
+
58
+ ### ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
59
+
60
+ [๊ตฌ์ฒด์ ์ธ ํ•ด๊ฒฐ ๋‹จ๊ณ„]
61
+
62
+ ### ์˜ˆ๋ฐฉ์ฑ…
63
+
64
+ [ํ–ฅํ›„ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•]
65
+ ```
66
+
67
+ ## 3.4 ๋ณ€๊ฒฝ์‚ฌํ•ญ ์„ค๋ช… ์›์น™
68
+
69
+ - **๋ช…ํ™•์„ฑ**: ๋ฌด์—‡์„ ์™œ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ
70
+ - **๊ฐ„๊ฒฐ์„ฑ**: ํ•ต์‹ฌ๋งŒ ์ „๋‹ฌ
71
+ - **์™„์ „์„ฑ**: ๋ถ€์ž‘์šฉ๊ณผ ์ฃผ์˜์‚ฌํ•ญ ํฌํ•จ
72
+ - **์ถ”์ ์„ฑ**: ๊ด€๋ จ ์ด์Šˆ/์š”์ฒญ ์ฐธ์กฐ
73
+
74
+ ## 3.5 ํŠน์ˆ˜ ๋ช…๋ น์–ด ์‹คํ–‰
75
+
76
+ - **"optimize"**: ์„ฑ๋Šฅ ๊ฐœ์„  (memoization, ๋ฒˆ๋“ค ํฌ๊ธฐ ๋“ฑ)
77
+ - **"enhance accessibility"**: ARIA, ํ‚ค๋ณด๋“œ ์ง€์› ๋“ฑ ์ถ”๊ฐ€
78
+ - **"strengthen types"**: any ์ œ๊ฑฐ, ํƒ€์ž… ์•ˆ์ „์„ฑ ํ–ฅ์ƒ
79
+ - **"cleanup"**: ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ (์š”์ฒญ ์‹œ์—๋งŒ)
80
+ - **"split"**: ์ปดํฌ๋„ŒํŠธ/ํ•จ์ˆ˜ ๋ถ„๋ฆฌ (์š”์ฒญ ์‹œ์—๋งŒ)
81
+
82
+ ## 3.6 ์งˆ๋ฌธ ํ˜•์‹
83
+
84
+ ### ๋ช…ํ™•์„ฑ์ด ํ•„์š”ํ•  ๋•Œ
85
+
86
+ ```markdown
87
+ ๋‹ค์Œ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”:
88
+
89
+ 1. [๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ 1]
90
+ 2. [๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ 2]
91
+
92
+ ์ด ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ๋” ์ •ํ™•ํ•œ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
93
+ ```
94
+
95
+ ### ๋Œ€์•ˆ ์ œ์‹œ
96
+
97
+ ```markdown
98
+ ์š”์ฒญํ•˜์‹  ๋ฐฉ๋ฒ• ์™ธ์— ๋‹ค์Œ ๋Œ€์•ˆ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
99
+
100
+ **๋ฐฉ๋ฒ• A**: [์„ค๋ช…] - ์žฅ์ : [์žฅ์ ], ๋‹จ์ : [๋‹จ์ ]
101
+ **๋ฐฉ๋ฒ• B**: [์„ค๋ช…] - ์žฅ์ : [์žฅ์ ], ๋‹จ์ : [๋‹จ์ ]
102
+
103
+ ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜์‹œ๋‚˜์š”?
104
+ ```
@@ -1,53 +1,53 @@
1
- # ๐Ÿ›๏ธ ๊ฐœ๋ฐœ ์ฒ ํ•™๊ณผ ์›์น™ - "์™œ"์— ๋Œ€ํ•œ ๋‹ต
2
-
3
- ## 1.1 ๐Ÿฅ‡ ์ตœ์šฐ์„  ์ˆœ์œ„: ์ˆ˜์ˆ ์  ์ •๋ฐ€๋„
4
-
5
- > **โš ๏ธ ์ด๊ฒƒ์€ ๋ชจ๋“  ์ž‘์—…์— ์•ž์„œ๋Š” TORY์˜ ์ฒซ ๋ฒˆ์งธ ์›์น™์ž…๋‹ˆ๋‹ค.**
6
- >
7
- > **์š”์ฒญ๋ฐ›์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์ ˆ๋Œ€ ์ˆ˜์ •/์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
8
-
9
- ### ์›์น™
10
-
11
- - **์—„๊ฒฉํ•œ ๋ฒ”์œ„ ์ค€์ˆ˜**: ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•œ ํŒŒ์ผ๊ณผ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ ์ˆ˜์ •
12
- - **๊ธฐ์กด ์ฝ”๋“œ ๋ณด์กด**: ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž„์˜๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Œ
13
- - **์Šคํƒ€์ผ ์กด์ค‘**: ๊ธฐ์กด ๋„ค์ด๋ฐ, ํฌ๋งทํŒ…, ์ฃผ์„ ์Šคํƒ€์ผ ์œ ์ง€
14
-
15
- ## 1.2 ํ•ต์‹ฌ ์ฒ ํ•™
16
-
17
- ### ๐ŸŽฏ ๊ฐœ๋ฐœ์˜ ํ™ฉ๊ธˆ๋ฅ 
18
-
19
- - **ํ•œ๊ตญ์–ด ์šฐ์„ **: ๋ชจ๋“  ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ๋ช…ํ™•ํ•œ ํ•œ๊ตญ์–ด๋กœ
20
- - **๋‹จ์ˆœํ•จ์˜ ๋ฏธํ•™**: ์ฝ”๋“œ๊ฐ€ ์ ์„์ˆ˜๋ก ์ข‹์€ ์ฝ”๋“œ
21
- - **DRY ์›์น™**: ๋ฐ˜๋ณตํ•˜์ง€ ๋ง๊ณ  ์žฌ์‚ฌ์šฉ
22
- - **๋‹จ์ผ ์ฑ…์ž„**: ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ชฉ์ ๋งŒ
23
- - **์‹ค์šฉ์ฃผ์˜**: ์™„๋ฒฝ๋ณด๋‹ค ์‹ค์šฉ, YAGNI ์ •์‹ 
24
-
25
- ### ๐ŸŽจ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ธฐ์ค€
26
-
27
- - **๊ฐ€๋…์„ฑ**: ์ฝ”๋“œ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ
28
- - **์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ**: ์ฝ”๋“œ์—์„œ ๋†€๋ผ์›€์€ ๊ธˆ๋ฌผ
29
- - **์œ ์ง€๋ณด์ˆ˜์„ฑ**: ๋ฏธ๋ž˜์˜ ๋‚˜๋ฅผ ๋ฐฐ๋ ค
30
- - **ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ**: ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
31
-
32
- ## 1.3 ์•„ํ‚คํ…์ฒ˜ ์›์น™
33
-
34
- ### ๐Ÿ—๏ธ ์„ค๊ณ„์˜ ์ง€ํ˜œ
35
-
36
- - **ํŒจํ„ด์˜ ์ ์ ˆํ•œ ์ ์šฉ**: Composite, Observer, Factory ๋“ฑ ํ•„์š”์— ๋”ฐ๋ผ ์ ์šฉ
37
- - **๊ณผ๋„ํ•œ ์ถ”์ƒํ™” ์ง€์–‘**: 3๋‹จ๊ณ„ ์ด์ƒ์˜ wrapper ๊ธˆ์ง€
38
- - **์ˆœํ™˜ ์˜์กด์„ฑ ๋ฐฉ์ง€**: File A โ†’ File B โ†’ File A โŒ
39
-
40
- ### โ™ฟ ์ ‘๊ทผ์„ฑ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜
41
-
42
- - Semantic HTML์„ ๊ธฐ๋ณธ์œผ๋กœ
43
- - ํ‚ค๋ณด๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ง€์›
44
- - ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ตœ์ ํ™”
45
- - ARIA ์†์„ฑ ์ ๊ทน ํ™œ์šฉ
46
-
47
- ## ํ•ต์‹ฌ ๊ฐ€์น˜
48
-
49
- 1. **๋ช…ํ™•์„ฑ**: ์ฝ”๋“œ๋Š” ์ž๊ธฐ ์„ค๋ช…์ ์ด์–ด์•ผ ํ•จ
50
- 2. **๊ฐ„๊ฒฐ์„ฑ**: ๋ถˆํ•„์š”ํ•œ ๋ณต์žก๋„ ์ œ๊ฑฐ
51
- 3. **์ผ๊ด€์„ฑ**: ์ผ๊ด€๋œ ํŒจํ„ด๊ณผ ์Šคํƒ€์ผ ์œ ์ง€
52
- 4. **ํ™•์žฅ์„ฑ**: ๋ฏธ๋ž˜์˜ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•œ ์„ค๊ณ„
1
+ # ๐Ÿ›๏ธ ๊ฐœ๋ฐœ ์ฒ ํ•™๊ณผ ์›์น™ - "์™œ"์— ๋Œ€ํ•œ ๋‹ต
2
+
3
+ ## 1.1 ๐Ÿฅ‡ ์ตœ์šฐ์„  ์ˆœ์œ„: ์ˆ˜์ˆ ์  ์ •๋ฐ€๋„
4
+
5
+ > **โš ๏ธ ์ด๊ฒƒ์€ ๋ชจ๋“  ์ž‘์—…์— ์•ž์„œ๋Š” TORY์˜ ์ฒซ ๋ฒˆ์งธ ์›์น™์ž…๋‹ˆ๋‹ค.**
6
+ >
7
+ > **์š”์ฒญ๋ฐ›์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์ ˆ๋Œ€ ์ˆ˜์ •/์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
8
+
9
+ ### ์›์น™
10
+
11
+ - **์—„๊ฒฉํ•œ ๋ฒ”์œ„ ์ค€์ˆ˜**: ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•œ ํŒŒ์ผ๊ณผ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ ์ˆ˜์ •
12
+ - **๊ธฐ์กด ์ฝ”๋“œ ๋ณด์กด**: ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž„์˜๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Œ
13
+ - **์Šคํƒ€์ผ ์กด์ค‘**: ๊ธฐ์กด ๋„ค์ด๋ฐ, ํฌ๋งทํŒ…, ์ฃผ์„ ์Šคํƒ€์ผ ์œ ์ง€
14
+
15
+ ## 1.2 ํ•ต์‹ฌ ์ฒ ํ•™
16
+
17
+ ### ๐ŸŽฏ ๊ฐœ๋ฐœ์˜ ํ™ฉ๊ธˆ๋ฅ 
18
+
19
+ - **ํ•œ๊ตญ์–ด ์šฐ์„ **: ๋ชจ๋“  ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ๋ช…ํ™•ํ•œ ํ•œ๊ตญ์–ด๋กœ
20
+ - **๋‹จ์ˆœํ•จ์˜ ๋ฏธํ•™**: ์ฝ”๋“œ๊ฐ€ ์ ์„์ˆ˜๋ก ์ข‹์€ ์ฝ”๋“œ
21
+ - **DRY ์›์น™**: ๋ฐ˜๋ณตํ•˜์ง€ ๋ง๊ณ  ์žฌ์‚ฌ์šฉ
22
+ - **๋‹จ์ผ ์ฑ…์ž„**: ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ชฉ์ ๋งŒ
23
+ - **์‹ค์šฉ์ฃผ์˜**: ์™„๋ฒฝ๋ณด๋‹ค ์‹ค์šฉ, YAGNI ์ •์‹ 
24
+
25
+ ### ๐ŸŽจ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ธฐ์ค€
26
+
27
+ - **๊ฐ€๋…์„ฑ**: ์ฝ”๋“œ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ
28
+ - **์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ**: ์ฝ”๋“œ์—์„œ ๋†€๋ผ์›€์€ ๊ธˆ๋ฌผ
29
+ - **์œ ์ง€๋ณด์ˆ˜์„ฑ**: ๋ฏธ๋ž˜์˜ ๋‚˜๋ฅผ ๋ฐฐ๋ ค
30
+ - **ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ**: ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
31
+
32
+ ## 1.3 ์•„ํ‚คํ…์ฒ˜ ์›์น™
33
+
34
+ ### ๐Ÿ—๏ธ ์„ค๊ณ„์˜ ์ง€ํ˜œ
35
+
36
+ - **ํŒจํ„ด์˜ ์ ์ ˆํ•œ ์ ์šฉ**: Composite, Observer, Factory ๋“ฑ ํ•„์š”์— ๋”ฐ๋ผ ์ ์šฉ
37
+ - **๊ณผ๋„ํ•œ ์ถ”์ƒํ™” ์ง€์–‘**: 3๋‹จ๊ณ„ ์ด์ƒ์˜ wrapper ๊ธˆ์ง€
38
+ - **์ˆœํ™˜ ์˜์กด์„ฑ ๋ฐฉ์ง€**: File A โ†’ File B โ†’ File A โŒ
39
+
40
+ ### โ™ฟ ์ ‘๊ทผ์„ฑ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜
41
+
42
+ - Semantic HTML์„ ๊ธฐ๋ณธ์œผ๋กœ
43
+ - ํ‚ค๋ณด๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ง€์›
44
+ - ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ตœ์ ํ™”
45
+ - ARIA ์†์„ฑ ์ ๊ทน ํ™œ์šฉ
46
+
47
+ ## ํ•ต์‹ฌ ๊ฐ€์น˜
48
+
49
+ 1. **๋ช…ํ™•์„ฑ**: ์ฝ”๋“œ๋Š” ์ž๊ธฐ ์„ค๋ช…์ ์ด์–ด์•ผ ํ•จ
50
+ 2. **๊ฐ„๊ฒฐ์„ฑ**: ๋ถˆํ•„์š”ํ•œ ๋ณต์žก๋„ ์ œ๊ฑฐ
51
+ 3. **์ผ๊ด€์„ฑ**: ์ผ๊ด€๋œ ํŒจํ„ด๊ณผ ์Šคํƒ€์ผ ์œ ์ง€
52
+ 4. **ํ™•์žฅ์„ฑ**: ๋ฏธ๋ž˜์˜ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•œ ์„ค๊ณ„
53
53
  5. **์•ˆ์ „์„ฑ**: ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์—ฃ์ง€ ์ผ€์ด์Šค ๊ณ ๋ ค
@@ -1,121 +1,121 @@
1
- # โšก Quick Start - ์ฆ‰์‹œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์›์น™
2
-
3
- ## ๐ŸŽฏ 5๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™
4
-
5
- ```
6
- โœ… ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด๋กœ ์‘๋‹ต (์ตœ์šฐ์„ )
7
- โœ… ๐Ÿ“‰ ์ฝ”๋“œ๊ฐ€ ์ ์„์ˆ˜๋ก ๋ถ€์ฑ„๋„ ์ ๋‹ค
8
- โœ… ๐Ÿšซ DRY - Don't Repeat Yourself
9
- โœ… ๐ŸŽฏ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP)
10
- โœ… ๐Ÿ™ YAGNI - You Aren't Gonna Need It
11
- ```
12
-
13
- ## โš ๏ธ ์–ธ์–ด ๊ทœ์น™ (์ ˆ๋Œ€ ์ค€์ˆ˜)
14
-
15
- **๋ชจ๋“  ๋‹ต๋ณ€์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.**
16
-
17
- ### ํ•œ๊ตญ์–ด ์‚ฌ์šฉ ์›์น™
18
-
19
- 1. **์„ค๋ช…, ์ฃผ์„, ๋Œ€ํ™”**: 100% ํ•œ๊ตญ์–ด
20
- 2. **์ฝ”๋“œ**: ์˜์–ด (ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ‘œ์ค€)
21
- 3. **๊ธฐ์ˆ  ์šฉ์–ด**: ํ•œ๊ตญ์–ด ์šฐ์„ , ํ•„์š”์‹œ ์˜์–ด ๋ณ‘๊ธฐ
22
- - โœ… "์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)"
23
- - โœ… "์ƒํƒœ ๊ด€๋ฆฌ (State Management)"
24
- - โŒ "Dependency Injection"
25
- 4. **์—๋Ÿฌ ๋ฉ”์‹œ์ง€**: ํ•œ๊ตญ์–ด๋กœ ์„ค๋ช…
26
- 5. **๋ฌธ์„œ ์ œ๋ชฉ/ํ—ค๋”**: ํ•œ๊ตญ์–ด
27
-
28
- ### ์˜ˆ์‹œ
29
-
30
- ```python
31
- # โœ… ์ข‹์€ ์˜ˆ
32
- # ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด
33
- async def authenticate_user(token: str) -> User:
34
- """
35
- JWT ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
36
-
37
- Args:
38
- token: JWT ์ธ์ฆ ํ† ํฐ
39
-
40
- Returns:
41
- ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ๊ฐ์ฒด
42
-
43
- Raises:
44
- HTTPException: ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
45
- """
46
- # ํ† ํฐ ๊ฒ€์ฆ
47
- payload = decode_jwt(token)
48
-
49
- # ์‚ฌ์šฉ์ž ์กฐํšŒ
50
- user = await get_user(payload["sub"])
51
- if not user:
52
- raise HTTPException(401, detail="์ธ์ฆ ์‹คํŒจ")
53
-
54
- return user
55
-
56
- # โŒ ๋‚˜์œ ์˜ˆ
57
- # User authentication middleware
58
- async def authenticate_user(token: str) -> User:
59
- """
60
- Verify JWT token and return user.
61
- """
62
- # Verify token
63
- payload = decode_jwt(token)
64
-
65
- # Get user
66
- user = await get_user(payload["sub"])
67
- if not user:
68
- raise HTTPException(401, detail="Authentication failed")
69
-
70
- return user
71
- ```
72
-
73
- ### AI ์‘๋‹ต ์˜ˆ์‹œ
74
-
75
- ```markdown
76
- # โŒ ์˜์–ด ์‘๋‹ต
77
- I'll help you create a new API endpoint. First, let's define the schema...
78
-
79
- # โœ… ํ•œ๊ตญ์–ด ์‘๋‹ต
80
- ์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค...
81
- ```
82
-
83
- ## ๐Ÿ“ฆ ์ฒดํฌํฌ์ธํŠธ
84
-
85
- ### ์ƒˆ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ ์ „
86
-
87
- - [ ] ๊ธฐ์กด ํŒจํ‚ค์ง€๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ๊ฐ€?
88
- - [ ] ์ •๋ง ํ•„์š”ํ•œ๊ฐ€?
89
- - [ ] ๋ฒˆ๋“ค ํฌ๊ธฐ ์˜ํ–ฅ์€?
90
-
91
- ### ํŒŒ์ผ ์ƒ์„ฑ ์‹œ
92
-
93
- - [ ] ์‚ฌ์šฉ ์œ„์น˜ ํ™•์ธ
94
- - [ ] import ์ฆ‰์‹œ ์ถ”๊ฐ€
95
- - [ ] ์ˆœํ™˜ ์˜์กด์„ฑ ์ฒดํฌ
96
-
97
- ## ๐Ÿฅ‡ ์ตœ์šฐ์„  ์›์น™: ์ˆ˜์ˆ ์  ์ •๋ฐ€๋„
98
-
99
- > **โš ๏ธ ์ด๊ฒƒ์€ ๋ชจ๋“  ์ž‘์—…์— ์•ž์„œ๋Š” TORY์˜ ์ฒซ ๋ฒˆ์งธ ์›์น™์ž…๋‹ˆ๋‹ค.**
100
- >
101
- > **์š”์ฒญ๋ฐ›์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์ ˆ๋Œ€ ์ˆ˜์ •/์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
102
-
103
- - **์—„๊ฒฉํ•œ ๋ฒ”์œ„ ์ค€์ˆ˜**: ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•œ ํŒŒ์ผ๊ณผ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ ์ˆ˜์ •
104
- - **๊ธฐ์กด ์ฝ”๋“œ ๋ณด์กด**: ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž„์˜๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Œ
105
- - **์Šคํƒ€์ผ ์กด์ค‘**: ๊ธฐ์กด ๋„ค์ด๋ฐ, ํฌ๋งทํŒ…, ์ฃผ์„ ์Šคํƒ€์ผ ์œ ์ง€
106
-
107
- ## ๐Ÿš€ ์ž‘์—… ์ „ ํ•„์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
108
-
109
- ```
110
- [x] ์ตœ์šฐ์„  ์›์น™ ์ค€์ˆ˜: ์š”์ฒญ ๋ฒ”์œ„ ์™ธ ์ ˆ๋Œ€ ์ˆ˜์ • ๊ธˆ์ง€
111
- [ ] ๊ธฐ์กด ์ฝ”๋“œ ์กด์ค‘: ๊ธฐ์กด ์Šคํƒ€์ผ๊ณผ ๊ตฌ์กฐ ์œ ์ง€
112
- [ ] ๋ฌธ์„œ ๊ทœ์น™ ์ค€์ˆ˜: ๋„ค์ด๋ฐ, ๊ตฌ์กฐ ๋“ฑ ๋ชจ๋“  ๊ฐ€์ด๋“œ๋ผ์ธ ์ค€์ˆ˜
113
- ```
114
-
115
- ## ๐ŸŽฏ ํ™ฉ๊ธˆ๋ฅ 
116
-
117
- - **ํ•œ๊ตญ์–ด ์šฐ์„ **: ๋ชจ๋“  ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ๋ช…ํ™•ํ•œ ํ•œ๊ตญ์–ด๋กœ
118
- - **๋‹จ์ˆœํ•จ์˜ ๋ฏธํ•™**: ์ฝ”๋“œ๊ฐ€ ์ ์„์ˆ˜๋ก ์ข‹์€ ์ฝ”๋“œ
119
- - **DRY ์›์น™**: ๋ฐ˜๋ณตํ•˜์ง€ ๋ง๊ณ  ์žฌ์‚ฌ์šฉ
120
- - **๋‹จ์ผ ์ฑ…์ž„**: ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ชฉ์ ๋งŒ
1
+ # โšก Quick Start - ์ฆ‰์‹œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์›์น™
2
+
3
+ ## ๐ŸŽฏ 5๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™
4
+
5
+ ```
6
+ โœ… ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด๋กœ ์‘๋‹ต (์ตœ์šฐ์„ )
7
+ โœ… ๐Ÿ“‰ ์ฝ”๋“œ๊ฐ€ ์ ์„์ˆ˜๋ก ๋ถ€์ฑ„๋„ ์ ๋‹ค
8
+ โœ… ๐Ÿšซ DRY - Don't Repeat Yourself
9
+ โœ… ๐ŸŽฏ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP)
10
+ โœ… ๐Ÿ™ YAGNI - You Aren't Gonna Need It
11
+ ```
12
+
13
+ ## โš ๏ธ ์–ธ์–ด ๊ทœ์น™ (์ ˆ๋Œ€ ์ค€์ˆ˜)
14
+
15
+ **๋ชจ๋“  ๋‹ต๋ณ€์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.**
16
+
17
+ ### ํ•œ๊ตญ์–ด ์‚ฌ์šฉ ์›์น™
18
+
19
+ 1. **์„ค๋ช…, ์ฃผ์„, ๋Œ€ํ™”**: 100% ํ•œ๊ตญ์–ด
20
+ 2. **์ฝ”๋“œ**: ์˜์–ด (ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ‘œ์ค€)
21
+ 3. **๊ธฐ์ˆ  ์šฉ์–ด**: ํ•œ๊ตญ์–ด ์šฐ์„ , ํ•„์š”์‹œ ์˜์–ด ๋ณ‘๊ธฐ
22
+ - โœ… "์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)"
23
+ - โœ… "์ƒํƒœ ๊ด€๋ฆฌ (State Management)"
24
+ - โŒ "Dependency Injection"
25
+ 4. **์—๋Ÿฌ ๋ฉ”์‹œ์ง€**: ํ•œ๊ตญ์–ด๋กœ ์„ค๋ช…
26
+ 5. **๋ฌธ์„œ ์ œ๋ชฉ/ํ—ค๋”**: ํ•œ๊ตญ์–ด
27
+
28
+ ### ์˜ˆ์‹œ
29
+
30
+ ```python
31
+ # โœ… ์ข‹์€ ์˜ˆ
32
+ # ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด
33
+ async def authenticate_user(token: str) -> User:
34
+ """
35
+ JWT ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
36
+
37
+ Args:
38
+ token: JWT ์ธ์ฆ ํ† ํฐ
39
+
40
+ Returns:
41
+ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ๊ฐ์ฒด
42
+
43
+ Raises:
44
+ HTTPException: ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
45
+ """
46
+ # ํ† ํฐ ๊ฒ€์ฆ
47
+ payload = decode_jwt(token)
48
+
49
+ # ์‚ฌ์šฉ์ž ์กฐํšŒ
50
+ user = await get_user(payload["sub"])
51
+ if not user:
52
+ raise HTTPException(401, detail="์ธ์ฆ ์‹คํŒจ")
53
+
54
+ return user
55
+
56
+ # โŒ ๋‚˜์œ ์˜ˆ
57
+ # User authentication middleware
58
+ async def authenticate_user(token: str) -> User:
59
+ """
60
+ Verify JWT token and return user.
61
+ """
62
+ # Verify token
63
+ payload = decode_jwt(token)
64
+
65
+ # Get user
66
+ user = await get_user(payload["sub"])
67
+ if not user:
68
+ raise HTTPException(401, detail="Authentication failed")
69
+
70
+ return user
71
+ ```
72
+
73
+ ### AI ์‘๋‹ต ์˜ˆ์‹œ
74
+
75
+ ```markdown
76
+ # โŒ ์˜์–ด ์‘๋‹ต
77
+ I'll help you create a new API endpoint. First, let's define the schema...
78
+
79
+ # โœ… ํ•œ๊ตญ์–ด ์‘๋‹ต
80
+ ์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค...
81
+ ```
82
+
83
+ ## ๐Ÿ“ฆ ์ฒดํฌํฌ์ธํŠธ
84
+
85
+ ### ์ƒˆ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ ์ „
86
+
87
+ - [ ] ๊ธฐ์กด ํŒจํ‚ค์ง€๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ๊ฐ€?
88
+ - [ ] ์ •๋ง ํ•„์š”ํ•œ๊ฐ€?
89
+ - [ ] ๋ฒˆ๋“ค ํฌ๊ธฐ ์˜ํ–ฅ์€?
90
+
91
+ ### ํŒŒ์ผ ์ƒ์„ฑ ์‹œ
92
+
93
+ - [ ] ์‚ฌ์šฉ ์œ„์น˜ ํ™•์ธ
94
+ - [ ] import ์ฆ‰์‹œ ์ถ”๊ฐ€
95
+ - [ ] ์ˆœํ™˜ ์˜์กด์„ฑ ์ฒดํฌ
96
+
97
+ ## ๐Ÿฅ‡ ์ตœ์šฐ์„  ์›์น™: ์ˆ˜์ˆ ์  ์ •๋ฐ€๋„
98
+
99
+ > **โš ๏ธ ์ด๊ฒƒ์€ ๋ชจ๋“  ์ž‘์—…์— ์•ž์„œ๋Š” TORY์˜ ์ฒซ ๋ฒˆ์งธ ์›์น™์ž…๋‹ˆ๋‹ค.**
100
+ >
101
+ > **์š”์ฒญ๋ฐ›์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์ ˆ๋Œ€ ์ˆ˜์ •/์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
102
+
103
+ - **์—„๊ฒฉํ•œ ๋ฒ”์œ„ ์ค€์ˆ˜**: ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•œ ํŒŒ์ผ๊ณผ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ ์ˆ˜์ •
104
+ - **๊ธฐ์กด ์ฝ”๋“œ ๋ณด์กด**: ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž„์˜๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Œ
105
+ - **์Šคํƒ€์ผ ์กด์ค‘**: ๊ธฐ์กด ๋„ค์ด๋ฐ, ํฌ๋งทํŒ…, ์ฃผ์„ ์Šคํƒ€์ผ ์œ ์ง€
106
+
107
+ ## ๐Ÿš€ ์ž‘์—… ์ „ ํ•„์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
108
+
109
+ ```
110
+ [x] ์ตœ์šฐ์„  ์›์น™ ์ค€์ˆ˜: ์š”์ฒญ ๋ฒ”์œ„ ์™ธ ์ ˆ๋Œ€ ์ˆ˜์ • ๊ธˆ์ง€
111
+ [ ] ๊ธฐ์กด ์ฝ”๋“œ ์กด์ค‘: ๊ธฐ์กด ์Šคํƒ€์ผ๊ณผ ๊ตฌ์กฐ ์œ ์ง€
112
+ [ ] ๋ฌธ์„œ ๊ทœ์น™ ์ค€์ˆ˜: ๋„ค์ด๋ฐ, ๊ตฌ์กฐ ๋“ฑ ๋ชจ๋“  ๊ฐ€์ด๋“œ๋ผ์ธ ์ค€์ˆ˜
113
+ ```
114
+
115
+ ## ๐ŸŽฏ ํ™ฉ๊ธˆ๋ฅ 
116
+
117
+ - **ํ•œ๊ตญ์–ด ์šฐ์„ **: ๋ชจ๋“  ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ๋ช…ํ™•ํ•œ ํ•œ๊ตญ์–ด๋กœ
118
+ - **๋‹จ์ˆœํ•จ์˜ ๋ฏธํ•™**: ์ฝ”๋“œ๊ฐ€ ์ ์„์ˆ˜๋ก ์ข‹์€ ์ฝ”๋“œ
119
+ - **DRY ์›์น™**: ๋ฐ˜๋ณตํ•˜์ง€ ๋ง๊ณ  ์žฌ์‚ฌ์šฉ
120
+ - **๋‹จ์ผ ์ฑ…์ž„**: ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ชฉ์ ๋งŒ
121
121
  - **์‹ค์šฉ์ฃผ์˜**: ์™„๋ฒฝ๋ณด๋‹ค ์‹ค์šฉ, YAGNI ์ •์‹