Skip to content

Latest commit

Β 

History

History
208 lines (145 loc) Β· 10.3 KB

RESTAPI.md

File metadata and controls

208 lines (145 loc) Β· 10.3 KB

REST


REST(Representational State Transfer)

REST(Representational State Transfer)λŠ” 효율적, μ•ˆμ •μ μ΄λ©° ν™•μž₯κ°€λŠ₯ν•œ λΆ„μ‚°μ‹œμŠ€ν…œμ„ κ°€μ Έμ˜¬ 수 μžˆλŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜ λ””μžμΈ μ œμ•½μ˜ λͺ¨μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 그리고 κ·Έ μ œμ•½λ“€μ„ μ€€μˆ˜ν–ˆμ„ λ•Œ κ·Έ μ‹œμŠ€ν…œμ€ RESTfulν•˜λ‹€κ³  μΌμ»¬μ–΄μ§‘λ‹ˆλ‹€.

  • RESTful

    • RESTful은 일반적으둜 RESTλΌλŠ” μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬ν˜„ν•˜λŠ” μ›Ή μ„œλΉ„μŠ€λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μš©μ–΄μ΄λ‹€.
      • 즉, REST 원리λ₯Ό λ”°λ₯΄λŠ” μ‹œμŠ€ν…œμ€ RESTfulμ΄λž€ μš©μ–΄λ‘œ μ§€μΉ­λœλ‹€.
    • RESTful은 RESTλ₯Ό RESTλ‹΅κ²Œ μ“°κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ, λˆ„κ΅°κ°€κ°€ κ³΅μ‹μ μœΌλ‘œ λ°œν‘œν•œ 것이 μ•„λ‹ˆλ‹€.

  • HTTP ν”„λ‘œν† μ½œμ„ κ·ΈλŒ€λ‘œ ν™œμš©ν•˜κΈ° λ•Œλ¬Έμ— μ›Ήμ˜ μž₯점을 ν™œμš©ν•  수 μžˆλŠ” 아킀텍쳐 μŠ€νƒ€μΌμ΄λ‹€.

  • μžμ›μ„ μ΄λ¦„μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ ν•΄λ‹Ή μžμ›μ˜ μƒνƒœλ₯Ό μ£Όκ³ , λ°›λŠ” λͺ¨λ“  것


κ΅¬μ„±μš”μ†Œ

μžμ›, μ‘°μž‘, ν‘œν˜„

μžμ›(Resource)

  • μ„œλ²„μ— μžˆλŠ” 것. DB μ•ˆμ— λ“€μ–΄κ°€ μžˆλŠ” 데이터 λ˜λŠ” 이미지 ν•˜λ‚˜ν•˜λ‚˜λ₯Ό μ˜λ―Έν•œλ‹€. ex) μœ μ €, μ£Όλ¬Έ, μ΄λ―Έμ§€μ£Όμ†Œ λ“±

  • URIλ₯Ό 톡해 μžμ›μ„ λͺ…μ‹œν•˜κ³ , ꡬ뢄할 수 μžˆλ‹€.

μ‘°μž‘(Verb; ν–‰μœ„)

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” HTTP Methodλ₯Ό μ΄μš©ν•˜μ—¬ μ§€μ •ν•œ μžμ›μ— λŒ€ν•œ μ‘°μž‘μ„ μš”μ²­ν•œλ‹€.

ν‘œν˜„(Representation of Resource)

  • μ–΄λ–€ λ¦¬μ†ŒμŠ€μ˜ νŠΉμ • μ‹œμ μ˜ μƒνƒœλ₯Ό λ°˜μ˜ν•˜κ³  μžˆλŠ” 정보

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μžμ›μ— λŒ€ν•œ μ‘°μž‘μ„ μš”μ²­ν•˜λ©΄ μ„œλ²„λŠ” 이에 λŒ€ν•œ μ μ ˆν•œ 응닡을 보낸닀.

  • RESTμ—μ„œ ν•˜λ‚˜μ˜ μžμ›μ€ JSON, XML λ“± μ—¬λŸ¬ ν˜•νƒœμ˜ Representation으둜 λ‚˜νƒ€λ‚΄μ–΄ 질 수 μžˆλ‹€.


REST 쑰건

  1. Server-Client(μ„œλ²„-ν΄λΌμ΄μ–ΈνŠΈ ꡬ쑰)

    • ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ κ΅¬μ‘°λŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ 관심을 데이터 μ €μž₯에 λŒ€ν•œ κ΄€μ‹¬μœΌλ‘œλΆ€ν„° λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ ν΄λΌμ΄μ–ΈνŠΈμ˜ 이식성과 μ„œλ²„μ˜ 규λͺ¨ν™•μž₯성을 κ°œμ„ ν•œλ‹€.
    • REST Server: APIλ₯Ό μ œκ³΅ν•˜κ³  λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리 및 μ €μž₯을 μ±…μž„μ§„λ‹€.
    • Client: μ‚¬μš©μž μΈμ¦μ΄λ‚˜ context(μ„Έμ…˜, 둜그인 정보) 등을 직접 κ΄€λ¦¬ν•˜κ³  μ±…μž„μ§„λ‹€.
    • μ„œλ‘œ κ°„ μ˜μ‘΄μ„±μ΄ 쀄어든닀.
  2. Stateless(λ¬΄μƒνƒœ)

    • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ ν†΅μ‹ μ—λŠ” μƒνƒœκ°€ μ—†μ–΄μ•Όν•œλ‹€.
    • λͺ¨λ“  μš”μ²­μ€ ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό λ‹΄κ³  μžˆμ–΄μ•Όν•œλ‹€.
    • Client의 contextλ₯Ό Server에 μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. -> μ„Έμ…˜κ³Ό 쿠킀와 같은 context 정보λ₯Ό μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ κ΅¬ν˜„μ΄ λ‹¨μˆœν•΄μ§„λ‹€.
    • ServerλŠ” 각각의 μš”μ²­μ„ μ™„μ „νžˆ λ³„κ°œμ˜ κ²ƒμœΌλ‘œ μΈμ‹ν•˜κ³  μ²˜λ¦¬ν•œλ‹€. -> 각 API μ„œλ²„λŠ” Client의 μš”μ²­λ§Œμ„ λ‹¨μˆœ μ²˜λ¦¬ν•œλ‹€. 이전 μš”μ²­μ΄ λ‹€μŒ μš”μ²­μ˜ μ²˜λ¦¬μ— μ—°κ΄€λ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€.
  3. Cacheable(μΊμ‹œ 처리 κ°€λŠ₯)

    • μΊμ‹œκ°€ κ°€λŠ₯ν•΄μ•Όν•œλ‹€. 즉 λͺ¨λ“  μ„œλ²„ 응닡은 μΊμ‹œ κ°€λŠ₯ν•œμ§€ κ·Έλ ‡μ§€ μ•„λ‹Œμ§€ μ•Œ 수 μžˆμ–΄μ•Όν•œλ‹€.
    • μΊμ‹œ μ‚¬μš©μ„ 톡해 μ‘λ‹΅μ‹œκ°„μ΄ 빨라지고 REST Server νŠΈλžœμž­μ…˜μ΄ λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 전체 μ‘λ‹΅μ‹œκ°„, μ„±λŠ₯, μ„œλ²„μ˜ μžμ› 이용λ₯ μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.
    • HTTP ν”„λ‘œν† μ½œ ν‘œμ€€μ—μ„œ μ‚¬μš©ν•˜λŠ” LAST-Modified νƒœκ·Έλ‚˜ E-Tagλ₯Ό μ΄μš©ν•΄ 캐싱 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.
  4. Layered System(계측화)

    • 계측(hierarchical layers)으둜 ꡬ성이 κ°€λŠ₯ν•΄μ•Όν•˜λ©°, 각 λ ˆμ΄μ–΄μ— μ†ν•œ κ΅¬μ„±μš”μ†ŒλŠ” μΈμ ‘ν•˜μ§€ μ•Šμ€ λ ˆμ΄μ–΄μ˜ κ΅¬μ„±μš”μ†Œλ₯Ό λ³Ό 수 μ—†μ–΄μ•Όν•œλ‹€.
    • ClientλŠ” REST API Server만 ν˜ΈμΆœν•œλ‹€.
    • REST ServerλŠ” 닀쀑 κ³„μΈ΅μœΌλ‘œ ꡬ성될 수 있으며, λ³΄μ•ˆλ‘œλ“œ λ°ΈλŸ°μ‹±, μ•”ν˜Έν™” 계측을 μΆ”κ°€ν•΄ κ΅¬μ‘°μƒμ˜ μœ μ—°μ„±μ„ λ‘˜ 수 있고 PROXY, κ²Œμ΄νŠΈμ›¨μ΄ 같은 λ„€νŠΈμ›Œν¬ 기반의 쀑간맀체λ₯Ό μ‚¬μš©ν•  수 있게 ν•œλ‹€.
  5. Uniform Interface(μΈν„°νŽ˜μ΄μŠ€ 일관성)

    • κ΅¬μ„±μš”μ†Œ(ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„ λ“±) μ‚¬μ΄μ˜ μΈν„°νŽ˜μ΄μŠ€λŠ” 균일(uniform)ν•΄μ•Όν•œλ‹€.
    • μš”μ²­μ΄ μ–΄λ””μ—μ„œ μ˜€λŠ”μ§€μ™€ λ¬΄κ΄€ν•˜κ²Œ, λ™μΌν•œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ λͺ¨λ“  API μš”μ²­μ€ λ™μΌν•˜κ²Œ 보여야 ν•œλ‹€.
    • 이것은 μš”μ²­μ„ ν•˜λŠ” Clientκ°€ ν”Œλž«νΌ(Android, Ios, Jsp λ“±) 에 λ¬΄κ΄€ν•˜λ©°, νŠΉμ • μ–Έμ–΄λ‚˜ κΈ°μˆ μ— 쒅속받지 μ•ŠλŠ” νŠΉμ§•μ„ μ˜λ―Έν•œλ‹€.
    • REST APIλŠ” μ‚¬μš©μžμ˜ μ΄λ¦„μ΄λ‚˜ 이메일 μ£Όμ†Œ λ“±μ˜ λ™μΌν•œ 데이터 쑰각이 였직 ν•˜λ‚˜μ˜ URI(Uniform Resource Identifier)에 속함을 보μž₯ν•΄μ•Ό ν•œλ‹€. λ¦¬μ†ŒμŠ€κ°€ λ„ˆλ¬΄ 클 ν•„μš”λŠ” μ—†μ§€λ§Œ, μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•„μš”λ‘œ ν•˜λŠ” λͺ¨λ“  정보λ₯Ό 포함해야 ν•©λ‹ˆλ‹€.

    • Identification of resources

      • λ¦¬μ†ŒμŠ€κ°€ URI둜 μ‹λ³„λ˜λ©΄ λœλ‹€.
    • Manipulation of resources through representation

      • λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  λ•Œ μ„œλ²„λŠ” λ¦¬μ†ŒμŠ€λ₯Ό ν‘œν˜„ν•˜μ—¬ μ‘λ‹΅ν•œλ‹€.
      • 이 ν‘œν˜„μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ΄ν•΄ν•˜κ³  μ‘°μž‘ν•  수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ λ¦¬μ†ŒμŠ€μ˜ ν˜„μž¬ μƒνƒœλ₯Ό μΊ‘μ²˜ν•œλ‹€.
      • μ„œλ²„κ°€ μžμ›μ˜ ν‘œν˜„μ„ 보내기 λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈκ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”κ΅¬μ— λ§žλŠ” νŠΉμ • ν‘œν˜„μ„ μš”μ²­ν•  수 μžˆλ‹€. (메타데이터 등을 ν™œμš©) -> μ½˜ν…μΈ  ν˜‘μƒ
      • APIμ—μ„œ μ½˜ν…μΈ  ν˜‘μƒμ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μΌν•œ URLμ—μ„œ λ‹€λ₯Έ λ¦¬μ†ŒμŠ€ ν‘œν˜„μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλ„λ‘ ν•  수 μžˆλ‹€.
    • Self-Descriptiveness(μžμ²΄ν‘œν˜„ ꡬ쑰)

      • REST API λ©”μ‹œμ§€λ§Œ 보고도 이λ₯Ό μ‰½κ²Œ 이해할 수 μžˆλŠ” 자체 ν‘œν˜„ ꡬ쑰둜 λ˜μ–΄μžˆλ‹€.
    • HATEOS(Hypermedia As The Engine Of Application State)

      • RESTful APIλ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ „μ μœΌλ‘œ μ„œλ²„μ— μ˜ν•΄ λ™μ μœΌλ‘œ μƒν˜Έμž‘μš©μ„ ν•  수 μžˆλ‹€. μ‰½κ²Œ λ§ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­μ‹œ μ„œλ²„λŠ” μš”μ²­μ— μ˜μ‘΄λ˜λŠ” URIλ₯Ό Response에 ν¬ν•¨μ‹œμΌœ λ°˜ν™˜ν•œλ‹€.
      • 동적인 APIλ₯Ό μ œκ³΅ν•  수 μžˆκ²Œλ©λ‹ˆλ‹€.(λͺ¨λ“  κ΄€λ ¨λœ λ™μž‘μ„ URIλ₯Ό 톡해 μ•Œλ €μ€λ‹ˆλ‹€.) 즉, ν΄λΌμ΄μ–ΈνŠΈκ°€ API의 변화에 일일이 λŒ€μ‘ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” μž₯점을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
      • Hypermedia (링크)λ₯Ό ν†΅ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœ 전이가 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. (Hypermedia (링크)에 자기 μžμ‹ μ— λŒ€ν•΄ν•œ 정보가 담겨야 ν•œλ‹€.)
      {
          "timeline_url": "https://github.com/timeline",
          "user_url": "https://github.com/{user}",
          "current_user_public_url": "https://github.com/octocat",
          "current_user_url": "https://github.com/octocat.private?token=abc123",
          "current_user_actor_url": "https://github.com/octocat.private.actor?token=abc123",
          "current_user_organization_url": "",
          "current_user_organization_urls": [
              "https://github.com/organizations/github/octocat.private.atom?token=abc123"
          ],
          "security_advisories_url": "https://github.com/security-advisories",
          "_links": {
              "timeline": {
              "href": "https://github.com/timeline",
              "type": "application/atom+xml"
              },
              "user": {
              "href": "https://github.com/{user}",
              "type": "application/atom+xml"
              },
              "current_user_public": {
              "href": "https://github.com/octocat",
              "type": "application/atom+xml"
              },
              "current_user": {
              "href": "https://github.com/octocat.private?token=abc123",
              "type": "application/atom+xml"
              },
              "current_user_actor": {
              "href": "https://github.com/octocat.private.actor?token=abc123",
              "type": "application/atom+xml"
              },
              "current_user_organization": {
              "href": "",
              "type": ""
              },
              "current_user_organizations": [
              {
                  "href": "https://github.com/organizations/github/octocat.private.atom?token=abc123",
                  "type": "application/atom+xml"
              }
              ],
              "security_advisories": {
              "href": "https://github.com/security-advisories",
              "type": "application/atom+xml"
              }
          }
      }
      
      
  6. Code-On-Demand

    • ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— 따라 μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.
    • Client에 λ³΄λ‚΄λŠ” 데이터λ₯Ό λ°”λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό λ³΄λ‚΄μ„œ 이것을 Clientμ—μ„œ μ‹€ν–‰ν•˜λŠ” 것을 λ§ν•œλ‹€.
    • optional

μž₯점

  • HTTP ν”„λ‘œν† μ½œμ˜ 인프라λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ―€λ‘œ REST API μ‚¬μš©μ„ μœ„ν•œ λ³„λ„μ˜ 인프라λ₯Ό κ΅¬μΆœν•  ν•„μš”κ°€ μ—†λ‹€.

  • HTTP ν”„λ‘œν† μ½œμ˜ ν‘œμ€€μ„ μ΅œλŒ€ν•œ ν™œμš©ν•˜μ—¬ μ—¬λŸ¬ 좔가적인 μž₯점을 ν•¨κ»˜ κ°€μ Έκ°ˆ 수 있게 ν•΄μ€€λ‹€.

  • HTTP ν‘œμ€€ ν”„λ‘œν† μ½œμ— λ”°λ₯΄λŠ” λͺ¨λ“  ν”Œλž«νΌμ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

  • REST API λ©”μ‹œμ§€κ°€ μ˜λ„ν•˜λŠ” λ°”λ₯Ό λͺ…ν™•ν•˜κ²Œ λ‚˜νƒ€λ‚΄λ―€λ‘œ μ˜λ„ν•˜λŠ” λ°”λ₯Ό μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ‹€.

  • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ˜ 역할을 λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬ν•œλ‹€.

단점

  • ν‘œμ€€μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. -> 관리가 쉽지 μ•Šλ‹€.

  • HTTP Method ν˜•νƒœκ°€ μ œν•œμ μ΄λ‹€. -> λ‹¨μˆœνžˆ λ³΄λ‚΄λŠ” κΈ°λŠ₯ 외에도 λ‹€μ–‘ν•œ μ„ΈλΆ€ κΈ°λŠ₯듀을 κ΅¬ν˜„ν•˜λŠ”λ° μ œμ•½μ΄ λ°œμƒν•  수 μžˆλ‹€.

  • λΈŒλΌμš°μ €λ₯Ό 톡해 ν…ŒμŠ€νŠΈν•  일이 λ§Žμ€ μ„œλΉ„μŠ€λΌλ©΄ μ‰½κ²Œ κ³ μΉ  수 μžˆλŠ” URL보닀 Header 값을 μ²˜λ¦¬ν•΄μ•Όν•˜λ―€λ‘œ 전문성이 μš”κ΅¬λœλ‹€.

  • point-to-point 톡신 λͺ¨λΈμ„ κ°€μ •ν•˜λ―€λ‘œ λ‘˜ μ΄μƒμœΌλ‘œ μƒν˜Έμž‘μš©ν•˜λŠ” λΆ„μ‚°ν™˜κ²½μ—λŠ” μœ μš©ν•˜μ§€ μ•Šλ‹€.


REST API

  • REST API의 μ •μ˜

    • REST 기반으둜 μ„œλΉ„μŠ€ APIλ₯Ό κ΅¬ν˜„ν•œ 것

  • REST API 섀계 κΈ°λ³Έ κ·œμΉ™

    1. URIλŠ” μ •λ³΄μ˜ μžμ›μ„ ν‘œν˜„ν•΄μ•Ό ν•œλ‹€.
      • resourceλŠ” λ™μ‚¬λ³΄λ‹€λŠ” λͺ…사λ₯Ό μ‚¬μš©ν•œλ‹€.
      • resourceλŠ” μ˜μ–΄ μ†Œλ¬Έμž λ³΅μˆ˜ν˜•μ„ μ‚¬μš©ν•˜μ—¬ ν‘œν˜„ν•œλ‹€.
      • Ex) GET /Member/1 -> GET /members/1
    2. μžμ›μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP Method(GET, PUT, POST, DELETE λ“±)둜 ν‘œν˜„ν•œλ‹€.
      • URI에 HTTP Methodκ°€ λ“€μ–΄κ°€λ©΄ μ•ˆλœλ‹€.
      • Ex) GET /members/delete/1 -> DELETE /members/1
      • URI에 ν–‰μœ„μ— λŒ€ν•œ 동사 ν‘œν˜„μ΄ λ“€μ–΄κ°€λ©΄ μ•ˆλœλ‹€.
      • Ex) GET /members/show/1 -> GET /members/1
      • Ex) GET /members/insert/2 -> POST /members/2