| name | api-design |
| description | Use when designing API endpoints, reviewing API contracts, adding pagination/filtering, or planning versioning strategy. Do NOT use for API consumption, client-side HTTP, or GraphQL. |
API Design Patterns
์ด ํ๋ก์ ํธ๋ค์ API ์ปจ๋ฒค์
(์ ํ)๊ณผ ๋ฆฌ๋ทฐ ๊ธฐ์ค๋ง ๋ด๋๋ค. REST ์ผ๋ฐ ์ง์์ ๋ชจ๋ธ์ ์ด๋ฏธ ์์.
CRITICAL Rules
- ALWAYS plural nouns, kebab-case, no verbs โ
/team-members/:id (์์ธ: actions /orders/:id/cancel)
- ALWAYS semantic status codes โ 200 for everything ๊ธ์ง, created๋
201 + Location
- ALWAYS pagination for list endpoints โ unbounded list ๊ธ์ง. Public API๋ cursor ๊ธฐ๋ณธ
- NEVER expose internal details in errors โ stack trace, SQL ์ฟผ๋ฆฌ ๊ธ์ง
- ALWAYS validate at boundaries โ ์ธ๋ถ ์
๋ ฅยท์จ๋ํํฐ ์๋ตยทenv/config ๋ก๋ฉ์ ๊ฒ์ฆ, ์ด๋ฏธ ๊ฒ์ฆ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ ์ฌ๊ฒ์ฆ ๊ธ์ง
- ALWAYS rate limiting โ ๋ด๋ถ API ํฌํจ
- ๋ฒ์ ๋: URL path (
/api/v1/) ๋ฐฉ์. breaking change ์์ด๋ ์ ๋ฒ์ ๋ง๋ค์ง ์์
Response Envelope (์ปจ๋ฒค์
)
code: machine-readable snake_case / message: human-readable / details: field-level errors
- Public API๋ envelope ํ์, internal API๋ flat ํ์ฉ
Common Rationalizations
์ฝ๋ ๋ฆฌ๋ทฐ์์ ์์ฃผ ๋์ค๋ ๋ณ๋ช
๊ณผ ๋ฐ๋ฐ. ๋ ์์ ์ ์ค๊ณ ๋ฆฌ๋ทฐ์๋ ์ ์ฉํ๋ผ.
| ๋ณ๋ช
| ๋ฐ๋ฐ |
|---|
| "๋์ค์ ๋ฌธ์ํํ ๊ฒ์" | ํ์
์ด ๊ณง ๋ฌธ์๋ค. DTO/์คํค๋ง๋ฅผ ๋จผ์ ์ ์ํ๋ฉด OpenAPI๊ฐ ์๋ ์์ฑ๋๋ค. |
| "์ง๊ธ์ pagination ํ์ ์์ด์" | 100๊ฐ ๋๋ ์๊ฐ ํ์ํด์ง๋ค. ๋ ๊ฑฐ์ ์๋ํฌ์ธํธ์ pagination ์ถ๊ฐํ๋ ๊ฒ 3๋ฐฐ ํ๋ค๋ค. |
| "๋ฒ์ ๋์ ํ์ํด์ง ๋ ํ์ฃ " | versioning ์๋ breaking change = ์๋น์ ํ๊ดด. v1/ ํ๋ฆฌํฝ์ค๋ง ๋จผ์ ๋ฐ์๋ ๋น์ฉ์ด ๊ฑฐ์ ์๋ค. |
| "์๋ฌด๋ ๊ทธ ๋ฏธ๋ฌธ์ํ๋ ๋์ ์ ์จ์" | Hyrum's Law. ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฑด ๋๊ตฐ๊ฐ ์์กดํ๋ค. |
| "Controller์์ Entity ๋ฐ๋ก ๋ฐํํด๋ ๋ผ์" (Spring) | Entity ๋
ธ์ถ = ๋ด๋ถ ๊ตฌ์กฐ ์ ์ถ + JPA proxy ์ง๋ ฌํ ์ LazyInitializationException. DTO ๋ถ๋ฆฌ๋ ํ์ ๋ถ๊ฐ. |
| "๋ด๋ถ์ฉ์ด๋ผ rate limiting ์ ํด๋ ๋ผ์" | ๋ด๋ถ ๋ฐฐ์น ์์
์ด prod DB ํฐ๋จ๋ฆฌ๋ ์ฌ๋ก๊ฐ ๊ฐ์ฅ ํํ๋ค. |
| "ํ๋ก ํธ๊ฐ ๊ฒ์ฆํ๋ ์๋ฒ๋ ์๋ตํด๋ ๋ผ์" | ํ๋ก ํธ ๊ฒ์ฆ์ UX, ์๋ฒ ๊ฒ์ฆ์ ๋ณด์. curl ํ ๋ฒ์ด๋ฉด ํ๋ก ํธ ์ฐํ. |
Gotchas
- โ ์ธ์ฆ ์คํจ์ 404 ๋ฐํ โ 403 (authenticated) / 401 (not authenticated)
- โ validation ์๋ฌ์ 500 โ 400 (malformed) / 422 (valid JSON, invalid data)
- โ ์จ๋ํํฐ ์๋ต์ ๋ฌด๊ฒ์ฆ ์ฌ์ฉ โ ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๋์ผํ๊ฒ ์คํค๋ง ๊ฒ์ฆ (Pydantic / Zod /
@Valid)
Cross-References
| Topic | Skill |
|---|
| Spring Boot REST controller, exception handling | springboot-patterns |
| SQL ํ์ด์ง๋ค์ด์
์ต์ ํ | sql-optimization-patterns |
| REST/GraphQLยทauth ๋ฐฉ์ ๋ฑ ์ํคํ
์ฒ ๊ฒฐ์ ๊ธฐ๋ก | adr |