๐ก ์ API ๋ฌธ์๊ฐ ์ค์ํ ๊น?
API๋ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ๋ ์ ํ์
๋๋ค.
์ข์ API๋ฅผ ๋ง๋ ๋ค๊ณ ํด๋, ์ฌ์ฉ๋ฒ์ ๋ชจ๋ฅด๋ฉด ์ธ ์ ์๊ฒ ์ฃ ?
“API๋ ๋ฌธ์ํ๋ ๋งํผ๋ง ๊ฐ์น๊ฐ ์๋ค.”
- ์ด๋ค endpoint๊ฐ ์๋์ง
- ์ด๋ค method(GET, POST ๋ฑ)๊ฐ ๊ฐ๋ฅํ์ง
- ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋์ง
- ์ธ์ฆ์ ์ด๋ป๊ฒ ํ๋์ง
์ด๋ฐ ๋ด์ฉ์ด ์๋ค๋ฉด, ๊ทธ API๋ ์ฌ์ฉ์๊ฐ ์๋ ์ฑ๊ณผ ๋ค๋ฅผ ๋ฐ ์์ต๋๋ค.
๐งช TDD๋ก Django ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐ ์ค
์ด๋ฒ ๊ฐ์๋ Django ์ฌํ ๊ณผ์ ์ด์๊ณ , TDD(Test-Driven Development) ๋ฐฉ์์ผ๋ก API๋ฅผ ํ๋์ฉ ๋ง๋ค๊ณ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด POST /recipes/๋ GET /tags/์ ๊ฐ์ API๋ฅผ ๋ง๋ค๊ณ ํ
์คํธ๋ก ๊ฒ์ฆํ์ฃ .
๊ทธ๋ฐ๋ฐ ๊ธฐ๋ฅ์ด ๋ง์์ง๋ฉด์, ๋ด๊ฐ ๋ง๋ API๋ฅผ ์ธ๋ถ ๊ฐ๋ฐ์๋ ํ์๋ค์ด ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ๊ณ ๋ฏผ์ด ์๊ฒผ์ต๋๋ค.
๊ทธ๋์ ์ด๋ฒ์ API ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
๐ ๋ฌธ์ํ ๋ฐฉ์ ๋ ๊ฐ์ง
- ์๋ ๋ฌธ์ํ (์ถ์ฒ โ)
- Markdown ๋ฌธ์๋ Word ๋ฌธ์๋ก ์์ฑ
- ๊ธฐ๋ฅ ์ถ๊ฐ ์ ์๋์ผ๋ก ์์ ํด์ผ ํจ
- ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ์ต์ ์ํ ์ ์ง๊ฐ ์ด๋ ค์
- ์๋ ๋ฌธ์ํ (์ถ์ฒ โ
)
- ์ฝ๋์ ์์ฑํ ์ ๋ณด๋ก๋ถํฐ ๋ฌธ์๋ฅผ ์๋ ์์ฑ
- API ๋ณ๊ฒฝ์ฌํญ์ด ๋ฌธ์์๋ ์๋ ๋ฐ์
- ํ ์คํธ๋ ๊ฐ๋ฅํ UI ์ ๊ณต
๐งฐ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋๊ตฌ: DRF Spectacular + Swagger UI
- DRF Spectacular
Django REST Framework์ฉ ๋ฌธ์ ์๋ ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
→ OpenAPI 3.0 ์คํ ์ง์ (์ ๊ณ ํ์ค) - Swagger UI
OpenAPI ๋ฌธ์๋ฅผ ์ฝ์ด์, ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ ์ธํฐํ์ด์ค๋ก ์๊ฐํ
→ API๋ฅผ ์ง์ ํ ์คํธํ๊ณ ์๋ต๋ ๋ณผ ์ ์์
๐ Schema๋?
DRF Spectacular์ ๋ด๋ถ์ ์ผ๋ก schema๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์คํค๋ง๋ .yaml ๋๋ .json ํ์์ผ๋ก ์์ฑ๋๋ฉฐ, API์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
์:
paths:
/tags/:
get:
description: "List all tags"
parameters:
- name: "assigned_only"
in: "query"
required: false
schema:
type: "integer"
enum: [0, 1]
responses:
"200":
description: "Successful Response"
์คํค๋ง๋ Swagger์ ๊ฐ์ ๋๊ตฌ์์ ์๋์ผ๋ก ์ฝ์ด์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๐ง๐ป Swagger UI๋ก ๋ฌธ์ํ๋ API ํ ์คํธํ๊ธฐ
Swagger UI๋ฅผ ๋์ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ๋ชจ๋ API ์๋ํฌ์ธํธ ๋ชฉ๋ก ํ์ธ
- ๊ฐ ์์ฒญ์ method(GET/POST ๋ฑ), ํ๋ผ๋ฏธํฐ, ์๋ต ์์ ํ์ธ
- Try it out → ์ง์ API์ ์์ฒญํด๋ณด๊ธฐ
- ์ธ์ฆ ํ ํฐ ์ ๋ ฅ ๊ธฐ๋ฅ๋ ์ง์ (JWT, Token ๋ฑ)
์ด๋ ๊ฒ ๋ฌธ์์ ํ ์คํธ ๋๊ตฌ๊ฐ ํ๋์ ํ์ด์ง๋ก ํตํฉ๋ฉ๋๋ค.
โ TDD + ์๋ ๋ฌธ์ํ์ ์๋์ง
- TDD๋ก ํ ์คํธ ์ฝ๋๋ถํฐ ์์ฑํ๋ฉด, API ๊ธฐ๋ฅ์ด ๋ช ํํด์ง๊ณ
- docstring์ ์ ์์ฑํ๋ฉด, ๋ฌธ์๋ ์๋์ผ๋ก ๊ตฌ์ฑ
- Swagger๋ฅผ ๋์์ ๋ฐ๋ก ํ ์คํธ ๊ฐ๋ฅ
ํ ์คํธ + ๋ฌธ์ + ๊ธฐ๋ฅ ๊ตฌํ
์ด ์ธ ๊ฐ์ง๋ฅผ ๋์์ ์ฑ๊ธธ ์ ์๋ค๋ ๊ฒ์ด ์ด๋ฒ ๊ฐ์์์ ๊ฐ์ฅ ์ธ์ ๊น์๋ ๋ถ๋ถ์ด์์ต๋๋ค.
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์๋ ๋ฌธ์ํ๋ฅผ ๋ฐ๋ณตํ๋ ๋์ , ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋์ผ๋ก ๋ฌธ์๋ฅผ ์์ฑํ๊ณ ,
๊ทธ ๋ฌธ์ ์์์ ์ง์ API๋ฅผ ํ
์คํธํ ์ ์๋ค๋ฉด ์ผ๋ง๋ ํจ์จ์ ์ผ๊น์?
DRF Spectacular + Swagger UI ์กฐํฉ์ Django REST Framework์์ API ๊ฐ๋ฐ๊ณผ ๋ฌธ์ํ๋ฅผ ์ ๋ง ๊ฐํธํ๊ฒ ๋ง๋ค์ด์ค๋๋ค.
API๋ฅผ ํ๊ณผ ๊ณต์ ํ๊ฑฐ๋ ์คํ API๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ๊ผญ ์๋ ๋ฌธ์ํ๋ฅผ ๋์ ํด๋ณด์ธ์!
ํ์ํ๋ค๋ฉด ๋ค์ ๊ธ์์๋ DRF Spectacular ์ค์น ๋ฐ ์ค์ ๋ฒ๋ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํด๋๋ฆด๊ฒ์.
์ด ๊ธ์ด ๋์์ด ๋์
จ๋ค๋ฉด ๊ณต๊ฐ ♥๏ธ ๋๋ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!