Today I Learn โ๐ผ
- ์ค๋ ํ๋ฃจ ๊ฐ์ฅ ์ธ์ ๊น์๋ ๋ฐฐ์์๋ ๋ญ๊ฐ ์์์ง?
- endpoint๋ฅผ ์ ํ๋๋ฐ ์๋ฌธ์ด ๋ค์๋ค
- patch ์ธ์ ์ฐ๋๊ฑฐ์ง?
- ๋จ์ผ์ฑ ์์์น์ class ๋ฒ์ ์๋์ผ?
- ๊ทธ ๋ฐฐ์๊น์ง ๋ค๊ฐ๊ฐ๋๋ฐ ์ด๋ค ์ด๋ ค์์ด ์์์ง?
- ํ์ฌ ํ์ ๋ฐ๋ผ ๋ฌ๋ฆฌ์ง๋ ๊ฒ ์๋๊ฐ? ๋ผ๊ณ ์๊ฐํ๊ณ ๋์ด๊ฐ์๋ค.
- ๊ทธ๋ฌ๋ ํ์์ด ์ ๊ฐ์ endpoint๋ก patch๋ฅผ ํด๋ ๋๋๋ฐ ์ด์ ๋ฅผ ๋ฌผ์ด์ ์๊ฐ์ ํ๊ฒ ๋์๋ค.
- ๊ทธ ์ด๋ ค์์ ํด๊ฒฐํ๊ธฐ ์ํ ๋์ ์๋๋ค์ ๋ฌด์์ด ์์์ง?
- ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ์ง์
- gpt ์ฌ์ฉ
- ๋ฉํ ๊ฐ ์์ ๋ฆฌ๋ทฐ
- ๊ทธ ๊ณผ์ ์์ ๋๋ ๋ฌด์์ ๊นจ๋ฌ์๊ณ , ์ด๋ค ๊ฐ์ /์๊ฐ์ด ๋ค์์์ง?
- ๋ฐฐ๋ฌ์ฑ์์๋ ์์์ ๋ฏธ๋ฆฌ ์๋์ ์์ ํ ์ผ์ด ์๋ค
- ๋ช ์ธ์๋ฅผ ๋ ์ ๋ด์ผํ๋ค
- ์ด ์ํ์์ ์ดํ ๋ ๋์ ๋ด๊ฐ ๋๋ ค๋ฉด ๋ฌด์์ ๋ณด์ํ์ง?
- ๋ช ์ธ์ ๋๋ก ํด์ผ ํจ
- ํ์คํ ํด๋ด์ผ ์๊ฐ์ ํ๊ฒ ๋๋ค.
API ์ค๊ณ์๋ ์ฌ๋ฌ ์์น์ด ์๋ค.
API์ ํจ์จ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฉ์ฑ ๋ฐ ํ์ฅ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ ์ค๋๋ค.
์ฌ๊ธฐ์๋ RESTful API ๋์์ธ ์์น, API ์ค๊ณ์ ๋ชจ๋ฒ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ๊ฒฝํ(UX) ์์น ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
์๋๋ API ์ค๊ณ ์ ๊ณ ๋ คํด์ผ ํ ์ฃผ์ ์์น๋ค์ ๋๋ค.
1. ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility Principle)
- ์ค๋ช : ๊ฐ ์๋ํฌ์ธํธ๋ ํ๋์ ๊ธฐ๋ฅ๋ง์ ์ํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด API์ ์ฑ ์์ด ๋ช ํํด์ง๊ณ , ์ดํด์ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํด์ง๋๋ค.
- ์์: ์์ ์กฐํ, ์ถ๊ฐ, ์์ , ์ญ์ ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ์๋ํฌ์ธํธ๋ก ๊ตฌ๋ถํฉ๋๋ค.
2. ์ผ๊ด์ฑ ์๋ ์ค๊ณ (Consistency)
- ์ค๋ช : API์ ๊ฒฝ๋ก, ๋ฉ์๋, ํ๋ผ๋ฏธํฐ, ์๋ต ํ์์ด ์ผ๊ด๋๊ฒ ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด API ์ฌ์ฉ์๋ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์์: ๋ชจ๋ ์๋ํฌ์ธํธ๋ /resource ํํ๋ฅผ ๋ฐ๋ฅด๊ณ , GET, POST, PUT, DELETE์ ๊ฐ์ HTTP ๋ฉ์๋๋ฅผ ์ผ๊ด๋๊ฒ ์ฌ์ฉํฉ๋๋ค.
3. ์์ ์งํฅ (Resource-Oriented)
- ์ค๋ช : API๋ ์์(resource)์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์ด์ผ ํ๋ฉฐ, ์์์ ์ํ๋ฅผ ํํํ๊ณ ์กฐ์ํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์์: /api/v1/users์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํ, ์์ฑ, ์์ , ์ญ์ ํฉ๋๋ค.
4. RESTful ์์น (RESTful Principles)
- ์ค๋ช : RESTful API๋ HTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์กฐ์ํ๋ฉฐ, ์์์ URI๋ฅผ ํตํด ์์์ ์๋ณํฉ๋๋ค. RESTful ์์น์ ๋ฐ๋ฅด๋ฉด API๋ HTTP์ ํ์ค์ ๋ฐ๋ฆ ๋๋ค.
- ์์:
- GET /api/v1/users - ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
- POST /api/v1/users - ์ฌ์ฉ์ ์์ฑ
- GET /api/v1/users/{userId} - ํน์ ์ฌ์ฉ์ ์กฐํ
- PUT /api/v1/users/{userId} - ํน์ ์ฌ์ฉ์ ์์
- DELETE /api/v1/users/{userId} - ํน์ ์ฌ์ฉ์ ์ญ์
5. ์คํ ์ดํธ๋ฆฌ์ค (Statelessness)
- ์ค๋ช : ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ฉฐ, ์๋ฒ๋ ์์ฒญ ๊ฐ์ ์ํ๋ฅผ ์ ์งํ์ง ์์์ผ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒญ์ ํฌํจํด์ผ ํฉ๋๋ค.
- ์์: ๋ก๊ทธ์ธ ์ ๋ณด๋ ์ํ๋ ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌํ๊ณ , ์๋ฒ๋ ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
6. ๋ช ํํ ์ค๋ฅ ์ฒ๋ฆฌ (Clear Error Handling)
- ์ค๋ช : ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ช ํํ๊ณ ์ผ๊ด๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ค๋ฅ ์ฝ๋์ ๋ฉ์์ง๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์์:
- 404 Not Found - ์์ฒญํ ์์์ด ์กด์ฌํ์ง ์์
- 400 Bad Request - ์๋ชป๋ ์์ฒญ ํ๋ผ๋ฏธํฐ
- 500 Internal Server Error - ์๋ฒ ์ธก ์ค๋ฅ
7. ๋ฒ์ ๊ด๋ฆฌ (Versioning)
- ์ค๋ช : API์ ๋ฒ์ ์ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ์ฌ, API ๋ณ๊ฒฝ ์ ๊ธฐ์กด ํด๋ผ์ด์ธํธ๊ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ๋ฒ์ ๊ด๋ฆฌ๋ API์ ํธํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์์: /api/v1/resource, /api/v2/resource์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฒ์ ์ ๊ด๋ฆฌํฉ๋๋ค.
8. ๋ฌธ์ํ (Documentation)
- ์ค๋ช : API์ ์ฌ์ฉ๋ฒ, ์๋ํฌ์ธํธ, ํ๋ผ๋ฏธํฐ, ์๋ต ํ์ ๋ฑ์ ์์ธํ ๋ฌธ์ํํ์ฌ ๊ฐ๋ฐ์๋ค์ด API๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- ์์: Swagger/OpenAPI ๋ฌธ์ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ API ๋ฌธ์๋ฅผ ์๋ ์์ฑํฉ๋๋ค.
9. ๋ณด์ (Security)
- ์ค๋ช : API๋ ๋ณด์์ ๊ณ ๋ คํ์ฌ ์ธ์ฆ(Authentication)๊ณผ ๊ถํ ๋ถ์ฌ(Authorization)๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ ๋ณดํธ๋ฅผ ์ํด HTTPS๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ ํ ๊ถํ ๊ฒ์ฌ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
- ์์: JWT ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์ํํ๊ณ , HTTPS๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ก ์ ์ํธํํฉ๋๋ค.
10. ์ฑ๋ฅ ์ต์ ํ (Performance Optimization)
- ์ค๋ช : API์ ์ฑ๋ฅ์ ๊ณ ๋ คํ์ฌ ์์ฒญ๊ณผ ์๋ต์ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๊ณ , ์ ์ ํ ์บ์ฑ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
- ์์: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ฑฐ๋, ETag์ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ก์ ๊ตฌํํฉ๋๋ค.
์ด๋ฌํ ์์น๋ค์ ๋ฐ๋ฅด๋ฉด API๋ ๋ ๊ฒฌ๊ณ ํ๊ณ , ์ผ๊ด๋๋ฉฐ, ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. API ์ค๊ณ๋ ์ ์ ์๋ ์์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํ๋ฉฐ, ์ด๋ฅผ ํตํด API์ ํจ์จ์ฑ๊ณผ ํ์ง์ ๋์ผ ์ ์์ต๋๋ค.
Patch๋ ์ธ์ ์ฐ๋๊ฑฐ์ง?
์ธ์ PATCH๋ฅผ ์ฌ์ฉํ๋๊ฐ?
- ๋ถ๋ถ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๋: ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ PATCH๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ํ๋กํ์์ ์ด๋ฉ์ผ ์ฃผ์๋ ์ ํ๋ฒํธ๋ง ๋ณ๊ฒฝํ ๋ PATCH๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฆฌ์์ค์ ํน์ ํ๋๋ง ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋: ์๋ฅผ ๋ค์ด, ์ฃผ๋ฌธ ์ํ๋ฅผ "๋ฐฐ๋ฌ ์ค"์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ, ์ ์ฒด ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ PUT์ผ๋ก ์ ์กํ๋ ๋์ , PATCH๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ํ ํ๋๋ง ์์ ํ ์ ์์ต๋๋ค.
๋จ์ผ ์ฑ ์ ์์น๊ณผ PATCH
๋จ์ผ ์ฑ ์ ์์น(SRP)์ ํด๋์ค๋ ๋ฉ์๋๊ฐ ํ๋์ ์ฑ ์๋ง ๊ฐ์ง๋๋ก ์ค๊ณํ๋ ์์น์ ๋๋ค. ์๋ํฌ์ธํธ๋ ์ด ์์น์ ๋ฐ๋ฅผ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ญํ ์ ํ๋ ์๋ํฌ์ธํธ๋ ์ ์ง๋ณด์๋ ํ์ฅ์ฑ ์ธก๋ฉด์์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ PATCH ๋ฉ์๋๋ ๋จ์ผ ์ฑ ์ ์์น์ ์๋ฐํ์ง ์์ผ๋ฉฐ, ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ์คํ๋ ค ์ญํ ์ ๋ช ํํ๊ฒ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์๋ํฌ์ธํธ๋ค์ด ์์ ์ ์์ต๋๋ค:
- PATCH /orders/{id}/status: ์ฃผ๋ฌธ ์ํ๋ง ๋ณ๊ฒฝ
- PATCH /users/{id}/email: ์ด๋ฉ์ผ ์ฃผ์๋ง ๋ณ๊ฒฝ
์ด์ฒ๋ผ PATCH๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์๋ํฌ์ธํธ๊ฐ ํน์ ์์ ๋ง ์ํํ๋๋ก ์ค๊ณํ ์ ์์ต๋๋ค.
์์ฝ
- PATCH๋ ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ์ ๋ฐ์ดํธํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋จ์ผ ์ฑ ์ ์์น์ ๋ง์ถ์ด ํน์ ํ๋๋ ์์ฑ๋ง์ ์ ๋ฐ์ดํธํ๋ ์๋ํฌ์ธํธ๋ก PATCH๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํด๋ฆฐ ์ฝ๋ ์์ฑ์ ๋ถํฉํฉ๋๋ค.
- ๋ง์ฝ ๋ฆฌ์์ค์ ์ ์ฒด๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ฉด PUT์, ํน์ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด PATCH๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
PATCH /orders/{id}/status
๋จ์ผ ์ฑ ์ ์์น์ ์ ์ค์
์ด ๊ฒฝ์ฐ ์๋ํฌ์ธํธ๊ฐ ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ์ด๋ผ๋ ํ๋์ ๋ช ํํ ์ญํ
๋ค๋ฅธ ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ์์ฒญ๊ณผ ๋ช ํํ ๊ตฌ๋ถ
- ๋ช ํํ ์ญํ ๋ถ๋ด: ๊ฐ ์๋ํฌ์ธํธ๊ฐ ํน์ ์์ ๋ง์ ์ฒ๋ฆฌํ๋ฏ๋ก, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์์ง๋๋ค.
- ๋ณ๊ฒฝ์ ๋ฒ์๊ฐ ์ ํ๋จ: PATCH /orders/{id}/status ์๋ํฌ์ธํธ๋ ์ค์ง ์ฃผ๋ฌธ์ ์ํ๋ง ๋ณ๊ฒฝํ๋ฏ๋ก, ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋์ ๋ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด๋ ์๊ธฐ์น ์์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ํ์ฅ์ฑ: ์๊ฐ์ด ์ง๋๋ฉด์ API๊ฐ ํ์ฅ๋๋๋ผ๋, ๊ฐ ์๋ํฌ์ธํธ๊ฐ ๋ช ํํ ์ฑ ์์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์๋ก์ด ์๊ตฌ์ฌํญ์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ํ๋๋ฅผ ์์ ํ๋ ์๋ํฌ์ธํธ๊ฐ ํ์ํ ๋, ์๋ก์ด ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค๋ฉด ๋ฉ๋๋ค (PATCH /orders/{id}/delivery-date ๋ฑ).
๋ฐ๋ผ์ PATCH /orders/{id}/status์ ๊ฐ์ ์ค๊ณ๋ ๋จ์ผ ์ฑ ์ ์์น์ ์งํค๋ฉด์, ๋์์ PATCH ๋ฉ์๋์ ์ ์ฉ์ฑ์ ์ ์ด๋ฆฐ ์ข์ ์ ๊ทผ์ ๋๋ค.
'Today I Learned' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก์ ํธ ๋ฐํ (0) | 2024.09.03 |
---|---|
ํ๋ก์ ํธ ์์ (0) | 2024.08.23 |
Redis, Spring (0) | 2024.08.07 |
Spring Security? OAuth2 ? (0) | 2024.08.06 |
MSA, Spring Cloud (0) | 2024.08.06 |