HTTP μν μ½λλ₯Ό μ¬μ©νμ¬ API μ€λ₯λ₯Ό μ΄ν΄νκ³ ν¨κ³Όμ μΌλ‘ μ²λ¦¬νμΈμ. μ μΈκ³ κ°λ°μλ₯Ό μν΄ λͺ ννκ³ μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό μ 곡νλ κ°λ ₯νκ³ μμ μ μΈ APIλ₯Ό ꡬμΆνκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό μμ보μΈμ.
API μ€λ₯ μ²λ¦¬: HTTP μν μ½λμ λν ν¬κ΄μ μΈ κ°μ΄λ
μννΈμ¨μ΄ κ°λ° μΈκ³μμ API(Application Programming Interfaces)λ νλ μ ν리μΌμ΄μ μ μ€μΆκ° λμ΄ λ€μν μμ€ν κ°μ μνν ν΅μ λ° λ°μ΄ν° κ΅νμ κ°λ₯νκ² νμ΅λλ€. APIκ° μ μ λ 볡μ‘ν΄μ§κ³ μ μΈκ³ λΉμ¦λμ€ μ΄μμ νμμ μΈ μμκ° λλ©΄μ μ μ ν μ€λ₯ μ²λ¦¬κ° κ°μ₯ μ€μν΄μ§κ³ μμ΅λλ€. API μ€λ₯ μ²λ¦¬μ κ°μ₯ κΈ°λ³Έμ μΈ μΈ‘λ©΄ μ€ νλλ HTTP μν μ½λμ μ¬μ©μ λλ€. μ΄ κ°μ΄λλ HTTP μν μ½λμ λν ν¬κ΄μ μΈ κ°μμ μ μΈκ³ κ°λ°μλ₯Ό μν΄ λͺ ννκ³ μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό μ 곡νλ κ°λ ₯νκ³ μμ μ μΈ APIλ₯Ό ν¨κ³Όμ μΌλ‘ ꡬμΆνλ λ°©λ²μ μ 곡ν©λλ€.
HTTP μν μ½λλ 무μμ λκΉ?
HTTP μν μ½λλ ν΄λΌμ΄μΈνΈμ μμ²μ λν μλ΅μΌλ‘ μλ²κ° λ°ννλ μΈ μ리 μ½λμ λλ€. μμ²μ κ²°κ³Όμ λν μ 보λ₯Ό μ 곡νμ¬ μ±κ³΅νλμ§, μ€λ₯κ° λ°μνλμ§ λλ μΆκ° μμ μ΄ νμνμ§ μ¬λΆλ₯Ό λνλ λλ€. μ΄λ¬ν μ½λλ HTTP νλ‘ν μ½μ νμμ μΈ λΆλΆμ΄λ©° RFC 7231 λ° κΈ°ν κ΄λ ¨ RFCμμ IETF(Internet Engineering Task Force)μ μν΄ νμ€νλμμ΅λλ€.
HTTP μν μ½λλ λ€μ― κ°μ ν΄λμ€λ‘ κ·Έλ£Ήνλλ©° κ° ν΄λμ€λ μλ‘ λ€λ₯Έ λ²μ£Όμ μλ΅μ λνλ λλ€.
- 1xx (μ 보): μμ²μ΄ μμ λμ΄ μ²λ¦¬ μ€μ λλ€. μ΄λ¬ν μ½λλ API μ€λ₯ μ²λ¦¬μμ κ±°μ μ¬μ©λμ§ μμ΅λλ€.
- 2xx (μ±κ³΅): μμ²μ΄ μ±κ³΅μ μΌλ‘ μμ , μ΄ν΄ λ° μλ½λμμ΅λλ€.
- 3xx (리λλ μ ): ν΄λΌμ΄μΈνΈκ° μμ²μ μλ£νκΈ° μν΄ μΆκ° μμ μ μνν΄μΌ ν©λλ€.
- 4xx (ν΄λΌμ΄μΈνΈ μ€λ₯): μμ²μ μλͺ»λ κ΅¬λ¬Έμ΄ ν¬ν¨λμ΄ μκ±°λ μΆ©μ‘±λ μ μμ΅λλ€. μ΄λ ν΄λΌμ΄μΈνΈ μΈ‘μ μ€λ₯λ₯Ό λνλ λλ€.
- 5xx (μλ² μ€λ₯): μλ²κ° μ ν¨ν μμ²μ μ²λ¦¬νμ§ λͺ»νμ΅λλ€. μ΄λ μλ² μΈ‘μ μ€λ₯λ₯Ό λνλ λλ€.
HTTP μν μ½λκ° API μ€λ₯ μ²λ¦¬μ μ€μν μ΄μ λ 무μμ λκΉ?
HTTP μν μ½λλ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ μ΄μ λ‘ ν¨κ³Όμ μΈ API μ€λ₯ μ²λ¦¬μ μ€μν©λλ€.
- νμ€νλ ν΅μ : μλ²κ° μμ² κ²°κ³Όλ₯Ό ν΄λΌμ΄μΈνΈμ μ리λ νμ€νλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ μ¬μ©μ μ§μ μ€λ₯ λ©μμ§λ₯Ό ν΄μν νμ μμ΄ μ€λ₯λ₯Ό μ½κ² μ΄ν΄νκ³ μ²λ¦¬ν μ μμ΅λλ€.
- ν₯μλ κ°λ°μ κ²½ν: μ μ ν HTTP μν μ½λμ ν¨κ» λͺ ννκ³ μ μ΅ν μ€λ₯ λ©μμ§λ κ°λ°μ κ²½νμ ν¬κ² ν₯μμν΅λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ λ¬Έμ λ₯Ό μ μνκ² μλ³νκ³ ν΄κ²°νμ¬ κ°λ° μκ°κ³Ό μ’μ κ°μ μ€μΌ μ μμ΅λλ€.
- ν₯μλ API μμ μ±: μμΈν μ€λ₯ μ 보λ₯Ό μ 곡ν¨μΌλ‘μ¨ HTTP μν μ½λλ₯Ό ν΅ν΄ κ°λ°μλ μκΈ°μΉ μμ μν©μ μ μ νκ² μ²λ¦¬ν μ μλ λ³΄λ€ κ°λ ₯νκ³ μμ μ μΈ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.
- λλ²κΉ λ¨μν: HTTP μν μ½λλ μ€λ₯μ μΆμ²(ν΄λΌμ΄μΈνΈ μΈ‘ λλ μλ² μΈ‘)λ₯Ό λͺ ννκ² νμνμ¬ λλ²κΉ μ λ¨μνν©λλ€.
- κΈλ‘λ² μΌκ΄μ±: κΈλ‘λ² κ³ κ°μ μν APIλ₯Ό ꡬμΆν λ νμ€νλ μ€λ₯ μ½λλ μλ‘ λ€λ₯Έ μ§μ λ° μΈμ΄μμ μΌκ΄λ λμμ 보μ₯νλ λ° νμμ μ λλ€. μ΄λ κ² νλ©΄ λͺ¨νΈμ±μ νΌνκ³ μ μΈκ³ κ°λ°μκ° λ¬Έμ λ₯Ό μ½κ² μ΄ν΄νκ³ ν΄κ²°ν μ μμ΅λλ€.
μΌλ°μ μΈ HTTP μν μ½λ λ° μλ―Έ
λ€μμ API μ€λ₯ μ²λ¦¬μ μ¬μ©λλ κ°μ₯ μΌλ°μ μΈ HTTP μν μ½λ μ€ μΌλΆμ λν λΆμμ λλ€.
2xx μ±κ³΅ μ½λ
- 200 OK: μμ²μ΄ μ±κ³΅νμ΅λλ€. μ΄λ μ±κ³΅μ μΈ GET, PUT, PATCH λ° DELETE μμ²μ λν νμ€ μλ΅μ λλ€.
- 201 Created: μμ²μ΄ μ±κ³΅νκ³ μ 리μμ€κ° μμ±λμμ΅λλ€. μ΄λ μΌλ°μ μΌλ‘ μ±κ³΅μ μΈ POST μμ² νμ μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄ μ μ¬μ©μ κ³μ μ λ§λλλ€.
- 204 No Content: μμ²μ΄ μ±κ³΅νμ§λ§ λ°νν μ½ν μΈ κ° μμ΅λλ€. μ΄λ μλ΅ λ³Έλ¬Έμ΄ νμνμ§ μμ DELETE μμ²μ μμ£Ό μ¬μ©λ©λλ€.
3xx 리λλ μ μ½λ
- 301 Moved Permanently: μμ²λ 리μμ€κ° μ URLλ‘ μꡬμ μΌλ‘ μ΄λλμμ΅λλ€. ν΄λΌμ΄μΈνΈλ μ URLμ κ°λ¦¬ν€λλ‘ λ§ν¬λ₯Ό μ λ°μ΄νΈν΄μΌ ν©λλ€.
- 302 Found: μμ²λ 리μμ€κ° μΌμμ μΌλ‘ λ€λ₯Έ URLμ μμ΅λλ€. ν΄λΌμ΄μΈνΈλ ν₯ν μμ²μ λν΄ μλ URLμ κ³μ μ¬μ©ν΄μΌ ν©λλ€. μμ 리λλ μ μ μμ£Ό μ¬μ©λ©λλ€.
- 304 Not Modified: 리μμ€μ ν΄λΌμ΄μΈνΈ μΊμ λ²μ μ΄ μμ§ μ ν¨ν©λλ€. μλ²λ ν΄λΌμ΄μΈνΈμκ² μΊμλ λ²μ μ μ¬μ©νλλ‘ μ§μν©λλ€. μ΄λ κ² νλ©΄ λμνμ΄ μ μ½λκ³ μ±λ₯μ΄ ν₯μλ©λλ€.
4xx ν΄λΌμ΄μΈνΈ μ€λ₯ μ½λ
μ΄λ¬ν μ½λλ ν΄λΌμ΄μΈνΈκ° μμ²μμ μ€λ₯λ₯Ό λ°μμμΌ°μμ λνλ λλ€. ν΄λΌμ΄μΈνΈκ° μμ²μ μμ ν μ μλλ‘ λ¬΄μμ΄ μλͺ»λμλμ§ μ리λ λ° μ€μν©λλ€.
- 400 Bad Request: κ΅¬λ¬Έμ΄ μλͺ»λμκ±°λ λ§€κ°λ³μκ° μλͺ»λμ΄ μλ²μμ μμ²μ μ΄ν΄ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ νμ νλκ° λλ½λμκ±°λ μλͺ»λ λ°μ΄ν° μ νμ΄ μλ κ²½μ°μ λλ€.
- 401 Unauthorized: μμ²μ μΈμ¦μ΄ νμν©λλ€. ν΄λΌμ΄μΈνΈλ μ ν¨ν μ격 μ¦λͺ (μ: API ν€ λλ JWT ν ν°)μ μ 곡ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄ λ‘κ·ΈμΈνμ§ μκ³ λ³΄νΈλ 리μμ€μ μ‘μΈμ€νλ κ²½μ°μ λλ€.
- 403 Forbidden: ν΄λΌμ΄μΈνΈλ μΈμ¦λμμ§λ§ μμ²λ 리μμ€μ μ‘μΈμ€ν κΆνμ΄ μμ΅λλ€. μλ₯Ό λ€μ΄ κ΄λ¦¬μ μ μ© λ¦¬μμ€μ μ‘μΈμ€νλ €λ μ¬μ©μμ λλ€.
- 404 Not Found: μμ²λ 리μμ€λ₯Ό μλ²μμ μ°Ύμ μ μμ΅λλ€. μ΄λ ν΄λΌμ΄μΈνΈκ° μ‘΄μ¬νμ§ μλ URLμ μ‘μΈμ€νλ €κ³ ν λ λ°μνλ μΌλ°μ μΈ μ€λ₯μ λλ€. μλ₯Ό λ€μ΄ μλͺ»λ IDλ‘ μ¬μ©μ νλ‘νμ μ‘μΈμ€νλ κ²½μ°μ λλ€.
- 405 Method Not Allowed: μμ²λ 리μμ€μ λν΄ μμ²μ μ¬μ©λ HTTP λ©μλκ° μ§μλμ§ μμ΅λλ€. μλ₯Ό λ€μ΄ μ½κΈ° μ μ© μλν¬μΈνΈμμ POST μμ²μ μ¬μ©νλ €κ³ νλ κ²½μ°μ λλ€.
- 409 Conflict: 리μμ€μ νμ¬ μνμ μΆ©λνμ¬ μμ²μ μλ£ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ΄λ―Έ μ‘΄μ¬νλ κ³ μ μλ³μλ₯Ό κ°μ§ 리μμ€λ₯Ό λ§λ€λ €κ³ νλ κ²½μ°μ λλ€.
- 415 Unsupported Media Type: μλ²κ° μμ² λ³Έλ¬Έμ λ―Έλμ΄ μ νμ μ§μνμ§ μμ΅λλ€. μλ₯Ό λ€μ΄ XMLλ§ νμ©νλ μλν¬μΈνΈλ‘ JSON νμ΄λ‘λλ₯Ό 보λ΄λ κ²½μ°μ λλ€.
- 422 Unprocessable Entity: μμ²μ νμμ΄ μ λλ‘ κ°μΆ°μ‘μ§λ§ μλ―Έμ μ€λ₯λ‘ μΈν΄ μ²λ¦¬ν μ μμ΅λλ€. μ΄λ μ’ μ’ μ ν¨μ± κ²μ¬ μ€λ₯μ μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄ μ ν¨νμ§ μμ μ΄λ©μΌ νμ λλ 볡μ‘μ± μꡬ μ¬νμ μΆ©μ‘±νμ§ μλ λΉλ°λ²νΈκ° μλ μμμ μ μΆνλ κ²½μ°μ λλ€.
- 429 Too Many Requests: ν΄λΌμ΄μΈνΈκ° μ£Όμ΄μ§ μκ° λ΄μ λ무 λ§μ μμ²μ 보λμ΅λλ€. μ΄λ μλ μ νμ μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄ μ¬μ©μκ° μκ°λΉ μνν μ μλ API νΈμΆ μλ₯Ό μ ννλ κ²½μ°μ λλ€.
5xx μλ² μ€λ₯ μ½λ
μ΄λ¬ν μ½λλ μλ²κ° μμ²μ μ²λ¦¬νλ λμ μ€λ₯κ° λ°μνμμ λνλ λλ€. μΌλ°μ μΌλ‘ μλ² μΈ‘μ λ¬Έμ λ₯Ό λνλ΄λ©° μ‘°μ¬κ° νμν©λλ€.
- 500 Internal Server Error: μλ²μμ μκΈ°μΉ μμ μ‘°κ±΄μ΄ λ°μνμμ λνλ΄λ μΌλ°μ μΈ μ€λ₯ λ©μμ§μ λλ€. κ°λ₯ν κ²½μ° λ ꡬ체μ μΈ μ€λ₯ λ©μμ§λ₯Ό μ 곡νμ¬ μ΄λ₯Ό νΌν΄μΌ ν©λλ€.
- 502 Bad Gateway: κ²μ΄νΈμ¨μ΄ λλ νλ‘μ μν μ νλ μλ²κ° λ€λ₯Έ μλ²μμ μλͺ»λ μλ΅μ λ°μμ΅λλ€. μ΄λ μ’ μ’ μ μ€νΈλ¦Ό μλ²μ λ¬Έμ κ° μμμ λνλ λλ€.
- 503 Service Unavailable: μλ²κ° μΌμμ μΈ κ³ΌλΆν λλ μ μ§ κ΄λ¦¬λ‘ μΈν΄ νμ¬ μμ²μ μ²λ¦¬ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μμ λ μ μ§ κ΄λ¦¬ λλ κ°μμ€λ¬μ΄ νΈλν½ κΈμ¦ λμμ λλ€.
- 504 Gateway Timeout: κ²μ΄νΈμ¨μ΄ λλ νλ‘μ μν μ νλ μλ²κ° λ€λ₯Έ μλ²μμ μ μμ μλ΅μ λ°μ§ λͺ»νμ΅λλ€. μ΄λ μ μ€νΈλ¦Ό μλ²μ μκ° μ΄κ³Ό λ¬Έμ λ₯Ό λνλ λλ€.
APIμμ HTTP μν μ½λλ₯Ό ꡬννκΈ° μν λͺ¨λ² μ¬λ‘
APIμμ HTTP μν μ½λλ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€.
- μ¬λ°λ₯Έ μ½λ μ ν: μ€λ₯μ νΉμ±μ μ ννκ² λ°μνλ κ°μ₯ μ μ ν HTTP μν μ½λλ₯Ό μ μ€νκ² μ νν©λλ€. λ ꡬ체μ μΈ μ½λλ₯Ό μ¬μ©ν μ μλ κ²½μ° 500 Internal Server Errorμ κ°μ μΌλ° μ½λλ₯Ό μ¬μ©νμ§ λ§μμμ€.
- μ μ΅ν μ€λ₯ λ©μμ§ μ 곡: κ° HTTP μν μ½λμ ν¨κ» μ€λ₯μ μμΈμ μ€λͺ νκ³ μ΄λ₯Ό ν΄κ²°νλ λ°©λ²μ μ μνλ λͺ ννκ³ κ°κ²°ν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€. μ€λ₯ λ©μμ§λ μ¬λμ΄ μ½μ μ μμ΄μΌ νλ©° λ€μν λ°°κ²½μ κ°λ°μκ° μ½κ² μ΄ν΄ν μ μμ΄μΌ ν©λλ€.
- μΌκ΄λ μ€λ₯ νμ μ¬μ©: HTTP μν μ½λ, μ€λ₯ λ©μμ§ λ° κ΄λ ¨ μ€λ₯ μΈλΆ μ 보λ₯Ό ν¬ν¨νμ¬ μ€λ₯ μλ΅μ λν μΌκ΄λ νμμ μ€μ ν©λλ€. JSONμ API μλ΅μ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ νμμ λλ€.
- μ€λ₯ λ‘κΉ : HTTP μν μ½λ, μ€λ₯ λ©μμ§, μμ² μΈλΆ μ 보 λ° κ΄λ ¨ 컨ν μ€νΈ μ 보λ₯Ό ν¬ν¨νμ¬ λͺ¨λ API μ€λ₯λ₯Ό μλ² μΈ‘μ κΈ°λ‘ν©λλ€. μ΄λ κ² νλ©΄ λ¬Έμ λ₯Ό λ 빨리 μλ³νκ³ ν΄κ²°νλ λ° λμμ΄ λ©λλ€.
- μμΈλ₯Ό μ μμ μΌλ‘ μ²λ¦¬: μκΈ°μΉ μμ μ€λ₯λ‘ μΈν΄ μ ν리μΌμ΄μ μ΄ μΆ©λνμ§ μλλ‘ μ½λμ μ μ ν μμΈ μ²λ¦¬λ₯Ό ꡬνν©λλ€. μμΈλ₯Ό ν¬μ°©νκ³ μ μ ν HTTP μν μ½λμ μ€λ₯ λ©μμ§λ₯Ό ν΄λΌμ΄μΈνΈμ λ°νν©λλ€.
- API λ¬Έμν: APIκ° λ°νν μ μλ λͺ¨λ HTTP μν μ½λ λ° μ€λ₯ λ©μμ§λ₯Ό λͺ ννκ² λ¬Έμνν©λλ€. μ΄λ κ² νλ©΄ κ°λ°μκ° μ€λ₯λ₯Ό μ²λ¦¬νκ³ λ³΄λ€ κ°λ ₯ν ν΅ν©μ ꡬμΆνλ λ° λμμ΄ λ©λλ€. Swagger/OpenAPIμ κ°μ λꡬλ₯Ό μ¬μ©νλ©΄ API λ¬Έμλ₯Ό μλμΌλ‘ μμ±ν μ μμ΅λλ€.
- μλ μ ν ꡬν: μλ μ νμ ꡬννμ¬ APIλ₯Ό μ μ©μΌλ‘λΆν° 보νΈν©λλ€. ν΄λΌμ΄μΈνΈκ° μλ μ νμ μ΄κ³Όνλ©΄ 429 Too Many Requests μ€λ₯λ₯Ό λ°νν©λλ€. μ΄λ κ² νλ©΄ APIκ° λͺ¨λ μ¬μ©μμκ² κ³μ μ¬μ© κ°λ₯νκ² μ μ§νλ λ° λμμ΄ λ©λλ€.
- API λͺ¨λν°λ§: μ€λ₯ λ° μ±λ₯ λ¬Έμ μ λν΄ APIλ₯Ό λͺ¨λν°λ§ν©λλ€. μ€λ₯κ° λ°μνμ λ μλ¦Όμ λ°λλ‘ κ²½κ³ λ₯Ό μ€μ νμ¬ μ μνκ² μ‘°μ¬νκ³ ν΄κ²°ν μ μμ΅λλ€. Datadog, New Relic λ° Prometheusμ κ°μ λꡬλ₯Ό API λͺ¨λν°λ§μ μ¬μ©ν μ μμ΅λλ€.
- νμ§ν(κ΅μ ν) κ³ λ €: κΈλ‘λ² κ³ κ°μ μν APIλ₯Ό μ 곡νλ κ²½μ° μ€λ₯ λ©μμ§λ₯Ό λ€λ₯Έ μΈμ΄λ‘ νμ§ννλ κ²μ κ³ λ €νμμμ€. μ΄λ κ² νλ©΄ μμ΄κ° μλ μ¬μ©μμ κ°λ°μ κ²½νμ΄ ν¬κ² ν₯μλ©λλ€. λ²μ μλΉμ€ λλ 리μμ€ λ²λ€μ μ¬μ©νμ¬ λ²μμ κ΄λ¦¬ν μ μμ΅λλ€.
APIμμ HTTP μν μ½λμ μλ μ
λ€μμ λ€μν API μλ리μ€μμ HTTP μν μ½λλ₯Ό μ¬μ©νλ λ°©λ²μ λν λͺ κ°μ§ μ€μ μμ λλ€.
μ 1: μ¬μ©μ μΈμ¦
ν΄λΌμ΄μΈνΈκ° μλͺ»λ μ격 μ¦λͺ μ μ¬μ©νμ¬ APIλ‘ μΈμ¦μ μλν©λλ€.
μμ²:
POST /auth/login
Content-Type: application/json
{
"username": "invalid_user",
"password": "wrong_password"
}
μλ΅:
HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
"error": {
"code": "invalid_credentials",
"message": "Invalid username or password"
}
}
μ΄ μμ μμ μλ²λ 401 Unauthorized μν μ½λλ₯Ό λ°ννμ¬ ν΄λΌμ΄μΈνΈκ° μΈμ¦μ μ€ν¨νμμ λνλ λλ€. μλ΅ λ³Έλ¬Έμλ μ€λ₯ μ½λμ μ€λ₯μ μμΈμ μ€λͺ νλ λ©μμ§κ° ν¬ν¨λ JSON κ°μ²΄κ° ν¬ν¨λμ΄ μμ΅λλ€.
μ 2: 리μμ€ μ°Ύμ μ μμ
ν΄λΌμ΄μΈνΈκ° μ‘΄μ¬νμ§ μλ 리μμ€λ₯Ό κ²μνλ €κ³ μλν©λλ€.
μμ²:
GET /users/12345
μλ΅:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"code": "resource_not_found",
"message": "User with ID 12345 not found"
}
}
μ΄ μμ μμ μλ²λ 404 Not Found μν μ½λλ₯Ό λ°ννμ¬ μμ²λ 리μμ€κ° μμμ λνλ λλ€. μλ΅ λ³Έλ¬Έμλ μ€λ₯ μ½λμ μ§μ λ IDμ μ¬μ©μλ₯Ό μ°Ύμ μ μμμ μ€λͺ νλ λ©μμ§κ° ν¬ν¨λ JSON κ°μ²΄κ° ν¬ν¨λμ΄ μμ΅λλ€.
μ 3: μ ν¨μ± κ²μ¬ μ€λ₯
ν΄λΌμ΄μΈνΈκ° μλͺ»λ λ°μ΄ν°λ‘ μ 리μμ€λ₯Ό λ§λ€λ €κ³ μλν©λλ€.
μμ²:
POST /users
Content-Type: application/json
{
"name": "",
"email": "invalid_email"
}
μλ΅:
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
"errors": [
{
"field": "name",
"code": "required",
"message": "Name is required"
},
{
"field": "email",
"code": "invalid_format",
"message": "Email is not a valid email address"
}
]
}
μ΄ μμ μμ μλ²λ 422 Unprocessable Entity μν μ½λλ₯Ό λ°ννμ¬ μμ²μ νμμ΄ μ λλ‘ κ°μΆ°μ‘μ§λ§ μ ν¨μ± κ²μ¬ μ€λ₯λ‘ μΈν΄ μ²λ¦¬ν μ μμμ λνλ λλ€. μλ΅ λ³Έλ¬Έμλ μ€λ₯λ₯Ό μΌμΌν¨ νλ, μ€λ₯ μ½λ λ° μ€λ₯λ₯Ό μ€λͺ νλ λ©μμ§κ° ν¬ν¨λ μ€λ₯ λͺ©λ‘μ΄ μλ JSON κ°μ²΄κ° ν¬ν¨λμ΄ μμ΅λλ€.
HTTP μν μ½λ λ° API 보μ
HTTP μν μ½λλ₯Ό μ μ νκ² μ¬μ©νλ©΄ API 보μμλ κΈ°μ¬ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ§λμΉκ² μμΈν μ€λ₯ λ©μμ§λ₯Ό νΌνλ©΄ 곡격μκ° μμ€ν μ λν λ―Όκ°ν μ 보λ₯Ό μ»λ κ²μ λ°©μ§ν μ μμ΅λλ€. μΈμ¦ λ° κΆν λΆμ¬ μ€λ₯λ₯Ό μ²λ¦¬ν λ κ³μ μ΄κ±° λλ κΈ°ν 곡격μ λ°©μ§νκΈ° μν΄ μΌκ΄λκ³ λ ΈμΆλμ§ μλ μ€λ₯ λ©μμ§λ₯Ό λ°ννλ κ²μ΄ μ€μν©λλ€.
νμ€ HTTP μν μ½λ μ΄μ: μ¬μ©μ μ§μ μ€λ₯ μ½λ
νμ€ HTTP μν μ½λλ κ΄λ²μν μλ리μ€λ₯Ό λ€λ£¨μ§λ§ μ€λ₯μ λν λ³΄λ€ κ΅¬μ²΄μ μΈ μ 보λ₯Ό μ 곡νκΈ° μν΄ μ¬μ©μ μ§μ μ€λ₯ μ½λλ₯Ό μ μν΄μΌ νλ κ²½μ°κ° μμ μ μμ΅λλ€. μ¬μ©μ μ§μ μ€λ₯ μ½λλ₯Ό μ¬μ©ν λλ νμ€ HTTP μν μ½λμ ν¨κ» μλ΅ λ³Έλ¬Έμ ν¬ν¨νλ κ²μ΄ μ’μ΅λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈλ μ€λ₯ μ νμ μ½κ² μλ³νκ³ μ μ ν μ‘°μΉλ₯Ό μ·¨ν μ μμ΅λλ€.
API μ€λ₯ μ²λ¦¬λ₯Ό ν μ€νΈνκΈ° μν λꡬ
λ€μκ³Ό κ°μ μ¬λ¬ λꡬλ₯Ό μ¬μ©νμ¬ API μ€λ₯ μ²λ¦¬λ₯Ό ν μ€νΈνκ³ μ ν¨μ±μ κ²μ¬ν μ μμ΅λλ€.
- Postman: APIμ μμ²μ 보λ΄κ³ HTTP μν μ½λ λ° μ€λ₯ λ©μμ§λ₯Ό ν¬ν¨ν μλ΅μ κ²μ¬ν μ μλ μΈκΈ° μλ API ν΄λΌμ΄μΈνΈμ λλ€.
- Swagger Inspector: OpenAPI μ μμ λν΄ APIλ₯Ό ν μ€νΈνκ³ μ€λ₯ μ²λ¦¬μ λΆμΌμΉλ₯Ό μλ³ν μ μλ λꡬμ λλ€.
- μλνλ ν μ€νΈ νλ μμν¬: Jest, Mocha λλ Pytestμ κ°μ μλνλ ν μ€νΈ νλ μμν¬λ₯Ό μ¬μ©νμ¬ API μ€λ₯ μ²λ¦¬μ μ νμ±μ νμΈνλ ν μ€νΈλ₯Ό μμ±ν©λλ€.
κ²°λ‘
HTTP μν μ½λλ API μ€λ₯ μ²λ¦¬μ κΈ°λ³Έμ μΈ μΈ‘λ©΄μ΄λ©° μ μΈκ³ μ¬μ©μλ₯Ό μν κ°λ ₯νκ³ μμ μ μ΄λ©° μ¬μ©μ μΉνμ μΈ APIλ₯Ό ꡬμΆνλ λ° νμμ μ λλ€. μλ‘ λ€λ₯Έ HTTP μν μ½λλ₯Ό μ΄ν΄νκ³ μ΄λ₯Ό ꡬννκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ κ°λ°μ κ²½νμ ν¬κ² κ°μ νκ³ λλ²κΉ μ λ¨μννλ©° APIμ μ λ°μ μΈ νμ§μ ν₯μμν¬ μ μμ΅λλ€. μ¬λ°λ₯Έ μ½λλ₯Ό μ ννκ³ , μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό μ 곡νκ³ , μΌκ΄λ μ€λ₯ νμμ μ¬μ©νκ³ , APIλ₯Ό μ² μ ν λ¬Έμννλ κ²μ μμ§ λ§μμμ€. κ·Έλ κ² νλ©΄ μ¬μ©νκΈ° μ½κ³ , μμ μ μ΄λ©°, λμμμ΄ μ§ννλ λμ§νΈ νκ²½μ κ³Όμ λ₯Ό λ μ μ²λ¦¬ν μ μλ APIλ₯Ό λ§λ€ μ μμ΅λλ€.