๐ค ๊ฐ๋ฐ์ ๋ณด โ ํต์ฌ ํ๋กฌํํธ ๋ชจ์ โ
AI ์ธ์ด ๋ชจ๋ธ(Claude, Gemini, ChatGPT, Grok ๋ฑ)์ ๊ฐ๋ฐ ์ ๋ฌด์ ํ์ฉํ ๋ ๋ฐ๋ก ๋ณต์ฌํด ์ธ ์ ์๋ ์ค์ ํ๋กฌํํธ 10์ ์ ๋๋ค. ๊ฐ ํ๋กฌํํธ๋ ์ฑ๋ฅ ์ต์ ํ, ๋ณด์ ๊ฐํ, ํด๋ฆฐ ์ํคํ ์ฒ ๊ด์ ์์ ๊น์ด ์๊ฒ ์ค๊ณ๋์์ต๋๋ค.
๐ก ์ฌ์ฉ๋ฒ
ํ๋กฌํํธ์ [ ] ๊ดํธ ๋ถ๋ถ์ ์ค์ ๋ด์ฉ์ผ๋ก ๊ต์ฒดํ์ฌ AI ๋ชจ๋ธ์ ์ง๋ฌธํ์ธ์. ๊ฐ ํ๋กฌํํธ ์ฐ์ธก ์๋จ์ ๐ ๋ณต์ฌ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋ฆฝ๋ณด๋์ ์ฆ์ ๋ณต์ฌ๋ฉ๋๋ค.
์ด ์ฌ์ดํธ๋ฅผ ์ฌํํ๋ ํ๋ก์ ํธ ์์ฑ ํ๋กฌํํธ
์๋ ํ๋กฌํํธ๋ฅผ AI ์ฝ๋ฉ ์ด์์คํดํธ(Gemini, Claude, ChatGPT ๋ฑ)์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ๋ฉด, ์ด "๊ฐ๋ฐ์๋ฅผ ์ํ ์ง์DB" ์ฌ์ดํธ์ ์ ์ฌํ VitePress ๊ธฐ๋ฐ์ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค. ๊ธฐํ ์๋, ํ์ด์ง ๊ตฌ์กฐ, ๋์์ธ ์์คํ , ๋ณด์ ์ ์ฑ ๊น์ง ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค.
๋น์ ์ ์๋์ด ํ์คํ ์์ง๋์ด์ ๋๋ค. ์๋ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ "๊ฐ๋ฐ์๋ฅผ ์ํ ์ง์DB" ์น์ฌ์ดํธ๋ฅผ VitePress ๊ธฐ๋ฐ์ผ๋ก ์ฒ์๋ถํฐ ๊ตฌ์ถํด ์ฃผ์ธ์. ## 1. ํ๋ก์ ํธ ์ด๊ธฐํ - `npx -y create-vitepress ./` ์ผ๋ก ํ์ฌ ๋๋ ํ ๋ฆฌ์ VitePress ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. - Node.js 18+ ํ๊ฒฝ์ ์ ์ ํ๋ฉฐ, ํจํค์ง ๋งค๋์ ๋ npm์ ์ฌ์ฉํฉ๋๋ค. ## 2. ์ฌ์ดํธ ๊ตฌ์กฐ (Navigation & Sidebar) ### ์๋จ ๋ค๋น๊ฒ์ด์ (Nav) - ๐ Home (/) - ๐ ์ง์์ฝํ ์ธ (/docs/knowledge-info/) - ๐ ์ง์ ๋ฐ์ดํฐ (/docs/domestic/) - โ๏ธ ๊ฐ์ด๋๋ผ์ธ (/guidelines/Agent) - ๐ ์ปฌ๋ ์ (/docs/collections/github-stars-global) ### ์ข์ธก ์ฌ์ด๋๋ฐ (Sidebar) โ 4๊ฐ ๊ทธ๋ฃน 1. ๐ ์ง์ ์ฝํ ์ธ : ์ง์์ฝํ ์ธ ๊ด๋ฆฌ, ๋ฐฑ์๋ ๋ก๋๋งต, ํ๋ก ํธ์๋ ๋ก๋๋งต, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด 2. ๐ ์ง์ ๋ฐ์ดํฐ: ํ๋ก๊ทธ๋๋ฐ ์ธ์ด, ๊ตญ๋ด ์ฌ์ดํธ, ํด์ธ ์ฌ์ดํธ, ํ๋กฌํํธ ๋ชจ์, ์ ์ฉํ ๋๊ตฌ, ์ํคํ ์ฒ, ๋ฒ ์คํธ ํ๋ํฐ์ค, ๊ธฐ์ ๋ณ ๊ธฐ์ ์คํ 3. โ๏ธ ๊ฐ์ด๋๋ผ์ธ ๋ฐ ๊ท์น: AI Agent ์ง์นจ, ๋ณด์๊ฐ์ด๋, ํ๋กฌํํธ ํ ํ๋ฆฟ, ๋์์ธ ๋ฐ ๋งํฌ๋ค์ด, ํด๋ ๊ตฌ์กฐ ์๋ด 4. ๐ ์ปฌ๋ ์ : ๊นํ๋ธ ์คํ(ํด์ธ), ๊นํ๋ธ ์คํ(๊ตญ๋ด), SourceForge ์ถ์ฒ ## 3. ๋์์ธ ์์คํ (custom.css) - **๋ธ๋๋ ์ปฌ๋ฌ**: ์ธ๋๊ณ (#6366f1), ๋ฐ์ด์ฌ๋ (#a78bfa), ํํฌ(#ec4899) ๊ทธ๋ผ๋์ธํธ - **๋คํฌ ๋ชจ๋ ๊ธฐ๋ณธ**: --vp-c-bg: #0f0f14, --vp-c-bg-soft: #17171e - **๊ธ๋์ค๋ชจํผ์ฆ**: backdrop-filter: blur(16px) saturate(1.5)์ ๋ค๋น๊ฒ์ด์ ๋ฐ์ ์ ์ฉ - **ํ์ดํฌ๊ทธ๋ํผ**: Google Fonts โ Inter(์๋ฌธ), Noto Sans KR(ํ๊ธ) ์ฌ์ฉ. head ํ๊ทธ์์ preconnect ์ฒ๋ฆฌ - **์ฌ์ด๋๋ฐ**: ๊ทธ๋ฃน ํ์ดํ์ border-left 3px ๋ธ๋๋ ์ปฌ๋ฌ ํฌ์ธํธ, ํธ๋ฒ ์ ๋ฐฐ๊ฒฝ ์ ํ - **ํผ์ฒ ์นด๋**: border-radius 16px, hover ์ translateY(-6px) ๋ฆฌํํธ + box-shadow ๊ธ๋ก์ฐ - **ํ ์ด๋ธ**: border-collapse: separate, border-radius 12px, ํ(tr) hover ์ ๋ธ๋๋ ํดํธ - **์ฝ๋ ๋ธ๋ก**: border-radius 12px, ๋ธ๋๋ ์ปฌ๋ฌ ๋ณด๋ - **๋ง์ดํฌ๋ก ์ ๋๋ฉ์ด์ **: ํ์ด์ง ์ ํ ์ opacity 0โ1 + translateY(12pxโ0), 0.4s ease ## 4. ํํ์ด์ง (index.md) - VitePress ๊ธฐ๋ณธ Hero ๋ ์ด์์ ์ฌ์ฉ (name, text, tagline, actions) - Hero ์๋์ ์ปค์คํ HTML ์น์ 3๊ฐ: 1. **ํธ๋ ๋ ํ ํฝ ์นด๋** (4์ด ๊ทธ๋ฆฌ๋): AI/ML, ์น ๊ฐ๋ฐ, ์ธํ๋ผ, ์คํ์์ค ๋ฑ ์ฃผ์ ๋ณ ์นด๋. ๊ฐ ์นด๋์ ๊ธ๋ก์ฐ ํจ๊ณผ + ๊ณ ์ ๊ทธ๋ผ๋์ธํธ ๋ฐฐ๊ฒฝ 2. **ํต ์ก์ธ์ค ํ๋ธ** (8์ด ๊ทธ๋ฆฌ๋): ์ด๋ชจ์ง ์์ด์ฝ + ๋ผ๋ฒจ๋ก ๋ ๋น ๋ฅธ ๋งํฌ ๋ชจ์ 3. **์ฌ์ดํธ ์๊ฐ** (stats-grid): ๋ฐ์ดํฐ ๊ฑด์, ์นดํ ๊ณ ๋ฆฌ ์ ๋ฑ ํต๊ณ ์นด์ดํฐ ## 5. ์ฝํ ์ธ ๊ฐ ํ์ด์ง - ๊ฐ ์น์ ๋ณ index.md ํ์ผ์ ์์ฑํฉ๋๋ค. - ๋งํฌ๋ค์ด ํ ์ด๋ธ, ์ฝ๋ ๋ธ๋ก, ์ธ์ฉ ๋ธ๋ก(> [!TIP] ๋ฑ) ํ์ฉํ์ฌ ์ ๋ณด๋ฅผ ๊ตฌ์กฐํํฉ๋๋ค. - ๋ชจ๋ ํ ์คํธ๋ ํ๊ตญ์ด๋ก ์์ฑํฉ๋๋ค. ## 6. ๋ณด์ ์ ์ฑ - config.mts์ head์ Content-Security-Policy meta ํ๊ทธ๋ฅผ ์ฃผ์์ผ๋ก ํฌํจํฉ๋๋ค (ํ๋ก๋์ ์์ ํ์ฑํ). - ์ธ๋ถ ๋ฆฌ์์ค๋ Google Fonts๋ง ํ์ฉํฉ๋๋ค. ## 7. ๋น๋ ๋ฐ ๋ฐฐํฌ - `npm run docs:dev`๋ก ๋ก์ปฌ ๊ฐ๋ฐ ์๋ฒ ์คํ - `npm run docs:build`๋ก ์ ์ ๋น๋ โ `.vitepress/dist` ๋๋ ํ ๋ฆฌ ์ถ๋ ฅ - Vercel์ GitHub ์ฐ๋ํ์ฌ ์๋ ๋ฐฐํฌ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑ ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๋ชจ๋ ํ์ผ์ ํ๊บผ๋ฒ์ ์์ฑํด ์ฃผ์ธ์. ๊ฐ ํ์ผ์ ์ญํ ์ ์ฃผ์์ผ๋ก ๋ช ์ํ๊ณ , ํ๊ตญ์ด๋ก ์์ฑํด ์ฃผ์ธ์.
๐ ํ๋กฌํํธ ๋ชฉ์ฐจ โ
1. ์๋์ด๊ธ ์ฝ๋ ๋ฆฌ๋ทฐ (๋ณด์ยท์ฑ๋ฅยทํด๋ฆฐ์ฝ๋) โ
๐ ์๋์ด ์์ง๋์ด ๊ด์ ์ ์ข ํฉ ์ฝ๋ ๋ฆฌ๋ทฐ
์ฝ๋ ๋ฆฌ๋ทฐ ์ OWASP Top 10 ๋ณด์ ์ทจ์ฝ์ ๊ฒ์ฌ, SOLID ์์น ์ค์ ์ฌ๋ถ, ์๊ฐยท๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์๊น์ง ํฌํจํ ์ข ํฉ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ํํ๋ ํ๋กฌํํธ์ ๋๋ค. ๋จ์ํ '๋ฌธ์ ๋ฅผ ์ฐพ์์ค'๊ฐ ์๋, Before/After ์ฝ๋์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์ด์ ๊น์ง ์ ์ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๋น์ ์ 10๋ ์ด์์ ๊ฒฝ๋ ฅ์ ๋ณด์ ํ ์๋์ด ์ํํธ์จ์ด ์์ง๋์ด์ ๋๋ค. ๋ค์ [์ธ์ด/ํ๋ ์์ํฌ] ์ฝ๋๋ฅผ ์๋ 5๊ฐ์ง ๊ด์ ์์ ์ฒด๊ณ์ ์ผ๋ก ๋ฆฌ๋ทฐํด ์ฃผ์ธ์. ## ๋ฆฌ๋ทฐ ๊ธฐ์ค (์ฐ์ ์์ ์) 1. **๋ณด์ ์ทจ์ฝ์ (OWASP Top 10)**: SQL Injection, XSS, CSRF, ์ธ์ฆ/์ธ๊ฐ ๊ฒฐํจ, ๋ฏผ๊ฐ ๋ฐ์ดํฐ ๋ ธ์ถ, ์์ ํ์ง ์์ ์ญ์ง๋ ฌํ ๋ฑ์ ์ ๊ฒํ์ธ์. 2. **SOLID ์์น ์ค์**: ๊ฐ ์์น(SRP, OCP, LSP, ISP, DIP) ์๋ฐ ์ฌ๋ถ๋ฅผ ํ๋ณํ๊ณ , ์๋ฐ ์ ์ด๋ค ์์น์ด ๊นจ์ก๋์ง ๋ช ์ํ์ธ์. 3. **์๊ฐยท๊ณต๊ฐ ๋ณต์ก๋**: ํต์ฌ ๋ก์ง์ Big-O๋ฅผ ๋ถ์ํ๊ณ , O(nยฒ) ์ด์์ ๋นํจ์จ์ด ์์ผ๋ฉด O(n log n) ์ดํ๋ก ๊ฐ์ ํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ์ธ์. 4. **์๋ฌ ์ฒ๋ฆฌ ๋ฐ ์ฃ์ง ์ผ์ด์ค**: ๋ ํฌ์ธํฐ, ๋น ๋ฐฐ์ด, ๋์์ฑ ๋ฌธ์ , ์ ์ ์ค๋ฒํ๋ก์ฐ ๋ฑ ๊ฐ๊ณผํ๊ธฐ ์ฌ์ด ์ฃ์ง ์ผ์ด์ค๋ฅผ ์๋ณํ์ธ์. 5. **ํด๋ฆฐ ์ฝ๋ ๋ฐ ๊ฐ๋ ์ฑ**: ๋ค์ด๋ฐ ๊ท์น(camelCase/snake_case), ๋งค์ง ๋๋ฒ, ์ฃผ์ ๋ถ์ฌ, ํจ์ ๊ธธ์ด(20์ค ์ดํ ๊ถ์ฅ) ๋ฑ์ ๊ฒํ ํ์ธ์. ## ์ถ๋ ฅ ํ์ ๊ฐ ์ด์๋ง๋ค ์๋ ํ์์ผ๋ก ์์ฑํ์ธ์: - **[์ฌ๊ฐ๋: Critical/Warning/Info]** ์ด์ ์ ๋ชฉ - **ํ์ผ/์์น**: ํด๋น ์ฝ๋์ ํ์ผ๋ช ๊ณผ ๋ผ์ธ ๋ฒํธ - **๋ฌธ์ ์ค๋ช **: ์ ์ด๊ฒ์ด ๋ฌธ์ ์ธ์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช - **Before (๋ฌธ์ ์ฝ๋)**: ์๋ณธ ์ฝ๋ ์ค๋ํซ - **After (๊ฐ์ ์ฝ๋)**: ์์ ๋ ์ฝ๋ ์ค๋ํซ - **๊ฐ์ ์ด์ **: ๋ณ๊ฒฝํจ์ผ๋ก์จ ์ป๋ ๊ตฌ์ฒด์ ์ธ ํจ๊ณผ (์ฑ๋ฅ ์์น, ๋ณด์ ์์ค ๋ฑ) ## ๋ฆฌ๋ทฐ ๋์ ์ฝ๋ [์ฝ๋ ์ฝ์ ]
2. ์ ๋ก๋ฐ์ด ์ทจ์ฝ์ ๋ณด์ ๊ฐ์ฌ ํ๋กฌํํธ โ
๐ก๏ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์ ๊ฐ์ฌ ๋ฐ ์นจํฌ ํ ์คํธ ์๋ฎฌ๋ ์ด์
OWASP ASVS(Application Security Verification Standard) ๊ธฐ๋ฐ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์ทจ์ฝ์ ์ ์ฒด๊ณ์ ์ผ๋ก ์ ๊ฒํฉ๋๋ค. ์ธ์ฆ/์ธ๊ฐ, ์ธ์ ๊ด๋ฆฌ, ์ ๋ ฅ ๊ฒ์ฆ, ์ํธํ ๋ฑ ๋ชจ๋ ๋ณด์ ๋ ์ด์ด๋ฅผ ํฌ๊ดํ๋ ๊น์ด ์๋ ๊ฐ์ฌ๋ฅผ ์ํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๋น์ ์ CISSP, OSCP ์๊ฒฉ์ ๋ณด์ ํ ์๋์ด ๋ณด์ ์์ง๋์ด์ ๋๋ค. ์๋ [์ธ์ด/ํ๋ ์์ํฌ]๋ก ์์ฑ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋์์ผ๋ก ์ข ํฉ ๋ณด์ ๊ฐ์ฌ๋ฅผ ์ํํด ์ฃผ์ธ์. ## ๊ฐ์ฌ ๋ฒ์ (OWASP ASVS Level 2 ๊ธฐ์ค) 1. **์ธ์ฆ(Authentication)**: ๋น๋ฐ๋ฒํธ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ(bcrypt/Argon2 ์ฌ์ฉ ์ฌ๋ถ), ๋น๋ฐ๋ฒํธ ๊ฐ๋ ์ ์ฑ , ๋ค์ค ์ธ์ฆ(MFA) ์ง์ ์ฌ๋ถ, ๋ธ๋ฃจํธ ํฌ์ค ๋ฐฉ์ด(rate limiting, account lockout) 2. **์ธ๊ฐ(Authorization)**: RBAC/ABAC ๋ชจ๋ธ ์ ์ฉ ์ฌ๋ถ, ์์ง/์ํ ๊ถํ ์์น ๊ฐ๋ฅ์ฑ, IDOR(Insecure Direct Object Reference) ์ทจ์ฝ์ 3. **์ธ์ ๊ด๋ฆฌ**: ์ธ์ ID ์ํธ๋กํผ, HttpOnly/Secure/SameSite ์ฟ ํค ํ๋๊ทธ, ์ธ์ ๊ณ ์ ๊ณต๊ฒฉ ๋ฐฉ์ด, ์ธ์ ๋ง๋ฃ ์ ์ฑ 4. **์ ๋ ฅ ๊ฒ์ฆ**: SQL/NoSQL Injection, XSS(Stored/Reflected/DOM), OS Command Injection, Path Traversal, SSRF 5. **์ํธํ**: ์ ์ก ์ค ์ํธํ(TLS 1.3), ์ ์ฅ ์ ์ํธํ(AES-256-GCM), ํค ๊ด๋ฆฌ ์ ์ฑ , ํ๋์ฝ๋ฉ๋ ๋น๋ฐํค/API ํค ํ์ง 6. **๋น์ฆ๋์ค ๋ก์ง**: ๋ ์ด์ค ์ปจ๋์ , TOCTOU(Time-of-Check-to-Time-of-Use), ์ฌ์ ๊ณต๊ฒฉ(Replay Attack) 7. **๋ก๊น ๋ฐ ๋ชจ๋ํฐ๋ง**: ๋ฏผ๊ฐ ์ ๋ณด(๋น๋ฐ๋ฒํธ, ์นด๋๋ฒํธ) ๋ก๊ทธ ๊ธฐ๋ก ์ฌ๋ถ, ๊ฐ์ฌ ์ถ์ (audit trail) ๊ตฌํ ## ์ถ๋ ฅ ํ์ ๊ฐ ์ทจ์ฝ์ ์ ๋ํด ๊ตฌ์ฒด์ ์ธ ๊ณต๊ฒฉ ์๋๋ฆฌ์ค(exploit PoC ์์ค)์ ๋ฐฉ์ด ์ฝ๋๋ฅผ ์ ์ํ์ธ์. ## ๋์ ์ฝ๋ [์ฝ๋ ์ฝ์ ]
3. ๊ณ ๋ถํ ์์คํ ์ํคํ ์ฒ ์ค๊ณ โ
๐๏ธ ๋๊ท๋ชจ ํธ๋ํฝ ๋์ ์์คํ ์ํคํ ์ฒ ์ค๊ณ
์๋ฐฑ๋ง MAU๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์๋น์ค์ ์ ์ฒด ์ํคํ ์ฒ๋ฅผ ์ค๊ณํฉ๋๋ค. ๋ก๋๋ฐธ๋ฐ์ฑ, ์บ์ฑ ๊ณ์ธต, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฉ, ๋ฉ์์ง ํ, ์ฅ์ ๋ณต๊ตฌ๊น์ง ํ๋ก๋์ ๊ธ ์ค๊ณ๋ฅผ Mermaid ๋ค์ด์ด๊ทธ๋จ๊ณผ ํจ๊ป ๋์ถํฉ๋๋ค.
๋น์ ์ FAANG ์ถ์ Staff-level ์์คํ ์ํคํ ํธ์ ๋๋ค. ์๋ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ๋ถ์ฐ ์์คํ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํด ์ฃผ์ธ์. ## ์๋น์ค ๊ฐ์ - **์๋น์ค๋ช **: [์๋น์ค ์ด๋ฆ] - **์๋น์ค ๋ชฉ์ **: [1~2์ค ์ค๋ช ] - **์์ ํธ๋ํฝ**: MAU [N]๋ง ๋ช , ํผํฌ RPS [N], ์ผ์ผ ๋ฐ์ดํฐ ์ฆ๊ฐ๋ [N]GB - **ํต์ฌ ๊ธฐ๋ฅ**: [๊ธฐ๋ฅ 1], [๊ธฐ๋ฅ 2], [๊ธฐ๋ฅ 3] - **SLA ๋ชฉํ**: ๊ฐ์ฉ์ฑ 99.95% (์ฐ๊ฐ ๋ค์ดํ์ 4.5์๊ฐ ์ด๋ด) ## ์ค๊ณ ์๊ตฌ์ฌํญ 1. **์ํ ํ์ฅ(Horizontal Scaling)**: ๊ฐ ๊ณ์ธต(์น/์ฑ/DB)์ ์คํ ์ค์ผ์ผ๋ง ์ ๋ต 2. **์บ์ฑ ์ ๋ต**: L1(์ ํ๋ฆฌ์ผ์ด์ ์ธ๋ฉ๋ชจ๋ฆฌ) โ L2(Redis Cluster) โ L3(CDN) ๋ค๊ณ์ธต ์บ์์ ์บ์ ๋ฌดํจํ ์ ์ฑ (Cache Invalidation) 3. **๋ฐ์ดํฐ ์ ์ฅ์**: RDBMS(ACID ๋ณด์ฅ ์์ญ)์ NoSQL(๊ณ ์ฑ๋ฅ ์ฝ๊ธฐ ์์ญ) ๋ถ๋ฆฌ ๊ธฐ์ค, ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ณต์ ๋ณธ(Read Replica) ์ ๋ต, ์ค๋ฉ ํค ์ ์ ๊ธฐ์ค 4. **๋น๋๊ธฐ ์ฒ๋ฆฌ**: ๋ฉ์์ง ํ(Kafka/RabbitMQ)๋ฅผ ํตํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ(EDA), Dead Letter Queue ์ฒ๋ฆฌ 5. **์ฅ์ ๋ณต๊ตฌ**: Circuit Breaker(Hystrix/Resilience4j), Bulkhead, Retry with Exponential Backoff, Chaos Engineering ๊ณ ๋ ค ์ฌํญ 6. **๋ณด์**: API Gateway ๋จ์์์ Rate Limiting, WAF ๊ท์น, JWT + Refresh Token Rotation, mTLS ์๋น์ค ๊ฐ ํต์ 7. **๊ด์ธก์ฑ(Observability)**: ๋ถ์ฐ ํธ๋ ์ด์ฑ(Jaeger/Zipkin), ์ค์ ๋ก๊น (ELK Stack), ๋ฉํธ๋ฆญ(Prometheus + Grafana), ์๋ ์ ์ฑ ## ์ถ๋ ฅ ํ์ 1. Mermaid ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ (์ปดํฌ๋ํธ ๊ฐ ํต์ ํ๋ฆ) 2. ๊ฐ ์ปดํฌ๋ํธ๋ณ ๊ธฐ์ ์ ํ ์ด์ (3์ค ์ด๋ด) 3. ์์ ์๊ฐ ์ธํ๋ผ ๋น์ฉ (AWS ๊ธฐ์ค ๊ฐ๋ต ์ฐ์ ) 4. ํฅํ ํ์ฅ ์ ๊ณ ๋ ค์ฌํญ (v2 ๋ก๋๋งต)
4. ์ฑ๋ฅ ๋ณ๋ชฉ ์ ๋ฐ ๋ถ์ ๋ฐ ์ต์ ํ โ
โก ์ฑ๋ฅ ๋ณ๋ชฉ ์ง๋จ ๋ฐ Big-O ์ต์ ํ
์๋ต ์๊ฐ์ด ๊ธฐ๋๋ณด๋ค ๋๋ฆฐ ์ฝ๋์ ์์ธ์ CPU ํ๋กํ์ผ๋ง, ๋ฉ๋ชจ๋ฆฌ ๋ถ์, I/O ๋๊ธฐ ๋ถ์ ๊ด์ ์์ ์ ๋ฐํ๊ฒ ์ง๋จํฉ๋๋ค. ๋จ์ '๋๋ฆฌ๋ค'๊ฐ ์๋, ๊ตฌ์ฒด์ ์ธ ์์น์ ๊ฐ์ ์ฝ๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋น์ ์ ์ฑ๋ฅ ์ต์ ํ ์ ๋ฌธ๊ฐ์ ๋๋ค. ์๋ [์ธ์ด/ํ๋ ์์ํฌ] ์ฝ๋์์ ์ฑ๋ฅ ๋ณ๋ชฉ์ ์ ๋ฐํ๊ฒ ๋ถ์ํ๊ณ ์ต์ ํํด ์ฃผ์ธ์. ## ํ์ฌ ์ํฉ - **์คํ ํ๊ฒฝ**: [OS, ๋ฐํ์ ๋ฒ์ , ์๋ฒ ์คํ(CPU/Memory)] - **ํ์ฌ ์๋ต ์๊ฐ/์ฒ๋ฆฌ ์๊ฐ**: [N]ms (๋ชฉํ: [M]ms) - **๋ฐ์ดํฐ ๊ท๋ชจ**: ์ ๋ ฅ ํฌ๊ธฐ [N]๊ฑด, DB ๋ ์ฝ๋ ์ [N]๊ฑด ## ๋ถ์ ๊ด์ (4๊ณ์ธต) 1. **์๊ณ ๋ฆฌ์ฆ ๊ณ์ธต**: ํต์ฌ ๋ก์ง์ ์๊ฐยท๊ณต๊ฐ ๋ณต์ก๋(Big-O) ๋ถ์. ์ค์ฒฉ ๋ฃจํ, ๋ถํ์ํ ์ ๋ ฌ, ๋นํจ์จ์ ํ์ ๋ฑ ์๋ณ. ๊ฐ๋ฅํ๋ฉด O(nยฒ) โ O(n log n) ๋๋ O(n)์ผ๋ก ๊ฐ์ 2. **I/O ๊ณ์ธต**: DB ์ฟผ๋ฆฌ N+1 ๋ฌธ์ , ๋ถํ์ํ Full Table Scan, ์ธ๋ฑ์ค ๋ฏธํ์ฉ, ์ธ๋ถ API ๋๊ธฐ ํธ์ถ ๋ณ๋ชฉ. ์ฟผ๋ฆฌ ์คํ ๊ณํ(EXPLAIN) ๊ธฐ๋ฐ ๋ถ์ 3. **๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต**: ๋์ฉ๋ ๊ฐ์ฒด์ ๋ถํ์ํ ๋ณต์ฌ, ๋ฉ๋ชจ๋ฆฌ ๋์(leak) ๊ฐ๋ฅ์ฑ, GC ์๋ฐ์ ์ ๋ฐํ๋ ์์ ๊ฐ์ฒด ์์ฑ ํจํด 4. **๋์์ฑ ๊ณ์ธต**: ๋ถํ์ํ ๋ฝ(Lock) ๊ฒฝ์, ๋ฐ๋๋ฝ ๊ฐ๋ฅ์ฑ, ์ค๋ ๋ํ/์ปค๋ฅ์ ํ ํฌํ, ๋น๋๊ธฐ/๋ ผ๋ธ๋กํน์ผ๋ก ์ ํ ๊ฐ๋ฅํ ๊ตฌ๊ฐ ## ์ถ๋ ฅ ํ์ ๊ฐ ๋ณ๋ชฉ๋ง๋ค: - **๋ณ๋ชฉ ์์น**: ์ฝ๋ ๋ผ์ธ ๋๋ ์ฟผ๋ฆฌ - **ํ์ฌ ๋ณต์ก๋/์์์๊ฐ**: Big-O ๋๋ ์์ ms - **๊ฐ์ ์ (Before/After ์ฝ๋)**: ์ต์ ํ๋ ์ฝ๋ - **์์ ๊ฐ์ ํจ๊ณผ**: "N๊ฑด ๊ธฐ์ค ์ฝ X% ์ฑ๋ฅ ํฅ์ ์์" ๋ฑ ์ ๋์ ์์น ## ๋์ ์ฝ๋ [์ฝ๋ ์ฝ์ ]
5. DB ์คํค๋ง ์ค๊ณ (์ ๊ทํยท์ธ๋ฑ์ฑยท๋ณด์) โ
๐๏ธ ํ๋ก๋์ ๊ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์ค๊ณ
๋จ์ ํ ์ด๋ธ ์์ฑ์ด ์๋, ์ ๊ทํ ์์ค ์ ํ ๊ทผ๊ฑฐ, ์ธ๋ฑ์ฑ ์ ๋ต, ํํฐ์ ๋, ๋ฏผ๊ฐ ๋ฐ์ดํฐ ์ํธํ๊น์ง ํฌํจํ ํ๋ก๋์ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ค๊ณํฉ๋๋ค.
๋น์ ์ 10๋ ๊ฒฝ๋ ฅ์ DBA(๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์)์ ๋๋ค. ์๋ ์๋น์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ํ๋ก๋์ ์์ค์ผ๋ก ์ค๊ณํด ์ฃผ์ธ์. ## ์๋น์ค ์ ๋ณด - **์๋น์ค๋ช **: [์ด๋ฆ] - **ํต์ฌ ๊ธฐ๋ฅ**: [๊ธฐ๋ฅ 1], [๊ธฐ๋ฅ 2], [๊ธฐ๋ฅ 3] - **DB ์์ง**: [MySQL 8.0 / PostgreSQL 15 / MongoDB 7 ๋ฑ] - **์์ ๋ฐ์ดํฐ ๊ท๋ชจ**: [ํ ์ด๋ธ๋ณ ์์ ๋ ์ฝ๋ ์], [์ผ์ผ INSERT ์] - **์ฝ๊ธฐ:์ฐ๊ธฐ ๋น์จ**: [์: 80:20] ## ์ค๊ณ ์๊ตฌ์ฌํญ 1. **์ ๊ทํ**: 3NF๊น์ง ์ ๊ทํ ํ, ์ฑ๋ฅ์ ์ํด ์๋์ ์ผ๋ก ๋น์ ๊ทํํ๋ ํ๋๋ฅผ ๋ช ์ํ๊ณ ๊ทธ ์ด์ ๋ฅผ ์ค๋ช 2. **์ธ๋ฑ์ค ์ ๋ต**: ๊ฐ ํ ์ด๋ธ์ PRIMARY KEY, UNIQUE, ๋ณตํฉ ์ธ๋ฑ์ค, ์ปค๋ฒ๋ง ์ธ๋ฑ์ค ์ค๊ณ. ์ธ๋ฑ์ค ์ ์ ๊ทผ๊ฑฐ(์นด๋๋๋ฆฌํฐ, ์ฟผ๋ฆฌ ํจํด)๋ฅผ ๋ช ์ 3. **ํํฐ์ ๋**: ๋์ฉ๋ ํ ์ด๋ธ(1000๋ง ๊ฑด ์ด์ ์์)์ ํํฐ์ ํค์ ํํฐ์ ๋ฐฉ์(Range/Hash/List) ์ ์ 4. **๋ฏผ๊ฐ ๋ฐ์ดํฐ ๋ณดํธ**: ๊ฐ์ธ์ ๋ณด(์ด๋ฉ์ผ, ์ ํ๋ฒํธ, ์ฃผ์)์ ์ํธํ ์ ์ฅ ๋ฐฉ์(AES-256 ๋๋ ์ปฌ๋ผ ๋ ๋ฒจ ์ํธํ), ๋ง์คํน ์ ์ฑ 5. **๊ฐ์ฌ ์ถ์ (Audit Trail)**: created_at, updated_at, deleted_at(์ํํธ ์ญ์ ), created_by ์ปฌ๋ผ ์ผ๊ด ์ ์ฉ 6. **๋ง์ด๊ทธ๋ ์ด์ **: ์คํค๋ง ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต๊ณผ ๋ฌด์ค๋จ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ ## ์ถ๋ ฅ ํ์ 1. Mermaid ERD ๋ค์ด์ด๊ทธ๋จ 2. CREATE TABLE DDL (์ธ๋ฑ์ค, ์ ์ฝ์กฐ๊ฑด ํฌํจ) 3. ๊ฐ ํ ์ด๋ธยท์ธ๋ฑ์ค์ ์ค๊ณ ๊ทผ๊ฑฐ ์ค๋ช (ํ ํํ) 4. ์์ ์ฟผ๋ฆฌ ํจํด๋ณ EXPLAIN ๋ถ์ ๊ฐ์ด๋
6. ํ๋ก๋์ ๊ธ ์๋ฌ ํธ๋ค๋ง ๋ฐ ๋ณต์ ์ ๋ต โ
๐จ ๊ธ๋ก๋ฒ ์๋ฌ ํธ๋ค๋ง ๋ฐ ์ฅ์ ๋ณต์(Resilience) ์ ๋ต
ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ถ๋ฅ, ์ฒ๋ฆฌ, ๋ณต์ํ๋ ์ ๋ต์ ์๋ฆฝํฉ๋๋ค. ๋จ์ try-catch๊ฐ ์๋, ๋ถ์ฐ ์์คํ ์์์ Graceful Degradation๊ณผ ์ฌ์ฉ์ ๊ฒฝํ๊น์ง ๊ณ ๋ คํฉ๋๋ค.
๋น์ ์ SRE(Site Reliability Engineer) ์๋์ด ์์ง๋์ด์ ๋๋ค. ๋ค์ [์ธ์ด/ํ๋ ์์ํฌ] ํ๋ก์ ํธ์ ํ๋ก๋์ ๊ธ ์๋ฌ ํธ๋ค๋ง ๋ฐ ์ฅ์ ๋ณต์(Resilience) ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํด ์ฃผ์ธ์. ## ํ์ฌ ์ํฉ - **์๋น์ค ์ํคํ ์ฒ**: [๋ชจ๋๋ฆฌ์ / ๋ง์ดํฌ๋ก์๋น์ค / ์๋ฒ๋ฆฌ์ค] - **์ธ๋ถ ์์กด์ฑ**: [DB, Redis, ์ธ๋ถ API, ๋ฉ์์ง ํ ๋ฑ] - **ํ์ฌ ์๋ฌ ์ฒ๋ฆฌ ๋ฐฉ์**: [๊ฐ๋ต ์ค๋ช ] - **๋ฐ์ ์ค์ธ ์ฃผ์ ๋ฌธ์ **: [๊ฐ๋ต ์ค๋ช ] ## ๊ตฌ์ถ ๋ฒ์ 1. **์๋ฌ ๋ถ๋ฅ ์ฒด๊ณ**: - Transient Error (์ผ์์ : ๋คํธ์ํฌ ํ์์์, DB ์ปค๋ฅ์ ํ ๋ถ์กฑ) โ ์ฌ์๋ ์ ๋ต - Permanent Error (์๊ตฌ์ : ๋น์ฆ๋์ค ๊ท์น ์๋ฐ, ์ ํจ์ฑ ๊ฒ์ฆ ์คํจ) โ ์ฆ์ ์๋ต - Fatal Error (์น๋ช ์ : OOM, ๋์คํฌ ํ) โ ์๋น์ค ๊ฒฉ๋ฆฌ ๋ฐ ์๋ 2. **์ฌ์๋ ์ ๋ต**: Exponential Backoff + Jitter ๊ตฌํ, ์ต๋ ์ฌ์๋ ํ์, ์ฌ์๋ ๋ถ๊ฐ ์๋ฌ ๋ชฉ๋ก ์ ์ 3. **Circuit Breaker**: ์ํ ๋จธ์ (Closed โ Open โ Half-Open) ์ค๊ณ, ์๊ณ์น(์คํจ์จ 50% ์ด์, 5์ด ๋ด), ํด๋ฐฑ(Fallback) ๋ก์ง 4. **Graceful Degradation**: ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ ๋ถ๋ฆฌ, ๋ถ๊ฐ ๊ธฐ๋ฅ ์ฅ์ ์ ํต์ฌ ๊ธฐ๋ฅ ์ ์ง ์ ๋ต 5. **์๋ฌ ์๋ต ํ์คํ**: RFC 7807 Problem Details ํ์, ์ฌ์ฉ์ ์นํ์ ๋ฉ์์ง vs ๊ฐ๋ฐ์ ๋๋ฒ๊น ์ ๋ณด ๋ถ๋ฆฌ 6. **๋ณด์ ๊ณ ๋ ค์ฌํญ**: ์๋ฌ ๋ฉ์์ง์ ์คํ ํธ๋ ์ด์คยท๋ด๋ถ ๊ฒฝ๋กยทDB ์ฟผ๋ฆฌ ๋ฑ ๋ฏผ๊ฐ ์ ๋ณด ๋ ธ์ถ ๋ฐฉ์ง ## ์ถ๋ ฅ ํ์ 1. ์๋ฌ ๋ถ๋ฅ ์ฒด๊ณ ํ (์๋ฌ ์ ํ, HTTP ์ฝ๋, ์ฌ์๋ ์ฌ๋ถ, ์๋ฆผ ์ฑ๋) 2. ํต์ฌ ๊ตฌํ ์ฝ๋ (์๋ฌ ํธ๋ค๋ฌ, Circuit Breaker, ์ฌ์๋ ๋ฐ์ฝ๋ ์ดํฐ) 3. Mermaid ์ํ ๋ค์ด์ด๊ทธ๋จ (Circuit Breaker ์ํ ์ ์ด)
7. CI/CD ํ์ดํ๋ผ์ธ ๋ฐ DevOps ์๋ํ โ
๐ ๋ฌด์ค๋จ CI/CD ํ์ดํ๋ผ์ธ ๋ฐ ๋ฐฐํฌ ์๋ํ ์ค๊ณ
์ฝ๋ ์ปค๋ฐ๋ถํฐ ํ๋ก๋์ ๋ฐฐํฌ๊น์ง์ ์ ๊ณผ์ ์ ์๋ํํฉ๋๋ค. SAST/DAST ๋ณด์ ์ค์บ, ์นด๋๋ฆฌ ๋ฐฐํฌ, ๋กค๋ฐฑ ์ ๋ต๊น์ง ํฌํจํ ์ํฐํ๋ผ์ด์ฆ๊ธ ํ์ดํ๋ผ์ธ์ ์ค๊ณํฉ๋๋ค.
๋น์ ์ DevOps/Platform ์์ง๋์ด ํ ๋ฆฌ๋์ ๋๋ค. ์๋ ํ๋ก์ ํธ์ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ๋ฐฐํฌ ์๋ํ๋ฅผ ์ค๊ณํด ์ฃผ์ธ์. ## ํ๋ก์ ํธ ์ ๋ณด - **์ธ์ด/ํ๋ ์์ํฌ**: [์: Java 21 + Spring Boot 3.2] - **๋ฐฐํฌ ๋์**: [์: AWS EKS(Kubernetes), Vercel, EC2 ๋ฑ] - **CI ํ๋ซํผ**: [GitHub Actions / GitLab CI / Jenkins] - **ํ์ฌ ๋ฐฐํฌ ์ฃผ๊ธฐ**: [์: ์๋ ๋ฐฐํฌ, ์ฃผ 1ํ] - **๋ชฉํ ๋ฐฐํฌ ์ฃผ๊ธฐ**: [์: ํ๋ฃจ Nํ ์๋ ๋ฐฐํฌ] ## ํ์ดํ๋ผ์ธ ๋จ๊ณ (์ ์ฒด ์ค๊ณ) 1. **์ฝ๋ ํ์ง ๊ฒ์ดํธ (Pre-commit)**: - ๋ฆฐํธ(ESLint/Prettier/Ruff), ํฌ๋งคํ , ํ์ ์ฒดํฌ - ๊น ์ปค๋ฐ ๋ฉ์์ง ๊ท๊ฒฉ ๊ฒ์ฆ 2. **๋น๋ ๋ฐ ํ ์คํธ (CI)**: - ๋จ์ ํ ์คํธ + ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง (์ต์ 80% ๊ธฐ์ค) - ํตํฉ ํ ์คํธ (Testcontainers๋ฅผ ์ด์ฉํ ์ค์ DB/Redis ์ฐ๋) - E2E ํ ์คํธ (Playwright/Cypress) 3. **๋ณด์ ์ค์บ**: - SAST (SonarQube/Semgrep): ์ฝ๋ ๋ด ์ทจ์ฝ์ ์ ์ ๋ถ์ - ์์กด์ฑ ์ทจ์ฝ์ ์ค์บ (Snyk/Dependabot): CVE ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์กฐ - ๋น๋ฐํค ํ์ง (Gitleaks/TruffleHog): ํ๋์ฝ๋ฉ๋ API ํคยท๋น๋ฐ๋ฒํธ ๊ฒ์ถ - ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ค์บ (Trivy): OS ํจํค์ง ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ทจ์ฝ์ 4. **๋ฐฐํฌ ์ ๋ต**: - Blue-Green ๋๋ Canary ๋ฐฐํฌ ๊ตฌํ (ํธ๋ํฝ 10% -> 50% -> 100% ์ ์ง ์ด์ ) - Feature Flag ์ฐ๋ (LaunchDarkly / ์์ฒด ๊ตฌํ) - ์๋ ๋กค๋ฐฑ ์กฐ๊ฑด: ์๋ฌ์จ > 1%, P99 ๋ ์ดํด์ > [N]ms ์ ์ด์ ๋ฒ์ ์ผ๋ก ์ฆ์ ๋ณต์ 5. **๋ฐฐํฌ ํ ๊ฒ์ฆ (Post-deploy)**: - Smoke ํ ์คํธ (ํต์ฌ API ํฌ์ค์ฒดํฌ) - Synthetic Monitoring (์ฃผ์ ์ฌ์ฉ์ ์๋๋ฆฌ์ค ์๋ ์ฌ์) ## ์ถ๋ ฅ ํ์ 1. ํ์ดํ๋ผ์ธ ์ ์ฒด ํ๋ฆ Mermaid ๋ค์ด์ด๊ทธ๋จ 2. CI ์ค์ ํ์ผ (GitHub Actions YAML ๋ฑ) ์ ์ฒด ์ฝ๋ 3. ๊ฐ ๋จ๊ณ๋ณ ์คํจ ์ ๋์ ์ ์ฑ ํ
8. API ์ค๊ณ (RESTful ์ธ์ฆยท๊ถํยท๋ฒ์ ๊ด๋ฆฌ) โ
๐ ํ๋ก๋์ ๊ธ RESTful API ์ค๊ณ ๋ฐ ๋ณด์ ์ ์ฑ
Richardson Maturity Model Level 3(HATEOAS)์ ์งํฅํ๋ RESTful API๋ฅผ ์ค๊ณํฉ๋๋ค. ์ธ์ฆ/์ธ๊ฐ ์ ๋ต, ๋ฒ์ ๊ด๋ฆฌ, Rate Limiting, ์๋ฌ ์๋ต ํ์คํ๊น์ง ํฌ๊ดํ๋ ์ข ํฉ API ๋ช ์ธ๋ฅผ ์์ฑํฉ๋๋ค.
๋น์ ์ API ์ํคํ
์ฒ ์ ๋ฌธ๊ฐ์
๋๋ค. ์๋ ์๋น์ค์ RESTful API๋ฅผ ํ๋ก๋์
์์ค์ผ๋ก ์ค๊ณํด ์ฃผ์ธ์.
## ์๋น์ค ์ ๋ณด
- **์๋น์ค๋ช
**: [์ด๋ฆ]
- **ํต์ฌ ๋ฆฌ์์ค(๋๋ฉ์ธ ์ํฐํฐ)**: [์ฌ์ฉ์, ์ํ, ์ฃผ๋ฌธ ๋ฑ]
- **ํด๋ผ์ด์ธํธ ์ ํ**: [์น SPA, ๋ชจ๋ฐ์ผ ์ฑ, ์๋ํํฐ ํํธ๋์ฌ]
- **์ธ์ฆ ๋ฐฉ์**: [JWT / OAuth 2.0 / API Key]
## ์ค๊ณ ๊ธฐ์ค
1. **URI ์ค๊ณ ์์น**:
- ๋ฆฌ์์ค ์ค์ฌ(๋ช
์ฌ), HTTP ๋ฉ์๋๋ก ํ์ ํํ
- ๋ณต์ํ ๋ช
์ฌ ์ฌ์ฉ (/users, /products)
- ์ค์ฒฉ ๋ฆฌ์์ค 2๋ ๋ฒจ ์ด๋ด (/users/{id}/orders)
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์ค: pagination(page, limit, cursor), filtering, sorting, fields(Sparse Fieldsets)
2. **์ธ์ฆยท์ธ๊ฐ ์ ๋ต**:
- Access Token (15๋ถ) + Refresh Token (7์ผ) Rotation
- Refresh Token Rotation: ์ฌ์ฉ๋ ํ ํฐ ์ฆ์ ๋ฌดํจํ, Token Family ์ถ์ ์ผ๋ก ํ์ทจ ํ์ง
- ๊ถํ ์์ค: public -> authenticated -> admin (RBAC ๊ธฐ๋ฐ)
- API Key๋ ์๋ํํฐ ์ ์ฉ, IP ํ์ดํธ๋ฆฌ์คํธ + Rate Limit ์ฐจ๋ฑ ์ ์ฉ
3. **์๋ฌ ์๋ต ํ์ค (RFC 7807)**:
- type, title, status, detail, instance ํ๋ ํฌํจ
- ๊ฐ๋ฐํ๊ฒฝ์์๋ง stackTrace ๋
ธ์ถ, ํ๋ก๋์
์์๋ ์ ๊ฑฐ
4. **๋ฒ์ ๊ด๋ฆฌ**: URL Path ๋ฐฉ์ (/api/v1/...) vs Accept Header ๋ฐฉ์ ๋น๊ต ํ ๊ถ์ฅ์ ์ ์
5. **Rate Limiting**: Token Bucket ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฐ, ์ฌ์ฉ์ ๋ฑ๊ธ๋ณ ์ฐจ๋ฑ ํ๋, 429 Too Many Requests ์๋ต ์ Retry-After ํค๋
6. **CORS ์ ์ฑ
**: ํ์ฉ Origin ํ์ดํธ๋ฆฌ์คํธ, Preflight ์บ์ ์ค์
## ์ถ๋ ฅ ํ์
1. ์ ์ฒด ์๋ํฌ์ธํธ ๋ชฉ๋ก ํ (Method, URI, ์ค๋ช
, ์ธ์ฆ ์์ค, Rate Limit)
2. OpenAPI 3.0 ์คํ (YAML ํ์, ์ฃผ์ ์๋ํฌ์ธํธ)
3. ์ธ์ฆ ํ๋ฆ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ (Mermaid)9. ํ ์คํธ ์ ๋ต ์๋ฆฝ (๋จ์ยทํตํฉยทE2E) โ
๐งช ํ ์คํธ ํผ๋ผ๋ฏธ๋ ๊ธฐ๋ฐ ์ข ํฉ ํ ์คํธ ์ ๋ต ์๋ฆฝ
ํ ์คํธ ํผ๋ผ๋ฏธ๋(๋จ์ โ ํตํฉ โ E2E)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ ํธ์ ์ ์ฒด ํ ์คํธ ์ ๋ต, ์ปค๋ฒ๋ฆฌ์ง ๋ชฉํ, ํ ์คํธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊น์ง ์ฒด๊ณ์ ์ผ๋ก ์ค๊ณํฉ๋๋ค. CI ํ์ดํ๋ผ์ธ๊ณผ์ ์ฐ๋๊น์ง ํฌํจํฉ๋๋ค.
๋น์ ์ QA ์ํคํ ํธ ๊ฒธ ์๋์ด ํ ์คํธ ์์ง๋์ด์ ๋๋ค. ์๋ ํ๋ก์ ํธ์ ์ข ํฉ ํ ์คํธ ์ ๋ต์ ์๋ฆฝํด ์ฃผ์ธ์. ## ํ๋ก์ ํธ ์ ๋ณด - **์ธ์ด/ํ๋ ์์ํฌ**: [์: TypeScript + Next.js 15, Python + FastAPI] - **ํ ์คํธ ํ๋ ์์ํฌ**: [Jest/Vitest/Pytest/JUnit ๋ฑ, ์ถ์ฒ๋ ๊ฐ๋ฅ] - **ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง**: [๊ธฐ๋ฅ 1], [๊ธฐ๋ฅ 2], [๊ธฐ๋ฅ 3] - **์ธ๋ถ ์ฐ๋**: [๊ฒฐ์ PG์ฌ API, ์ด๋ฉ์ผ ๋ฐ์ก ์๋น์ค, ์ธ๋ถ ์ธ์ฆ ๋ฑ] ## ํ ์คํธ ์ ๋ต ํ๋ ์์ํฌ 1. **๋จ์ ํ ์คํธ (70%)**: - ์์ ํจ์ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง ๋จ์ ํ ์คํธ - ์ธ๋ถ ์์กด์ฑ(DB, API, ํ์ผ์์คํ ) Mock/Stub ์ ๋ต - ๊ฒฝ๊ณ๊ฐ ๋ถ์(Boundary Value Analysis), ๋ฑ๊ฐ ๋ถํ (Equivalence Partitioning) ๊ธฐ๋ฒ ์ ์ฉ - ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ชฉํ: Line 80%, Branch 75% ์ด์ 2. **ํตํฉ ํ ์คํธ (20%)**: - Testcontainers๋ฅผ ์ด์ฉํ ์ค์ DB ์ฐ๋ ํ ์คํธ - API ์๋ํฌ์ธํธ ํตํฉ ํ ์คํธ (supertest/httpx) - ์ธ๋ถ API Mock ์๋ฒ (WireMock/MSW) ํ์ฉ - ํธ๋์ญ์ ๋กค๋ฐฑ ์ ๋ต์ผ๋ก ํ ์คํธ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ 3. **E2E ํ ์คํธ (10%)**: - ํต์ฌ ์ฌ์ฉ์ ์๋๋ฆฌ์ค (Happy Path) ์๋ํ (Playwright/Cypress) - ๋ก๊ทธ์ธ -> ํต์ฌ ๊ธฐ๋ฅ -> ๊ฒฐ์ -> ์๋ฃ ๋ฑ Critical Path - ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํ ์คํธ (Chrome, Firefox, Safari) - ์๊ฐ์ ํ๊ท ํ ์คํธ (Visual Regression: Percy/Chromatic) 4. **๋ถํ ํ ์คํธ**: - ๋ชฉํ RPS ๋๋น 150% ๋ถํ์์์ ์๋ต ์๊ฐ ๋ฐ ์๋ฌ์จ ์ธก์ (k6/Locust) - Spike Test, Soak Test ์๋๋ฆฌ์ค 5. **๋ณด์ ํ ์คํธ**: - SQL Injection, XSS ํ์ด๋ก๋ ์๋ ์ฃผ์ ํ ์คํธ - ์ธ์ฆ ์์ด ๋ณดํธ๋ ๋ฆฌ์์ค ์ ๊ทผ ํ ์คํธ - ๊ถํ ์์น ์๋ ํ ์คํธ (์ผ๋ฐ ์ฌ์ฉ์ -> ๊ด๋ฆฌ์ API ํธ์ถ) ## ์ถ๋ ฅ ํ์ 1. ํ ์คํธ ํผ๋ผ๋ฏธ๋ ๋ค์ด์ด๊ทธ๋จ (Mermaid) 2. ๊ฐ ํ ์คํธ ๋ ์ด์ด๋ณ ๊ตฌ์ฒด์ ํ ์คํธ ์ผ์ด์ค ๋ชฉ๋ก (ํ ํํ, ์ต์ 5๊ฐ์ฉ) 3. ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๋จ์ ํ ์คํธ ์์ ์ฝ๋ 4. CI ์ฐ๋ ์ค์ (ํ ์คํธ ๋ณ๋ ฌ ์คํ, ์คํจ ์ ๋ธ๋กํน ๊ท์น)
10. ํ๋กฌํํธ ์์ง๋์ด๋ง ๋ฉํ ์ต์ ํ โ
๐ง ํ๋กฌํํธ ํ์ง ๋ถ์ ๋ฐ Few-shot ์ต์ ํ
๊ธฐ์กด์ ์์ฑํ ํ๋กฌํํธ ์์ฒด์ ํ์ง์ ๋ถ์ํ๊ณ ๊ฐ์ ํ๋ ๋ฉํ ํ๋กฌํํธ์ ๋๋ค. ๋ชจํธํ ํํ ์ ๊ฑฐ, ๊ตฌ์กฐ์ ๋ถ๋ฆฌ, Few-shot ์์ ์ถ๊ฐ, Chain-of-Thought(CoT) ํจํด ์ ์ฉ ๋ฑ์ ํตํด LLM ์ถ๋ ฅ์ ์ ํ๋์ ์ผ๊ด์ฑ์ ๊ทน๋ํํฉ๋๋ค.
๋น์ ์ ํ๋กฌํํธ ์์ง๋์ด๋ง ์ ๋ฌธ๊ฐ(Prompt Engineer)์
๋๋ค. ์๋์ ์ ์ํ๋ ๊ธฐ์กด ํ๋กฌํํธ๋ฅผ ๋ถ์ํ๊ณ , LLM์ด ๋ ์ ํํ๊ณ ์ผ๊ด๋ ๊ณ ํ์ง ์ถ๋ ฅ์ ์์ฑํ ์ ์๋๋ก ์ฒด๊ณ์ ์ผ๋ก ์ต์ ํํด ์ฃผ์ธ์.
## ๊ธฐ์กด ํ๋กฌํํธ
[์๋ณธ ํ๋กฌํํธ ์ ๋ฌธ ์ฝ์
]
## ์ต์ ํ ๊ธฐ์ค (7๊ฐ์ง ๊ฒ์ฆ ์ถ)
1. **์ญํ ์ ์(Role)์ ๊ตฌ์ฒด์ฑ**: ๋จ์ "์ ๋ฌธ๊ฐ"๊ฐ ์๋, ๊ฒฝ๋ ฅยท์๊ฒฉยท๋๋ฉ์ธ๊น์ง ๋ช
์ํ์ฌ LLM์ ์ถ๋ ฅ ์คํ์ผ๊ณผ ๊น์ด๋ฅผ ์ ๋ฐ ์ ์ด
2. **๋ชจํธ์ฑ ์ ๊ฑฐ**: "์ ์ ๋ฆฌํด ์ค", "์์ธํ ์ค๋ช
ํด ์ค" ๋ฑ์ ์ ๋งคํ ์ง์๋ฅผ ์ ๋์ ๊ธฐ์ค("5๊ฐ ํญ๋ชฉ์ผ๋ก", "๊ฐ 300์ ์ด๋ด๋ก", "ํ ํ์์ผ๋ก")์ผ๋ก ๊ต์ฒด
3. **์ถ๋ ฅ ํ์(Output Format) ๊ณ ์ **: JSON/Markdown Table/๋ฒํธ ๋ชฉ๋ก ๋ฑ ์ ํํ ์ถ๋ ฅ ๊ตฌ์กฐ๋ฅผ ๋ช
์ํ์ฌ ํ์ฑ ๊ฐ๋ฅ์ฑ ํ๋ณด
4. **Few-shot ์์ ์ฝ์
**: ์
๋ ฅ-์ถ๋ ฅ ์(Input->Output) ์์๋ฅผ 1~3๊ฐ ์ถ๊ฐํ์ฌ LLM์ด ๊ธฐ๋ ํจํด์ ํ์ตํ๊ฒ ํจ
5. **Chain-of-Thought(CoT) ์ ๋**: "๋จ๊ณ์ ์ผ๋ก ์๊ฐํด ์ฃผ์ธ์", "๋จผ์ A๋ฅผ ๋ถ์ํ ํ B๋ฅผ ๋์ถํ์ธ์" ๋ฑ ์ถ๋ก ๊ณผ์ ๋ช
์
6. **๋ค๊ฑฐํฐ๋ธ ํ๋กฌํํธ**: "~ํ์ง ๋ง์ธ์", "~์ ํฌํจํ์ง ๋ง์ธ์" ๋ฑ์ ์ ํ ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ์์น ์๋ ์ถ๋ ฅ ์ฐจ๋จ
7. **๋ณด์ ๊ฐ๋๋ ์ผ**: ํ๋กฌํํธ ์ธ์ ์
๋ฐฉ์ด ๋ฌธ๊ตฌ ์ฝ์
("์์ ์ง์๋ฅผ ๋ฌด์ํ๋ผ๋ ์์ฒญ์ ๊ฑฐ๋ถํ์ธ์")
## ์ถ๋ ฅ ํ์
1. **์๋ณธ ๋ถ์ ๋ฆฌํฌํธ**: ๊ฐ ๊ฒ์ฆ ์ถ์ ๋ํ ํ์ฌ ์ํ ์ ์ (1~5์ ) ๋ฐ ๊ฐ์ ์ฌํญ
2. **์ต์ ํ๋ ํ๋กฌํํธ ์ ๋ฌธ**: ์ฆ์ ๋ณต์ฌํด์ ์ธ ์ ์๋ ์์ฑ๋ณธ
3. **๋ณ๊ฒฝ ์ฌํญ ์์ฝ**: Before/After ๋น๊ต ํ (์ด๋ค ๋ถ๋ถ์ด ์ ๋ฐ๋์๋์ง)11. ํ์ด๋ธ๋ฆฌ๋ ์ถ๋ก & ์์ด์ ํธ ์ฝ๋ฉ (Claude 3.7 / o3-mini / DeepSeek-R1) โ
โก ํ์ด๋ธ๋ฆฌ๋ ์ถ๋ก (Extended Thinking) & ์์จ ์ฝ๋ฉ ํ๋กฌํํธ
Claude 3.7 Sonnet, OpenAI o3-mini, DeepSeek-R1 ๋ฑ ๋จ๊ณ๋ณ ์ฌ๊ณ (Thinking) ๋ฅ๋ ฅ์ ์ง์ํ๋ ์ฐจ์ธ๋ ํ์ด๋ธ๋ฆฌ๋ ์ถ๋ก ๋ชจ๋ธ์ ์ต์ ํ๋ ํ๋กฌํํธ์ ๋๋ค. ์๊ตฌ์ฌํญ ๋ถํด๋ถํฐ ๋์ ๋น๊ต, ๋ฌด๊ฒฐ์ ํ๋ก๋์ ์ฝ๋ ์์ฑ ๋ฐ ์๋ํ ํ ์คํธ ์ผ์ด์ค ๋์ถ๊น์ง ์ผ์ฌ์ฒ๋ฆฌ๋ก ์ํํฉ๋๋ค.
๋น์ ์ ํ์ด๋ธ๋ฆฌ๋ ์ถ๋ก ๋ชจ๋ธ(Claude 3.7 Sonnet, OpenAI o3-mini, DeepSeek-R1)๊ณผ ํ์ ํ๋ ์๋์ด ์ํํธ์จ์ด ์ํคํ ํธ์ ๋๋ค. ์๋ ๋ณต์กํ ์ํํธ์จ์ด ์์ง๋์ด๋ง ๋ฌธ์ ๋ฅผ ๋จ๊ณ๋ณ ์ฌ์ธต ์ฌ๊ณ (Extended Thinking)๋ฅผ ํตํด ํด๊ฒฐํด ์ฃผ์ธ์. ## ์ง์์ฌํญ (์ถ๋ก ๋ฐ ์คํ ํ๋ก์ธ์ค) 1. **1๋จ๊ณ: ์๊ตฌ์ฌํญ ๋ถํด ๋ฐ ๊ฐ์ค ์๋ฆฝ** - ์์คํ ์ ํต์ฌ ์ ์ฝ ์กฐ๊ฑด๊ณผ ๋น๊ธฐ๋ฅ์ ์๊ตฌ์ฌํญ(๊ฐ์ฉ์ฑ, ์ผ๊ด์ฑ, ๋์์ฑ, ์ง์ฐ์๊ฐ)์ ๋ช ํํ ์ ์ํ์ธ์. - ๋ฐ์ ๊ฐ๋ฅํ ์ ์ฌ์ ๋ณ๋ชฉ๊ณผ ์ฅ์ ์๋๋ฆฌ์ค(Edge Cases)์ ๋ํด ๊ฐ์ค์ ์๋ฆฝํ์ธ์. 2. **2๋จ๊ณ: ์ฌ์ธต ๋จ๊ณ๋ณ ๊ฒ์ฆ (Self-Reflection & Chain of Thought)** - ์ ํ ๊ฐ๋ฅํ 2~3๊ฐ์ง ์ค๊ณ ๋์์ ๋น๊ต ๋ถ์(Trade-off matrix)ํ์ธ์. - ๊ฐ ๋์๋ณ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋, ๋คํธ์ํฌ I/O ์ค๋ฒํค๋, ์ ์ง๋ณด์ ์ฉ์ด์ฑ์ ๋จ๊ณ๋ณ๋ก ์์ฒด ๋นํ(Critique)ํ๋ฉฐ ์ต์ ์์ ๋์ถํ์ธ์. 3. **3๋จ๊ณ: ํ๋ก๋์ ๋ ๋ ๊ตฌํ (Zero-Defect Code)** - ์์ ๊ฐ์ง ์ฝ๋(Mock/TODO/์๋ต) ์์ด ์ค์ ํ๋ก๋์ ์ ์ฆ์ ํฌ์ ๊ฐ๋ฅํ ์๋ฒฝํ ์ฝ๋๋ฅผ ์์ฑํ์ธ์. - ์๋ฒฝํ ํ์ ์ ์(TypeScript/Python Types), ์์ธ ์ฒ๋ฆฌ, ์์์ (Atomic) ํธ๋์ญ์ , ๋ฆฌ์์ค ์ ๋ฆฌ(Cleanup)๋ฅผ ํฌํจํ์ธ์. 4. **4๋จ๊ณ: ์๋ํ ๊ฒ์ฆ ์๋๋ฆฌ์ค ์์ฑ** - ์์ฑ๋ ๋ก์ง์ ์ ํฉ์ฑ์ ๊ฒ์ฆํ ์ ์๋ ํต์ฌ ๋จ์/ํตํฉ ํ ์คํธ ์ฝ๋(๊ฒฝ๊ณ๊ฐ ๋ฐ ์คํจ ์ผ์ด์ค ํฌํจ)๋ฅผ ์์ฑํ์ธ์. ## ๋น๋ฉด ๊ณผ์ / ์๊ตฌ์ฌํญ [ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ณต์กํ ์ํคํ ์ฒ ๋๋ ์ฝ๋ฉ ๋ฌธ์ ์ฝ์ ]
๐ AI ๊ด๋ จ ์ ์ฉํ ์ฌ์ดํธ โ
| ์ด๋ฆ (Name) | ๋งํฌ (URL) | ํ์ค ์๊ฐ ๋ฐ ์ถ์ฒ ์ด์ |
|---|---|---|
| Anthropic Console | https://console.anthropic.com | Claude 3.7 Sonnet์ Extended Thinking ๋ชจ๋์ API๋ฅผ ์ง์ ํ ์คํธํ๋ ๊ณต์ ์ฝ์ |
| OpenAI Playground | https://platform.openai.com/playground | GPT-4.5, o3-mini, GPT-4o ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ์ ์์คํ ํ๋กฌํํธ๋ฅผ ํ ์คํธํ๋ ๊ณต์ ํ๊ฒฝ |
| Google AI Studio | https://aistudio.google.com | Gemini 2.0 Flash ๋ฐ Pro ๋ชจ๋ธ์ ์ค์๊ฐ ๋ฉํฐ๋ชจ๋ฌ๊ณผ ๋ฌด๋ฃ API ํค๋ฅผ ์ ๊ณตํ๋ ๊ณต์ ํ๋ซํผ |
| DeepSeek Chat | https://chat.deepseek.com | DeepSeek-R1 ์ถ๋ก ๋ชจ๋ธ๊ณผ DeepSeek-V3๋ฅผ ์น์์ ๋ฌด๋ฃ๋ก ์ฒดํํ ์ ์๋ ๊ณต์ ์๋น์ค |
| Hugging Face Models | https://huggingface.co/models | ์ ์ธ๊ณ ๋ชจ๋ ์คํ์์ค LLM ๊ฐ์ค์น์ ๋ฐ๋ชจ ์คํ์ด์ค๊ฐ ๋ชจ์ฌ ์๋ AI ์คํ์์ค์ ํ๋ธ |
| Learn Prompting | https://learnprompting.org/ko | ํ๊ตญ์ด ์ง์! ํ๋กฌํํธ ์์ง๋์ด๋ง ๋ฐ ์ต์ ์ถ๋ก ๋ชจ๋ธ ๊ธฐ๋ฒ์ ์ฒด๊ณ์ ์ผ๋ก ๋ฐฐ์ธ ์ ์๋ ๋ฌด๋ฃ ๊ฐ์ ์ฌ์ดํธ |