πŸ‘©πŸ»‍πŸ’» Dev/Back-End

REST API URI 섀계 κ·œμΉ™

yesolz 2023. 11. 24. 11:00
728x90

API 넀이밍을 ν•˜λ‹€κ°€ 고민이 생겼닀.

[PUT] /urls/{id}/moveκ³Ό [PUT] /urls/move/{id} 쀑 μ–΄λ–€ 게 더 λ‚˜μ€μ§€ 말이닀.

이λ₯Ό μœ„ν•΄ ꡬ글링을 ν•˜λ‹€κ°€, REST API URIλ₯Ό λ””μžμΈν•˜λŠ” κ·œμΉ™ ν˜Ήμ€ μ»¨λ²€μ…˜μ΄ μ‘΄μž¬ν•œλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.

 

 

REST API와 URI

REST APIλŠ” Representational State Transfer (ν‘œν˜„ μƒνƒœ 전솑)의 μ•½μžμ΄λ©°, μ›Ή 기반의 μ‹œμŠ€ν…œ κ°„ 톡신을 μœ„ν•œ μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ΄λ‹€. 이 방식은 μžμ›(Resource)의 μƒνƒœλ₯Ό HTTP λ©”μ†Œλ“œ(GET, POST, PUT, DELETE λ“±)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ†‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λœλ‹€. 각 μžμ›μ€ νŠΉμ •ν•œ URI(Uniform Resource Identifier, ν†΅μΌλœ μžμ› μ‹λ³„μž)에 μ˜ν•΄ μ‹λ³„λœλ‹€.

URIλŠ” 인터넷 μƒμ˜ μžμ›μ„ λ‚˜νƒ€λ‚΄λŠ” μœ μΌν•œ μ£Όμ†Œλ‘œ, μ›Ή νŽ˜μ΄μ§€, 이미지, 파일 등을 μœ„μΉ˜ μ§€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. REST APIμ—μ„œ URIλŠ” νŠΉμ • μžμ› λ˜λŠ” μžμ›μ˜ μ»¬λ ‰μ…˜μ— λŒ€ν•œ 접근을 μ œκ³΅ν•˜λ©°, HTTP λ©”μ„œλ“œμ™€ ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ λ‹€μ–‘ν•œ μž‘μ—…(쑰회, 생성, μˆ˜μ •, μ‚­μ œ λ“±)을 μˆ˜ν–‰ν•œλ‹€.

 

 

REST API URI 섀계λ₯Ό μœ„ν•œ μ’…ν•© κ°€μ΄λ“œ

REST API URI 섀계에 μžˆμ–΄ μ€‘μš”ν•œ κ·œμΉ™λ“€μ„ λ‹€μŒκ³Ό 같이 μ’…ν•©ν•  수 μžˆμ—ˆλ‹€.

 

  1. λ§ˆμ§€λ§‰ μŠ¬λž˜μ‹œ(/) μ œμ™Έ: URI 끝에 μŠ¬λž˜μ‹œλ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.
    예) http://api.example.com/devices와 http://api.example.com/devices/λŠ” 동일해야 ν•œλ‹€.
  2. 계측적 관계 ν‘œν˜„: μŠ¬λž˜μ‹œ(/)λŠ” λ¦¬μ†ŒμŠ€ κ°„μ˜ 계측적 관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    예) http://api.canvas.com/shapes/polygons/quadrilaterals/squares
  3. ν•˜μ΄ν”ˆ(-) μ‚¬μš©: URI의 가독성을 높이기 μœ„ν•΄ κΈ΄ 경둜 μ„Έκ·Έλ¨ΌνŠΈμ—μ„œ ν•˜μ΄ν”ˆμ„ μ‚¬μš©ν•œλ‹€.
    예) http://api.example.com/device-management/managed-devices
  4. μ–Έλ”μŠ€μ½”μ–΄(_) μ‚¬μš© κΈˆμ§€: URIμ—μ„œλŠ” μ–Έλ”μŠ€μ½”μ–΄(_) λŒ€μ‹  ν•˜μ΄ν”ˆ(-)을 μ‚¬μš©ν•œλ‹€.
  5. μ†Œλ¬Έμž μ‚¬μš© ꢌμž₯: URI κ²½λ‘œμ—μ„œλŠ” μ†Œλ¬Έμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
  6. 파일 ν™•μž₯자 μ œμ™Έ: URIμ—μ„œλŠ” 파일 ν™•μž₯자λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  7. λͺ…사 μ‚¬μš©: URIλŠ” μžμ›μ„ λ‚˜νƒ€λ‚΄λŠ” 데 λͺ…사λ₯Ό μ‚¬μš©ν•˜λ©°, λ™μ‚¬λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  8. CRUD ν•¨μˆ˜ 이름 μ‚¬μš© κΈˆμ§€: URIλŠ” μžμ›μ„ μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, CRUD μž‘μ—…μ€ HTTP μš”μ²­ λ©”μ†Œλ“œλ₯Ό 톡해 μˆ˜ν–‰λœλ‹€.
  9. 쿼리 μ»΄ν¬λ„ŒνŠΈ μ‚¬μš©: 필터링, μ •λ ¬, νŽ˜μ΄μ§• 등은 쿼리 λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 μˆ˜ν–‰λœλ‹€.
  10. μžμ›μ˜ 단일 및 집합 ꡬ뢄: 'customers'λŠ” 집합 μžμ›, 'customer'λŠ” 단일 μžμ›μ„ λ‚˜νƒ€λ‚Έλ‹€.
    예) /customersλŠ” λͺ¨λ“  고객을 λ‚˜νƒ€λ‚΄κ³ , /customers/{customerId}λŠ” νŠΉμ • 고객을 λ‚˜νƒ€λ‚Έλ‹€.

 

 

[PUT] /urls/{id}/move κ³Ό [PUT] /urls/move/{id}의 μ˜λ―Έκ°€ λ‹€λ₯΄λ‹€

κ³΅λΆ€ν•œ λ‚΄μš©μ— 따라, λ‚΄κ°€ μ²˜μŒμ— κ³ λ―Όν–ˆλ˜ 두 URI의 μ˜λ―Έκ°€ λ‹€λ₯΄κ²Œ 해석될 수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.

 

  1. [PUT] /filecomponenturls/{id}/move
    • 이 κ΅¬μ‘°λŠ” "move" λ™μž‘μ΄ {id}둜 μ‹λ³„λ˜λŠ” νŠΉμ • "urls"에 μ μš©λ¨μ„ λ‚˜νƒ€λ‚Έλ‹€.
    • "urls"이 μ£Ό λ¦¬μ†ŒμŠ€μ΄λ©°, "move"λŠ” 이 λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ νŠΉμ • λ™μž‘μž„μ„ μ˜λ―Έν•œλ‹€.
    • URL이 λ¦¬μ†ŒμŠ€λ₯Ό λŒ€ν‘œν•˜κ³  HTTP λ©”μ†Œλ“œ(μ—¬κΈ°μ„œλŠ” PUT)κ°€ λ™μž‘μ„ λŒ€ν‘œν•˜λŠ” RESTful 원칙과 μΌμΉ˜ν•œλ‹€.
  2. [PUT] /filecomponenturls/move/{id}
    • 이 κ΅¬μ‘°λŠ” "move"λ₯Ό "filecomponenturls" μ•„λž˜μ˜ ν•˜μœ„ λ¦¬μ†ŒμŠ€λ‚˜ λ™μž‘ λ²”μ£Όλ‘œ μœ„μΉ˜μ‹œν‚¨λ‹€.
    • "move"λΌλŠ” 넓은 λ²”μ£Ό μ•„λž˜μ—μ„œ νŠΉμ • {id}λ₯Ό μ΄λ™μ‹œν‚΄μ„ λ‚˜νƒ€λ‚Έλ‹€.
    • "urls" μ•„λž˜μ— λ‹€μ–‘ν•œ λ™μž‘(예: move, copy, delete)을 λΆ„λ₯˜ν•˜κ³ μž ν•  λ•Œ μ ν•©ν•˜λ‹€.

 

첫 번째 μ˜΅μ…˜μΈ [PUT] /filecomponenturls/{id}/move κ°€ 더 RESTful ν•˜λ‹€!

"move" λ™μž‘μ΄ {id}둜 μ‹λ³„λ˜λŠ” νŠΉμ • url에 μˆ˜ν–‰λ¨μ„ λͺ…ν™•νžˆ ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

 

URIλ₯Ό 섀계할 λ•Œ, 계측 ꡬ쑰λ₯Ό λͺ…ν™•νžˆ ν‘œν˜„ν•˜κ³  API μ‚¬μš©μžκ°€ μ΄ν•΄ν•˜κΈ° 쉽도둝 섀계해야겠닀고 λŠλ‚„ 수 μžˆμ—ˆλ‹€.

 

 

 

ref

https://dzone.com/articles/7-rules-for-rest-api-uri-design-1

 

7 Rules for REST API URI Design - DZone

URIs, or Uniform Resource Identifiers, should be designed to be readable and clearly communicate the API resource model. These rules will help you succeed.

dzone.com

https://restfulapi.net/resource-naming/

 

REST API URI Naming Conventions and Best Practices

In REST, having a strong and consistent REST resource naming strategy – will prove one of the best design decisions in the long term. Let's discuss.

restfulapi.net

 

728x90