π 22 Best Practices to Take Your API Design Skills to the Next Level
- λ§μ΄ν¬λ‘μλΉμ€μ μΈκ³μμλ λ°±μλ APIμ λν μΌκ΄λ μ€κ³κ° νμμ μ λλ€.
μ μλ¬Έμ λ²μν ν¬μ€ν μ λλ€.
First, Some Terminology
Resource Oriented Design μ΄λΌκ³ λΆλ¦¬λ λͺ¨λ APIμ λμμΈμ μλ μΈ κ°μ§ ν΅μ¬ κ°λ μΌλ‘ ꡬμ±μ΄ λ©λλ€.
- Resource(리μμ€): 리μμ€λ Userμ κ°μ λ°μ΄ν°μ μ‘°κ°μ λλ€.
- Collection(컬λ μ ): 컬λ μ μ Userμ 리μ€νΈ(λͺ©λ‘)κ³Ό κ°μ 리μμ€μ κ·Έλ£Ήμ μλ―Έν©λλ€.
- URL: 리μμ€ λλ 컬λ μ μ μμΉλ₯Ό μλ³ν©λλ€. (ex: /user)
1. Use kebab-case for URLs
μ£Όλ¬Έ λͺ©λ‘μ κ°μ Έμ€λ €λ κ²½μ° λ€μκ³Ό κ°μ μ’μ μμμ λμ μμκ° μ‘΄μ¬ν©λλ€.
Good:
/system-orders
Bad:
/systemOrders
/system_orders
2. Use camelCase for Parameters
νΉμ μμ μμ μ νμ κ°μ Έμ€λ κ²½μ° λ€μκ³Ό κ°μ μ’μ μμμ λμ μμκ° μ‘΄μ¬ν©λλ€.
Good:
/system-orders/{orderId}
Bad:
/system-orders/{order_id}
/system-orders/{OrderId}
3. Plural Name to Point to a Collection
μμ€ν μ λͺ¨λ μ μ (볡μν)λ₯Ό μ‘°ννκΈ° μν΄ λ€μκ³Ό κ°μ μ’μ μμμ λμ μμκ° μ‘΄μ¬ν©λλ€.
Good:
GET /users
Bad:
GET /user
GET /User
4. URL Starts With a Collection and Ends With an Identifier
컨μ μ λ νΉνκ³ μΌκ΄λκ² μ μ§νλ €λ κ²½μ° μλ³μλ‘ λλμΌ ν©λλ€.
Good:
GET /shops/:shopId/
GET /category/:categoryId
Bad:
GET /shops/:shopId/category/:categoryId/price
5. Keep Verbs Out of Your Resource URL
URLμμ μλλ₯Ό νννκΈ° μν΄ λμ¬λ₯Ό μ¬μ©νμ§ λ§μΈμ. λμ , μ μ ν HTTP λ©μλλ₯Ό μ¬μ©νμ¬ μμ μ μ€λͺ ν©λλ€.
Good:
PUT /user/{userId}
Bad:
POST /updateuser/{userId}
GET /getusers
6. Use Verbs for Non-Resource URL
μμ λ§ λ°ννλ μλν¬μΈνΈκ° μμ΅λλ€. μ΄λ¬ν κ²½μ° λμ¬λ₯Ό μ¬μ©ν μ μμ΅λλ€.
- μλ₯Ό λ€μ΄, μ¬μ©μμκ² κ²½κ³ λ₯Ό λ€μ 보λ΄λ €λ κ²½μ°
Good:
POST /alerts/245743/resend
μ URLμ CRUD μμ μ΄ μλλΌ μμ€ν μμ νΉμ μμ μ μννλ κΈ°λ₯μΌλ‘ κ°μ£Όλ©λλ€.
7. Use camelCase for JSON property
μμ² λ³Έλ¬Έ λλ μλ΅μ΄ JSONμΈ μμ€ν μ ꡬμΆνλ €λ κ²½μ°, μμ± νλλ μΉ΄λ©μΌμ΄μ€μ¬μΌ ν©λλ€.
Good:
{
userName: "Mohammad Faisal"
userId: "1"
}
Bad:
{
user_name: "Mohammad Faisal"
user_id: "1"
}
8. Monitoring
RESTful HTTP μλΉμ€λ /health, /version, /metricsμ API μλν¬μΈνΈλ₯Ό ꡬνν΄μΌ νλ©°, μ΄λ λ€μ μ 보λ₯Ό μ 곡ν©λλ€.
/health
- /healthμ μμ²μ λν΄ 200 OKμ μνμ½λλ‘ μλ΅ν©λλ€.
/version
- /versionμ μμ²μ λν΄ λ²μ λ²νΈλ‘ μλ΅ν©λλ€.
/metrics
- /metrics APIλ νκ· μλ΅ μκ°κ³Ό κ°μ λ€μν 맀νΈλ¦μ μ 곡ν©λλ€.
9. Don't Use table_name for the Resource Name
ν μ΄λΈ μ΄λ¦μ 리μμ€ μ΄λ¦μΌλ‘ μ¬μ©νμ§ λ§μΈμ. μ₯κΈ°μ μΌλ‘λ μνν μ μμ΅λλ€.
Good:
product-orders
Bad:
product_orders
10. API λμμΈ λꡬ μ¬μ©
λ€μκ³Ό κ°μ μ’μ λ¬Έμνλ₯Ό μν μ’μ API λμμΈν΄μ΄ λ§μ΄ μ‘΄μ¬ν©λλ€.
νλ₯νκ³ μμΈν λ¬Έμνλ API μλΉμμκ² νλ₯ν μ¬μ©μ κ²½ν(UX)λ₯Ό μ 곡ν©λλ€.
11. Use Simple Ordinal Number as Version
νμ APIμ λ²μ λμ μ¬μ©νκ³ , κ°μ₯ λμ λ²μλ₯Ό κ°μ§λλ‘ νμΈμ. λ²μ λ²νΈλ v1, v2 λ±λ±μ΄μ΄μΌ ν©λλ€.
Good:
http://api.domain.com/v1/shops/3/products
APIκ° μΈλΆ μν°ν°μμ μ¬μ©μ€μΈ κ²½μ° μλν¬μΈνΈλ₯Ό λ³κ²½νλ©΄ κΈ°λ₯μ΄ μ€λ¨λ μ μμΌλ―λ‘ νμ APIμ λν λ²μ λμ μ¬μ©νμΈμ.
12. Include Total Number of Resources in Your Response
APIκ° κ°μ²΄ λͺ©λ‘μ 리ν΄νλ κ²½μ° μλ΅ νμ μλ΅μ 리μμ€μ μ΄ κ°―μλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€. μ΄λ₯Ό μν΄ total μμ±μ μ¬μ©ν μ μμ΅λλ€.
Good:
{
users: [
...
],
total: 34
}
Bad:
{
users: [
...
]
}
13. Accept limit and offset Parameters
GET μμ μμλ νμ limit, offset νλΌλ―Έν°λ₯Ό λ°μ΅λλ€.
Good:
GET /shops?offset=5&limit=5
μ΄λ νλ‘ νΈ μλμμμ νμ΄μ§ λ€μ΄μ μ νμνκΈ° λλ¬Έμ λλ€.
14. Take fields Query Parameter
λ°νλλ λ°μ΄ν°μ μλ κ³ λ €ν΄μΌ ν©λλ€. APIμμ νμ νλλ§ λ ΈμΆνλλ‘ λ§€κ°λ³μλ₯Ό μΆκ°ν©λλ€.
λ€μ μμλ μ΅μ id, μ΄λ¦, μ£Όμ, μ°λ½μ²λ§ λ°ννλ API μ λλ€.
Good:
GET /shops?fields=id,name,address,contact
λν κ²½μ°μ λ°λΌ μλ΅ ν¬κΈ°λ₯Ό μ€μ΄λ λ° λμμ΄ λ©λλ€.
15. Don't Pass Authentication Tokens in URL
μ’ μ’ URLμ΄ κΈ°λ‘λκ³ μΈμ¦ ν ν°λ λΆνμνκ² κΈ°λ‘λκΈ° λλ¬Έμ μ΄λ λ§€μ° λμ λ°©λ²μ λλ€.
URL λμ Headerμ ν¨κ» μ λ¬νμΈμ.
Good:
Authorization: Bearer xxxxxx, Extra yyyyy
Bad:
GET /shops/123?token=some_kind_of_authenticaiton_token
16. Validate the Content-Type
μλ²λ Content-Typeμ νμ ν΄μλ μλ©λλ€. μλ₯Ό λ€μ΄ application/x-www-form-urlencoded μ λν΄ μλ½νλ€λ©΄, 곡격μλ μμμ λ§λ€κ³ κ°λ¨ν POST μμ²μ ν΅ν΄ νΈλ¦¬κ±°λ₯Ό ν μ μμ΅λλ€.
17. Use HTTP Methods for CRUD Functions
HTTP λ©μλλ CRUD κΈ°λ₯μ μ€λͺ νκΈ° μν λͺ©μ μΌλ‘ μ¬μ©λ©λλ€.
- GET : μμμ ννμ κ²μν©λλ€.
- POST : μλ‘μ΄ μμκ³Ό νμ μμμ μμ±ν©λλ€.
- PUT : κΈ°μ‘΄ μμμ μ λ°μ΄νΈν©λλ€.
- PATCH : κΈ°μ‘΄ μμμ μ λ°μ΄νΈν©λλ€. μ 곡λ νλλ§ μ λ°μ΄νΈνλ©° λλ¨Έμ§ νλλ κ·Έλλ‘ λ‘λλ€.
- DELETE : κΈ°μ‘΄ 리μμ€λ₯Ό μμ ν©λλ€.
18. Use the Relation in the URL For Nested Resources
μ€μ²© 리μμ€μ λν URL κ΄κ³ μ¬μ©μ λν λͺλͺ μ€μ©μ μΈ μλ λ€μκ³Ό κ°μ΅λλ€.
- GET /shops/2/products : 2λ² Shopμ λͺ¨λ μ ν 리μ€νΈλ₯Ό μ‘°νν©λλ€.
- GET /shops/2/products/31 : 2λ² Shopμ μν 31λ² μνμ μ 보λ₯Ό μ‘°νν©λλ€.
- DELETE /shops/2/products/31 : 2λ² Shopμ μν 31λ² μνμ μμ ν©λλ€.
- PUT /shops/2/products/31 : 2λ² Shopμ μν 31λ² μνμ μ λ°μ΄νΈν©λλ€.
- POST /shops : μ Shopμ λ§λ€κ³ μμ±λ μ μμ μ μΈλΆ μ 보λ₯Ό λ°νν΄μΌ ν©λλ€.
19. CORS
λͺ¨λ κ³΅κ° APIμ λν΄ CORS(Cross-Origin Resource Sharing) ν€λλ₯Ό μ§μν©λλ€.
CORS νμ© μΆμ² "*"μ μ§μνκ³ , μ ν¨ν OAuth tokensμ ν΅ν΄ κΆν λΆμ¬λ₯Ό νλ κ²μ κ³ λ €νμΈμ.
20. Security
λͺ¨λ μλν¬μΈνΈ, 리μμ€ λ° μλΉμ€μμ HTTPS(TLS-encrypted)λ₯Ό μνν©λλ€.
λͺ¨λ μ½λ°± URL, νΈμ μλ¦Ό, μλν¬μΈνΈ, μΉν μ λν΄ HTTPSλ₯Ό μννκ³ μꡬν©λλ€.
21. Errors
μ€λ₯ λ° μλΉμ€ μ€λ₯λ ν΄λΌμ΄μΈνΈκ° μ ν¨νμ§ μκ±°λ μλΉμ€μ λν΄ μλͺ»λ μμ²μ νκ±°λ, μλͺ»λ λ°μ΄ν°λ₯Ό μλΉμ€μ μ λ¬νκ³ μλΉμ€κ° μμ²μ κ±°λΆν λ λ°μν©λλ€.
μλ₯Ό λ€μ΄ μλͺ»λ μΈμ¦ μ격 μ¦λͺ , μλͺ»λ 맀κ°λ³μ, μ μ μλ λ²μ ID λ±μ΄ μμ΅λλ€.
- νλ μ΄μμ μλΉμ€ μ€λ₯λ‘ μΈν΄ ν΄λΌμ΄μΈνΈ μμ²μ κ±°λΆν λ 4xx HTTP μ€λ₯ μ½λλ₯Ό λ°νν©λλ€.
- λͺ¨λ μμ±μ μ²λ¦¬ν ν λ¨μΌ μλ΅μΌλ‘ μ¬λ¬ μ ν¨μ± κ²μ¬λ₯Ό λ°ννλ κ²μ κ³ λ €νμΈμ.
22. Golden Rules
API λμμμ λν΄ νμ μ΄ μμ§ μλ κ²½μ° λ€μκ³Ό κ°μ Golden Rules λ μ¬λ°λ₯Έ κ²°μ μ λ΄λ¦¬λ λ° λμμ΄ λ μ μμ΅λλ€.
- νλ«μ μ€μ²©λ³΄λ€ λ«μ΅λλ€.
- λ¨μν κ²μ΄ 볡μ‘ν κ²λ³΄λ€ λ«μ΅λλ€.
- μ«μλ³΄λ€ λ¬Έμμ΄μ΄ μ’μ΅λλ€.
- μΌκ΄μ±μ μ¬μ©μ μ μλ³΄λ€ λ«μ΅λλ€.
μ 리
μλ¬Έμ κΈ°λ°μΌλ‘ APIλ₯Ό λμμΈνλ 22κ°μ§μ Best Practicesμ λν΄ λ²μκΈμ μμ±ν΄λ³΄μμ΅λλ€.
REST API μ€κ³λ₯Ό κ³ λ €νλ€ λ³΄λ©΄ ν¬μ€ν μ μ‘΄μ¬νλ λλΆλΆμ λ΄μ©λ€μ λν΄ ν λ²μ© κ³ λ €ν λ§ν μ¬νλ€μ λλ€.
μ 리νλ©΄μ ν₯λ―Έλ‘μ λ λ²νΈλ 6 7 8 12 14 16 μ λλ€.
- 6. Use Verbs for Non-Resource URL
- 7. Use camelCase for JSON property
- 8. Monitoring
- 12. Include Total Number of Resources in Your Response
- 14. Take fields Query Parameter
- 16. Validate the Content-Type
리νμ€νΈ, 리μ€ν°μ€κ° JSON νμμ΄λΌλ©΄ μμ± κ°μ μΉ΄λ©μΌμ΄μ€λ₯Ό μ¬μ©νλΌλ μ , ν¬μ€μ²΄ν¬λ λ²μ κ΄λ¦¬, 맀νΈλ¦ λ±μ λν API μ 곡, μλ΅ κ°μ²΄μ μ΄ κ°―μλ₯Ό κ°μ΄ λ°ννλ μ , Content-Typeμ λν μ ν¨μ± κ²μ¬ λ± λ€μν λ°©λ²μ λν΄μλ λ°°μΈ μ μμμ΅λλ€.
'μ€ν°λ & μΈλ―Έλ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
ꡬκΈλ§ μνλλ² κΏν μ 리(feat. λλ¦Όμ½λ©) (8) | 2022.05.18 |
---|---|
μκ° μ½λ리뷰 Ver_0.1: μ»€λ¦¬μ΄ μ±μ₯ CODE μΈλ―Έλ μ 리 (0) | 2021.11.07 |
μΊμΉ # κ°λ°μ 컀리μ΄μ½ - κ°λ°μ μ±μ₯ λ‘λ맡 (3) | 2021.06.29 |
μΊμΉ # κ°λ°μ 컀리μ΄μ½ - κ°λ°μ λ©΄μ (0) | 2021.06.23 |
OSS κ°λ°μν¬λΌ Meetup μ€ννΈμ (StartUp)μ λ§λλ€ (2) | 2021.05.15 |
λκΈ