κΈλ‘λ² κ°λ°μλ₯Ό μν RESTful API μ€κ³ μμΉ λ° λͺ¨λ² μ¬λ‘μ λν μ’ ν© κ°μ΄λ. μ μΈκ³μ μ κ·Όμ±, νμ₯μ±, μ μ§λ³΄μμ±μ μ€μ μ λ‘λλ€.
RESTful API μ€κ³: κΈλ‘λ² μ¬μ©μλ₯Ό μν λͺ¨λ² μ¬λ‘
μ€λλ κ³Ό κ°μ΄ μνΈ μ°κ²°λ μΈμμμ API(μ ν리μΌμ΄μ νλ‘κ·Έλλ° μΈν°νμ΄μ€)λ νλ μννΈμ¨μ΄ κ°λ°μ μ€μΆμ λλ€. νΉν RESTful APIλ λ¨μμ±, νμ₯μ±, μνΈ μ΄μ©μ± λλΆμ μΉ μλΉμ€ ꡬμΆμ νμ€μ΄ λμμ΅λλ€. μ΄ κ°μ΄λλ κΈλ‘λ² μ κ·Όμ±, μ μ§λ³΄μμ±, 보μμ μ€μ μ λ RESTful API μ€κ³λ₯Ό μν ν¬κ΄μ μΈ λͺ¨λ² μ¬λ‘λ₯Ό μ 곡ν©λλ€.
REST μμΉ μ΄ν΄νκΈ°
REST(Representational State Transfer)λ μΉ μλΉμ€λ₯Ό λ§λ€κΈ° μν΄ μ¬μ©λλ μ μ½ μ‘°κ±΄ μ§ν©μ μ μνλ μν€ν μ² μ€νμΌμ λλ€. ν¨κ³Όμ μΈ RESTful APIλ₯Ό μ€κ³νλ €λ©΄ μ΄λ¬ν μμΉμ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€:
- ν΄λΌμ΄μΈνΈ-μλ²: ν΄λΌμ΄μΈνΈμ μλ²λ λΆλ¦¬λ κ°μ²΄μ΄λ©° λ 립μ μΌλ‘ λ°μ ν μ μμ΅λλ€. ν΄λΌμ΄μΈνΈλ μμ²μ μμνκ³ μλ²λ μ΄λ₯Ό μ²λ¦¬νμ¬ μλ΅μ λ°νν©λλ€.
- 무μν(Stateless): μλ²λ μμ² κ°μ ν΄λΌμ΄μΈνΈ μνλ₯Ό μ μ₯νμ§ μμ΅λλ€. ν΄λΌμ΄μΈνΈμ κ° μμ²μλ μμ²μ μ΄ν΄νκ³ μ²λ¦¬νλ λ° νμν λͺ¨λ μ λ³΄κ° ν¬ν¨λ©λλ€. μ΄λ νμ₯μ±κ³Ό μ λ’°μ±μ ν₯μμν΅λλ€.
- μΊμ κ°λ₯(Cacheable): μλ΅μ μΊμ κ°λ₯ λλ μΊμ λΆκ°λ₯μΌλ‘ λͺ μμ μΌλ‘ νμλμ΄μΌ ν©λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈμ μ€κ°μλ μλ΅μ μΊμνμ¬ μ±λ₯μ κ°μ νκ³ μλ² λΆνλ₯Ό μ€μΌ μ μμ΅λλ€.
- κ³μΈ΅νλ μμ€ν (Layered System): ν΄λΌμ΄μΈνΈλ μΌλ°μ μΌλ‘ μ΅μ’ μλ²μ μ§μ μ°κ²°λμ΄ μλμ§, μλλ©΄ μ€κ°μ μλ μ€κ° μλ²μ μ°κ²°λμ΄ μλμ§ μ μ μμ΅λλ€. μ€κ° μλ²λ λ‘λ λ°Έλ°μ±μ νμ±ννκ³ κ³΅μ μΊμλ₯Ό μ 곡νμ¬ μμ€ν νμ₯μ±μ ν₯μμν¬ μ μμ΅λλ€.
- μ½λ μ¨λ맨λ(μ ν μ¬ν): μλ²λ μ νμ μΌλ‘ ν΄λΌμ΄μΈνΈμ μ€ν κ°λ₯ν μ½λλ₯Ό μ 곡νμ¬ ν΄λΌμ΄μΈνΈ κΈ°λ₯μ νμ₯ν μ μμ΅λλ€. μ΄λ λ μΌλ°μ μ΄μ§λ§ νΉμ μλ리μ€μμ μ μ©ν μ μμ΅λλ€.
- ν΅ν© μΈν°νμ΄μ€(Uniform Interface): μ΄λ RESTμ ν΅μ¬ μμΉμ΄λ©° μ¬λ¬ νμ μ μ½ μ‘°κ±΄μ ν¬ν¨ν©λλ€:
- 리μμ€ μλ³: κ° λ¦¬μμ€λ κ³ μ ν URI(Uniform Resource Identifier)λ₯Ό μ¬μ©νμ¬ μλ³ν μ μμ΄μΌ ν©λλ€.
- ννμ ν΅ν 리μμ€ μ‘°μ: ν΄λΌμ΄μΈνΈλ μλ²μ νν(μ: JSON, XML)μ κ΅ννμ¬ λ¦¬μμ€λ₯Ό μ‘°μν©λλ€.
- μ체 μμ μ λ©μμ§: κ° λ©μμ§μλ λ©μμ§ μ²λ¦¬ λ°©λ²μ μ€λͺ νκΈ°μ μΆ©λΆν μ λ³΄κ° ν¬ν¨λμ΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, Content-Type ν€λλ λ©μμ§ λ³Έλ¬Έμ νμμ λνλ λλ€.
- μ ν리μΌμ΄μ μνμ μμ§μΌλ‘μμ νμ΄νΌλ―Έλμ΄(HATEOAS): ν΄λΌμ΄μΈνΈλ μλ΅μ μ 곡λ νμ΄νΌλ§ν¬λ₯Ό μ¬μ©νμ¬ APIλ₯Ό νμν΄μΌ ν©λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈλ₯Ό μμμν€μ§ μκ³ APIλ₯Ό λ°μ μν¬ μ μμ΅λλ€. νμ μ격νκ² μ μ©λλ κ²μ μλμ§λ§ HATEOASλ λμ¨ν κ²°ν©κ³Ό μ§ν κ°λ₯μ±μ μ΄μ§ν©λλ€.
RESTful 리μμ€ μ€κ³
리μμ€λ RESTful APIμ ν΅μ¬ μΆμνμ λλ€. 리μμ€λ APIκ° λ ΈμΆνκ³ μ‘°μνλ λ°μ΄ν°λ₯Ό λνλ λλ€. λ€μμ RESTful 리μμ€ μ€κ³λ₯Ό μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ λλ€:
1. λμ¬κ° μλ λͺ μ¬ μ¬μ©
리μμ€λ λμ¬κ° μλ λͺ
μ¬λ₯Ό μ¬μ©νμ¬ μ΄λ¦μ μ§μ ν΄μΌ ν©λλ€. μ΄λ 리μμ€κ° μμ
μ΄ μλ λ°μ΄ν° μν°ν°λΌλ μ¬μ€μ λ°μν©λλ€. μλ₯Ό λ€μ΄, /getCustomers λμ /customersλ₯Ό μ¬μ©νμΈμ.
μμ:
λμ μ:
/getUser?id=123
μ¬μ©νμΈμ:
/users/123
2. 볡μ λͺ μ¬ μ¬μ©
리μμ€ μ»¬λ μ μλ 볡μ λͺ μ¬λ₯Ό μ¬μ©νμΈμ. μ΄λ μΌκ΄μ±κ³Ό λͺ νμ±μ λμ λλ€.
μμ:
μ¬μ©νμΈμ:
/products
λμ μ:
/product
3. κ³μΈ΅μ 리μμ€ κ΅¬μ‘° μ¬μ©
κ³μΈ΅μ 리μμ€ κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ λ¦¬μμ€ κ°μ κ΄κ³λ₯Ό λνλ λλ€. μ΄λ APIλ₯Ό λ μ§κ΄μ μ΄κ³ νμνκΈ° μ½κ² λ§λλλ€.
μμ:
/customers/{customer_id}/orders
μ΄λ νΉμ κ³ κ°μ μν μ£Όλ¬Έ 컬λ μ μ λνλ λλ€.
4. 리μμ€ URIλ₯Ό μ§§κ³ μλ―Έ μκ² μ μ§
μ§§κ³ μλ―Έ μλ URIλ μ΄ν΄νκ³ κΈ°μ΅νκΈ° λ μ½μ΅λλ€. ꡬ문 λΆμνκΈ° μ΄λ €μ΄ κΈΈκ³ λ³΅μ‘ν URIλ₯Ό νΌνμΈμ.
5. μΌκ΄λ μ΄λ¦ κ·μΉ μ¬μ©
리μμ€μ λν μΌκ΄λ μ΄λ¦ κ·μΉμ μ€μ νκ³ API μ 체μμ μ΄λ₯Ό μ€μνμΈμ. μ΄λ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ ν₯μμν΅λλ€. νμ¬ μ 체μ μ€νμΌ κ°μ΄λλ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
HTTP λ©μλ: APIμ λμ¬
HTTP λ©μλλ 리μμ€μ λν΄ μνν μ μλ μμ μ μ μν©λλ€. RESTful APIλ₯Ό ꡬμΆνλ €λ©΄ κ° μμ μ μ¬λ°λ₯Έ HTTP λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
- GET: 리μμ€ λλ 리μμ€ μ»¬λ μ μ κ²μν©λλ€. GET μμ²μ μμ ν΄μΌ νλ©°(μ¦, 리μμ€λ₯Ό μμ ν΄μλ μ λ¨) λ©±λ±μ±(idempotent)μ κ°μ ΈμΌ ν©λλ€(μ¦, μ¬λ¬ λμΌν μμ²μ΄ λ¨μΌ μμ²κ³Ό λμΌν ν¨κ³Όλ₯Ό κ°μ ΈμΌ ν¨).
- POST: μ 리μμ€λ₯Ό μμ±ν©λλ€. POST μμ²μ μΌλ°μ μΌλ‘ μ²λ¦¬ν λ°μ΄ν°λ₯Ό μλ²μ μ μΆνλ λ° μ¬μ©λ©λλ€.
- PUT: κΈ°μ‘΄ 리μμ€λ₯Ό μ λ°μ΄νΈν©λλ€. PUT μμ²μ μ 체 리μμ€λ₯Ό μ ννμΌλ‘ λ체ν©λλ€.
- PATCH: κΈ°μ‘΄ 리μμ€λ₯Ό λΆλΆμ μΌλ‘ μ λ°μ΄νΈν©λλ€. PATCH μμ²μ 리μμ€μ νΉμ νλλ§ μμ ν©λλ€.
- DELETE: 리μμ€λ₯Ό μμ ν©λλ€.
μμ:
μ κ³ κ°μ μμ±νλ €λ©΄:
POST /customers
κ³ κ°μ κ²μνλ €λ©΄:
GET /customers/{customer_id}
κ³ κ°μ μ λ°μ΄νΈνλ €λ©΄:
PUT /customers/{customer_id}
κ³ κ°μ λΆλΆμ μΌλ‘ μ λ°μ΄νΈνλ €λ©΄:
PATCH /customers/{customer_id}
κ³ κ°μ μμ νλ €λ©΄:
DELETE /customers/{customer_id}
HTTP μν μ½λ: κ²°κ³Ό μ λ¬
HTTP μν μ½λλ μμ² κ²°κ³Όλ₯Ό ν΄λΌμ΄μΈνΈμ μ λ¬νλ λ° μ¬μ©λ©λλ€. λͺ ννκ³ μ μ΅ν νΌλλ°±μ μ 곡νλ €λ©΄ μ¬λ°λ₯Έ μν μ½λλ₯Ό μ¬μ©νλ κ²μ΄ νμμ μ λλ€.
κ°μ₯ μΌλ°μ μΈ HTTP μν μ½λλ λ€μκ³Ό κ°μ΅λλ€:
- 200 OK: μμ²μ΄ μ±κ³΅νμ΅λλ€.
- 201 Created: μ 리μμ€κ° μ±κ³΅μ μΌλ‘ μμ±λμμ΅λλ€.
- 204 No Content: μμ²μ μ±κ³΅νμ§λ§ λ°νν μ½ν μΈ κ° μμ΅λλ€.
- 400 Bad Request: μμ²μ΄ μλͺ»λμμ΅λλ€. λ§€κ°λ³μ λλ½, μλͺ»λ λ°μ΄ν° λλ κΈ°ν μ€λ₯ λλ¬ΈμΌ μ μμ΅λλ€.
- 401 Unauthorized: ν΄λΌμ΄μΈνΈκ° 리μμ€μ μ‘μΈμ€ν κΆνμ΄ μμ΅λλ€. μ΄λ μΌλ°μ μΌλ‘ ν΄λΌμ΄μΈνΈκ° μΈμ¦ν΄μΌ ν¨μ μλ―Έν©λλ€.
- 403 Forbidden: ν΄λΌμ΄μΈνΈκ° μΈμ¦λμμ§λ§ 리μμ€μ μ‘μΈμ€ν κΆνμ΄ μμ΅λλ€.
- 404 Not Found: 리μμ€λ₯Ό μ°Ύμ μ μμ΅λλ€.
- 405 Method Not Allowed: μμ² λΌμΈμ μ§μ λ λ©μλλ μμ² URIλ‘ μλ³λ 리μμ€μ λν΄ νμ©λμ§ μμ΅λλ€.
- 500 Internal Server Error: μλ²μμ μκΈ°μΉ μμ μ€λ₯κ° λ°μνμ΅λλ€.
μμ:
리μμ€κ° μ±κ³΅μ μΌλ‘ μμ±λλ©΄ μλ²λ 201 Created μν μ½λμ ν¨κ» μ 리μμ€μ URIλ₯Ό μ§μ νλ Location ν€λλ₯Ό λ°νν΄μΌ ν©λλ€.
λ°μ΄ν° νμ: μ¬λ°λ₯Έ νν λ°©μ μ ν
RESTful APIλ ννμ μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈμ μλ² κ°μ λ°μ΄ν°λ₯Ό κ΅νν©λλ€. JSON(JavaScript Object Notation)μ λ¨μμ±, κ°λ μ±, νλ‘κ·Έλλ° μΈμ΄ μ λ°μ κ±ΈμΉ νλμ μ§μ λλΆμ RESTful APIμμ κ°μ₯ μΈκΈ° μλ λ°μ΄ν° νμμ λλ€. XML(Extensible Markup Language)λ μΌλ°μ μΈ μ΅μ μ΄μ§λ§ μΌλ°μ μΌλ‘ JSONλ³΄λ€ λ μ₯ν©νκ³ λ³΅μ‘ν κ²μΌλ‘ κ°μ£Όλ©λλ€.
μ±λ₯κ³Ό λ°μ΄ν° μ§λ ¬ν ν¨μ¨μ±μ΄ μ€μν νΉμ μ¬μ© μ¬λ‘μλ νλ‘ν μ½ λ²νΌ(protobuf) λ° Apache Avroμ κ°μ λ€λ₯Έ λ°μ΄ν° νμμ μ¬μ©ν μ μμ΅λλ€.
λͺ¨λ² μ¬λ‘:
- λ€λ₯Έ κ²μ μ¬μ©ν΄μΌ ν κ°λ ₯ν μ΄μ κ° μλ ν JSONμ κΈ°λ³Έ λ°μ΄ν° νμμΌλ‘ μ¬μ©νμΈμ.
Content-Typeν€λλ₯Ό μ¬μ©νμ¬ μμ² λ° μλ΅ λ³Έλ¬Έμ νμμ μ§μ νμΈμ.- νμν κ²½μ° μ¬λ¬ λ°μ΄ν° νμμ μ§μνμΈμ. μ½ν
μΈ νμ(
Acceptν€λ)μ μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈκ° μ νΈνλ λ°μ΄ν° νμμ μ§μ ν μ μλλ‘ νμΈμ.
API λ²μ κ΄λ¦¬: λ³κ²½ μ¬ν κ΄λ¦¬
APIλ μκ°μ΄ μ§λ¨μ λ°λΌ λ°μ ν©λλ€. μλ‘μ΄ κΈ°λ₯μ΄ μΆκ°λκ³ , λ²κ·Έκ° μμ λλ©°, κΈ°μ‘΄ κΈ°λ₯μ΄ λ³κ²½λκ±°λ μ κ±°λ μ μμ΅λλ€. API λ²μ κ΄λ¦¬λ κΈ°μ‘΄ ν΄λΌμ΄μΈνΈλ₯Ό μμμν€μ§ μκ³ μ΄λ¬ν λ³κ²½ μ¬νμ κ΄λ¦¬νλ λ©μ»€λμ¦μ λλ€.
API λ²μ κ΄λ¦¬μλ λͺ κ°μ§ μΌλ°μ μΈ μ κ·Ό λ°©μμ΄ μμ΅λλ€:
- URI λ²μ κ΄λ¦¬: URIμ API λ²μ μ ν¬ν¨ν©λλ€. μ:
/v1/customers,/v2/customers. - ν€λ λ²μ κ΄λ¦¬: μ¬μ©μ μ§μ HTTP ν€λλ₯Ό μ¬μ©νμ¬ API λ²μ μ μ§μ ν©λλ€. μ:
X-API-Version: 1. - λ―Έλμ΄ νμ
λ²μ κ΄λ¦¬: μ¬μ©μ μ§μ λ―Έλμ΄ νμ
μ μ¬μ©νμ¬ API λ²μ μ μ§μ ν©λλ€. μ:
Accept: application/vnd.example.customer.v1+json.
λͺ¨λ² μ¬λ‘:
- κ°μ₯ κ°λ¨νκ³ λ리 μ΄ν΄λλ μ κ·Ό λ°©μμΈ URI λ²μ κ΄λ¦¬λ₯Ό μ¬μ©νμΈμ.
- μ€λλ API λ²μ μ μ μ§μ μΌλ‘ μ¬μ© μ€λ¨νμΈμ. ν΄λΌμ΄μΈνΈλ₯Ό μν΄ λͺ νν λ¬Έμμ λ§μ΄κ·Έλ μ΄μ κ°μ΄λλ₯Ό μ 곡νμΈμ.
- κ°λ₯νλ©΄ μΈμ λ μ§ νΈνμ±μ΄ κΉ¨μ§λ λ³κ²½(breaking change)μ νΌνμΈμ. νΈνμ±μ΄ κΉ¨μ§λ λ³κ²½μ΄ νμν κ²½μ° μ API λ²μ μ λμ νμΈμ.
API 보μ: λ°μ΄ν° 보νΈ
API 보μμ λ―Όκ°ν λ°μ΄ν°λ₯Ό 보νΈνκ³ λ¬΄λ¨ μ‘μΈμ€λ₯Ό λ°©μ§νλ λ° λ§€μ° μ€μν©λλ€. λ€μμ RESTful API 보μμ μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ λλ€:
- μΈμ¦: ν΄λΌμ΄μΈνΈμ μ μμ νμΈν©λλ€. μΌλ°μ μΈ μΈμ¦ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€:
- κΈ°λ³Έ μΈμ¦: κ°λ¨νμ§λ§ μμ νμ§ μμ΅λλ€. HTTPSλ₯Ό ν΅ν΄μλ§ μ¬μ©ν΄μΌ ν©λλ€.
- API ν€: κ° ν΄λΌμ΄μΈνΈμ ν λΉλ κ³ μ ν€μ λλ€. μ¬μ©λμ μΆμ νκ³ μλ μ νμ μ μ©νλ λ° μ¬μ©ν μ μμ΅λλ€.
- OAuth 2.0: μμλ κΆν λΆμ¬λ₯Ό μν νμ€ νλ‘ν μ½μ λλ€. ν΄λΌμ΄μΈνΈκ° μ¬μ©μμ μ격 μ¦λͺ μμ΄ μ¬μ©μλ₯Ό λμ νμ¬ λ¦¬μμ€μ μ‘μΈμ€ν μ μλλ‘ νμ©ν©λλ€.
- JSON μΉ ν ν°(JWT): λΉμ¬μ κ°μ μ 보λ₯Ό JSON κ°μ²΄λ‘ μμ νκ² μ μ‘νκΈ° μν κ°κ²°νκ³ μ체 ν¬ν¨λ λ°©λ²μ λλ€.
- κΆν λΆμ¬: ν΄λΌμ΄μΈνΈμ μ μ λ° κΆνμ λ°λΌ 리μμ€μ λν μ‘μΈμ€λ₯Ό μ μ΄ν©λλ€. μν κΈ°λ° μ κ·Ό μ μ΄(RBAC)κ° μΌλ°μ μΈ μ κ·Ό λ°©μμ λλ€.
- HTTPS: HTTPSλ₯Ό μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈμ μλ² κ°μ λͺ¨λ ν΅μ μ μνΈνν©λλ€. μ΄λ λμ² λ° λ³μ‘°λ‘λΆν° λ°μ΄ν°λ₯Ό 보νΈν©λλ€.
- μ λ ₯ μ ν¨μ± κ²μ¬: λͺ¨λ μ λ ₯ λ°μ΄ν°λ₯Ό κ²μ¦νμ¬ μ£Όμ 곡격 λ° κΈ°ν 보μ μ·¨μ½μ μ λ°©μ§ν©λλ€.
- μλ μ ν: ν΄λΌμ΄μΈνΈκ° μ£Όμ΄μ§ μκ° λ΄μ ν μ μλ μμ² μλ₯Ό μ νν©λλ€. μ΄λ APIλ₯Ό λ¨μ© λ° μλΉμ€ κ±°λΆ κ³΅κ²©μΌλ‘λΆν° 보νΈν©λλ€.
- API λ°©νλ²½: μΉ μ ν리μΌμ΄μ λ°©νλ²½(WAF) λλ API κ²μ΄νΈμ¨μ΄λ₯Ό μ¬μ©νμ¬ μΌλ°μ μΈ κ³΅κ²©μΌλ‘λΆν° APIλ₯Ό 보νΈν©λλ€.
API λ¬Έμν: APIλ₯Ό κ²μ κ°λ₯νκ² λ§λ€κΈ°
μ’μ API λ¬Έμλ APIλ₯Ό κ²μ κ°λ₯νκ³ μ¬μ©νκΈ° μ½κ² λ§λλ λ° νμμ μ λλ€. λ¬Έμλ λͺ ννκ³ κ°κ²°νλ©° μ΅μ μνμ¬μΌ ν©λλ€.
API λ¬Έμνλ₯Ό μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- OpenAPI μ¬μ(Swagger) λλ RAMLκ³Ό κ°μ νμ€ λ¬Έμ νμμ μ¬μ©νμΈμ. μ΄λ¬ν νμμ μ¬μ©νλ©΄ λνν API λ¬Έμμ ν΄λΌμ΄μΈνΈ SDKλ₯Ό μλμΌλ‘ μμ±ν μ μμ΅λλ€.
- λͺ¨λ 리μμ€, λ©μλ λ° λ§€κ°λ³μμ λν μμΈν μ€λͺ μ μ 곡νμΈμ.
- μ¬λ¬ νλ‘κ·Έλλ° μΈμ΄λ‘ λ μ½λ μμ λ₯Ό ν¬ν¨νμΈμ.
- λͺ νν μ€λ₯ λ©μμ§μ λ¬Έμ ν΄κ²° νμ μ 곡νμΈμ.
- λ¬Έμλ₯Ό μ΅μ API λ²μ μΌλ‘ μ΅μ μνλ‘ μ μ§νμΈμ.
- κ°λ°μκ° νλ‘λμ λ°μ΄ν°μ μν₯μ μ£Όμ§ μκ³ APIλ₯Ό ν μ€νΈν μ μλ μλλ°μ€ νκ²½μ μ 곡νμΈμ.
API μ±λ₯: μλ λ° νμ₯μ± μ΅μ ν
API μ±λ₯μ μ’μ μ¬μ©μ κ²½νμ μ 곡νλ λ° λ§€μ° μ€μν©λλ€. λλ¦° APIλ μ¬μ©μμ λΆλ§μ μΌκΈ°νκ³ λΉμ¦λμ€ μμ€λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
API μ±λ₯ μ΅μ νλ₯Ό μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μΊμ±μ μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ λΆνλ₯Ό μ€μ΄μΈμ. μμ£Ό μ‘μΈμ€νλ λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬λ λΆμ° μΊμμ μΊμνμΈμ.
- λ°μ΄ν°λ² μ΄μ€ 쿼리λ₯Ό μ΅μ ννμΈμ. μΈλ±μ€λ₯Ό μ¬μ©νκ³ , μ 체 ν μ΄λΈ μ€μΊμ νΌνλ©°, ν¨μ¨μ μΈ μΏΌλ¦¬ μΈμ΄λ₯Ό μ¬μ©νμΈμ.
- μ°κ²° νλ§μ μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ€λ²ν€λλ₯Ό μ€μ΄μΈμ.
- gzip λλ κΈ°ν μμΆ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μλ΅μ μμΆνμΈμ.
- μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN)λ₯Ό μ¬μ©νμ¬ μ μ μ½ν μΈ λ₯Ό μ¬μ©μμ λ κ°κΉμ΄ κ³³μ μΊμνμΈμ.
- New Relic, Datadog λλ Prometheusμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ API μ±λ₯μ λͺ¨λν°λ§νμΈμ.
- μ½λλ₯Ό νλ‘νμΌλ§νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³νμΈμ.
- μ₯κΈ° μ€ν μμ μ λΉλκΈ° μ²λ¦¬λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
API κ΅μ ν(i18n) λ° νμ§ν(l10n)
κΈλ‘λ² μ¬μ©μλ₯Ό μν APIλ₯Ό μ€κ³ν λ κ΅μ ν(i18n) λ° νμ§ν(l10n)λ₯Ό κ³ λ €νμΈμ. μ΄λ μ¬λ¬ μΈμ΄, ν΅ν, λ μ§/μκ° νμμ μ§μνλλ‘ APIλ₯Ό μ€κ³νλ κ²μ ν¬ν¨ν©λλ€.
λͺ¨λ² μ¬λ‘:
- λͺ¨λ ν μ€νΈ λ°μ΄ν°μ μ λμ½λ(UTF-8) μΈμ½λ©μ μ¬μ©νμΈμ.
- λͺ¨λ ν μ€νΈλ₯Ό μ€λ¦½μ μΈ μΈμ΄(μ: μμ΄)λ‘ μ μ₯νκ³ λ€λ₯Έ μΈμ΄μ λν λ²μμ μ 곡νμΈμ.
- μ¬μ©μμ μ νΈ μΈμ΄λ₯Ό κ²°μ νλ €λ©΄
Accept-Languageν€λλ₯Ό μ¬μ©νμΈμ. - μ¬μ©μμ μ νΈ λ¬Έμ μ§ν©μ κ²°μ νλ €λ©΄
Accept-Charsetν€λλ₯Ό μ¬μ©νμΈμ. - μ¬μ©μμ μ νΈ μ½ν
μΈ νμμ κ²°μ νλ €λ©΄
Acceptν€λλ₯Ό μ¬μ©νμΈμ. - μ¬λ¬ ν΅νλ₯Ό μ§μνκ³ ISO 4217 ν΅ν μ½λ νμ€μ μ¬μ©νμΈμ.
- μ¬λ¬ λ μ§/μκ° νμμ μ§μνκ³ ISO 8601 λ μ§/μκ° νμ νμ€μ μ¬μ©νμΈμ.
- λ¬Ένμ μ°¨μ΄κ° API μ€κ³μ λ―ΈμΉλ μν₯μ κ³ λ €νμΈμ. μλ₯Ό λ€μ΄, μΌλΆ λ¬ΈνκΆμμλ λ€λ₯Έ λ μ§/μκ° νμμ΄λ μ«μ νμμ μ νΈν μ μμ΅λλ€.
μμ:
κΈλ‘λ² μ μ μκ±°λ APIλ μ¬λ¬ ν΅ν(USD, EUR, JPY)λ₯Ό μ§μνκ³ μ¬μ©μκ° μμ² λ§€κ°λ³μλ ν€λλ₯Ό μ¬μ©νμ¬ μ νΈνλ ν΅νλ₯Ό μ§μ ν μ μλλ‘ ν μ μμ΅λλ€.
GET /products?currency=EUR
API λͺ¨λν°λ§ λ° λΆμ
APIμ μ±λ₯, μ¬μ©λ λ° μ€λ₯λ₯Ό λͺ¨λν°λ§νλ κ²μ APIμ μνμ μμ μ±μ 보μ₯νλ λ° μ€μν©λλ€. API λΆμμ API μ¬μ© λ°©μμ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡νκ³ κ°μ μμμ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
λͺ¨λν°λ§ν μ£Όμ μ§ν:
- μλ΅ μκ°: APIκ° μμ²μ μλ΅νλ λ° κ±Έλ¦¬λ νκ· μκ°.
- μ€λ₯μ¨: μ€λ₯λ₯Ό μ΄λνλ μμ²μ λ°±λΆμ¨.
- μμ²λ: λ¨μ μκ°λΉ μμ² μ.
- μ¬μ© ν¨ν΄: μ΄λ€ API μλν¬μΈνΈκ° κ°μ₯ λ§μ΄ μ¬μ©λκ³ μμ΅λκΉ? μμ μ¬μ©μλ λꡬμ λκΉ?
- 리μμ€ μ¬μ©λ₯ : API μλ²μ CPU, λ©λͺ¨λ¦¬ λ° λ€νΈμν¬ μ¬μ©λ.
API λͺ¨λν°λ§ λ° λΆμ λꡬ:
- New Relic
- Datadog
- Prometheus
- Amazon CloudWatch
- Google Cloud Monitoring
- Azure Monitor
κ²°λ‘
κΈλ‘λ² μ¬μ©μλ₯Ό μν RESTful APIλ₯Ό μ€κ³νλ €λ©΄ REST μμΉ, 리μμ€ μ€κ³, HTTP λ©μλ λ° μν μ½λ, λ°μ΄ν° νμ, API λ²μ κ΄λ¦¬, 보μ, λ¬Έμν, μ±λ₯, κ΅μ ν, λͺ¨λν°λ§ λ± μ¬λ¬ μμλ₯Ό μ μ€νκ² κ³ λ €ν΄μΌ ν©λλ€. μ΄ κ°μ΄λμ μ€λͺ λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μ μΈκ³ κ°λ°μλ€μ΄ μ κ·Όν μ μκ³ νμ₯ κ°λ₯νλ©° μ μ§λ³΄μ κ°λ₯νκ³ μμ ν APIλ₯Ό ꡬμΆν μ μμ΅λλ€. API μ€κ³λ λ°λ³΅μ μΈ κ³Όμ μμ κΈ°μ΅νμΈμ. μ§μμ μΌλ‘ APIλ₯Ό λͺ¨λν°λ§νκ³ , μ¬μ©μλ‘λΆν° νΌλλ°±μ μμ§νλ©°, λ³ννλ μꡬμ λ§κ² μ€κ³λ₯Ό μ‘°μ νμΈμ.