REST API vs RESTful API

leejihyeonΒ·2026λ…„ 5μ›” 4일

πŸ“… λ‚ μ§œ: 2026λ…„ 4μ›” 11일

REST에 λŒ€ν•΄

πŸ’‘REST λž€?

μ›Ήμ˜ μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ΄λ‹€.

λ³΅μž‘ν•˜κ²Œ 듀릴 수 μžˆμ§€λ§Œ, 핡심은 μžμ›(Data)을 μ–΄λ–»κ²Œ 이름 뢙이고(URL), μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€(HTTP Method)에 λŒ€ν•œ 약속이닀.

REST의 핡심 κ°œλ…

κ΅¬λΆ„λ‚΄μš©λΉ„μœ 
μžμ›(Resource)μš°λ¦¬κ°€ μ–»κ³ μž ν•˜λŠ” 데이터(예 : μ‚¬μš©μž 정보, κ²Œμ‹œλ¬Ό, μƒν’ˆ, μž₯λ°”κ΅¬λ‹ˆ, 결제 μˆ˜λ‹¨ λ“±)λ©”λ‰΄νŒμ— μžˆλŠ” μŒμ‹
ν–‰μœ„(Verb)데이터에 λŒ€ν•΄ 무엇을 ν•  것인가(HTTP λ©”μ„œλ“œ μ‚¬μš©)μ£Όλ¬Έ 방식 (μ£Όλ¬Έν•˜κΈ°, μ·¨μ†Œν•˜κΈ° λ“±)
ν‘œν˜„ (Representation)데이터λ₯Ό μ–΄λ–€ ν˜•μ‹μœΌλ‘œ 보여쀄 것인가(JSON, XML λ“±)μŒμ‹μ΄ 담겨 λ‚˜μ˜€λŠ” 그릇
  • μžμ› : μ‡Όν•‘ μžμ› β†’ μƒν’ˆ, μž₯λ°”κ΅¬λ‹ˆ, 결제 μˆ˜λ‹¨
    • URL β†’ /items, /carts. /payments β†’ Aμ„œλ²„μ£Όμ†Œ/items β‡’ Aμ„œλ²„κ°€ κ΄€λ¦¬ν•˜λŠ” μƒν’ˆ(items)에 URL둜 μ ‘κ·Ό!!
  • ν–‰μœ„ : HTTP λ©”μ„œλ“œ
    • GET : 쑰회(Read)
    • POST : 생성(Create)
    • PUT/PATCH : μˆ˜μ •(Update)
    • DELETE : μ‚­μ œ(Delete)
  • ν‘œν˜„ : JSON ν˜•μ‹ ? OR XMLν˜•μ‹ ? β†’ μ–΄λ–€ ν˜•μ‹μ„ μ‚¬μš©ν• κ±°λƒ?

REST 섀계원칙 6κ°€μ§€

  • κ· μΌν•œ μΈν„°νŽ˜μ΄μŠ€(Uniforn Interface)
    • URL, HTTP λ“±μ˜ ν‘œμ€€ν™”λœ 방법을 μ‚¬μš©ν•œλ‹€.
    • HTTP ν‘œμ€€λ§Œ λ”°λ₯Έλ‹€λ©΄ μ–΄λ–€ μ–Έμ–΄λ‚˜ ν”Œλž«νΌμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλŠ” κ³΅ν†΅λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.
  • λ¬΄μƒνƒœ(Stateless)
    • μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 각 μš”μ²­μ€ 독립적이며 ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό 포함해야 ν•œλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈ - μ„œλ²„ 뢄리(Client-Server Architecture)
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ UIλ₯Ό μ²˜λ¦¬ν•œλ‹€.
    • μ„œλ²„λŠ” 데이터 μ €μž₯, λ³΄μ•ˆ, μ›Œν¬λ‘œλ“œλ₯Ό λ‹΄λ‹Ήν•œλ‹€.
    • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λŠ” λͺ…ν™•νžˆ κ΅¬λΆ„λ˜μ–΄μ•Ό ν•œλ‹€.
  • 계측화 μ‹œμŠ€ν…œ(Layered System)
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ™€ 직접 ν†΅μ‹ ν•˜μ§€ μ•Šκ³  쀑간 계측을 κ±°μΉœλ‹€.
    • 톡신 λŒ€μƒμ΄ μ΅œμ’… μ„œλ²„μΈμ§€ μ€‘κ°œμž(λ³΄μ•ˆ, λ‘œλ“œ λ°ΈλŸ°μ‹± λ“±)인지 μ•Œ 수 없도둝 섀계해야 ν•œλ‹€.
    • μ„œλ²„λŠ” μš”μ²­μ„ λ‹€λ₯Έ μ„œλ²„λ‘œ 전달할 수 μžˆλ‹€.
  • μΊμ‹œ κ°€λŠ₯μ„±(Caching)
    • 응닡은 캐싱이 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
    • HTTP의 κΈ°μ‘΄ 캐싱 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄이고 μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.
    • 예) λͺ¨λ“  νŽ˜μ΄μ§€μ— 곡톡 머리글 및 이미지가 μžˆλŠ” μ›Ή μ‚¬μ΄νŠΈλ₯Ό λ°©λ¬Έν•œλ‹€κ³  ν–ˆμ„ λ•Œ μƒˆλ‘œμš΄ μ›Ή μ‚¬μ΄νŠΈ νŽ˜μ΄μ§€λ₯Ό λ°©λ¬Έν•  λ•Œλ§ˆλ‹€ μ„œλ²„λŠ” λ™μΌν•œ 이미지λ₯Ό λ‹€μ‹œ 전솑해야 ν•œλ‹€. 이λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” 첫 번째 응닡 후에 ν•΄λ‹Ή 이미지λ₯Ό μΊμ‹±ν•˜κ±°λ‚˜ μ €μž₯ν•œ λ‹€μŒ μΊμ‹œμ—μ„œ 직접 이미지λ₯Ό μ‚¬μš©ν•œλ‹€.
  • μ˜¨λ””λ§¨λ“œ μ½”λ“œ(Code on Demand)
    • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό 전솑할 수 μžˆλ‹€.
    • 예) μ›Ή μ‚¬μ΄νŠΈμ—μ„œ 등둝 양식을 μž‘μ„±ν•˜λ©΄ λΈŒλΌμš°μ €λŠ” 잘λͺ»λœ μ „ν™”λ²ˆν˜Έμ™€ 같은 μ‹€μˆ˜λ₯Ό μ¦‰μ‹œ κ°•μ‘° ν‘œμ‹œν•œλ‹€. β†’ μ„œλ²„μ—μ„œ μ „μ†‘ν•œ μ½”λ“œλ‘œ 인해 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

API에 λŒ€ν•΄

πŸ’‘API λž€?

μ„œλ‘œ λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ„œλ‘œ ν†΅μ‹ ν•˜κ³  데이터λ₯Ό μ£Όκ³  받을 수 있게 ν•΄μ£ΌλŠ” 맀개체이자 κ·œμΉ™μ˜ 집합이닀.

핡심 μ—­ν• 

  • ν†΅λ‘œ μ—­ν•  : ν”„λ‘œκ·Έλž¨ κ°„μ˜ 데이터 전솑 ν†΅λ‘œλ₯Ό μ œκ³΅ν•œλ‹€.
  • ν‘œμ€€ν™” : μ„œλ‘œ λ‹€λ₯Έ μ–Έμ–΄λ‘œ λ§Œλ“€μ–΄μ§„ ν”„λ‘œκ·Έλž¨μ΄λΌλ„ APIλΌλŠ” 곡톡 규격이 μžˆλ‹€λ©΄ λŒ€ν™”κ°€ κ°€λŠ₯ν•˜λ‹€.
  • λ³΄μ•ˆ : λ‚΄λΆ€ μ†ŒμŠ€ μ½”λ“œλ₯Ό κ³΅κ°œν•˜μ§€ μ•Šκ³ λ„ ν•„μš”ν•œ κΈ°λŠ₯만 외뢀에 λ…ΈμΆœν•˜μ—¬ μ‚¬μš©ν•  수 있게 ν•œλ‹€.

배달 μ•±μ˜ 배달비 계산기 μ˜ˆμ‹œ

  • μž…λ ₯ 데이터(Request) : μ‚¬μš©μžμ˜ μ§‘ μ£Όμ†Œμ™€ μ£Όλ¬Έ κΈˆμ•‘μ„ API에 전달
  • API의 μ—­ν• 
    1. μ£Όμ†Œλ₯Ό 확인해 μ‹λ‹Ήκ³Όμ˜ 거리λ₯Ό 계산
    2. ν˜„μž¬ 날씨(λΉ„κ°€ μ˜€λŠ”μ§€ λ“±)와 λ°°λ‹¬μ›μ˜ μˆ˜κΈ‰ 상황을 체크
    3. μ£Όλ¬Έ κΈˆμ•‘μ— λ”°λ₯Έ 할인 ν˜œνƒμ„ 적용
  • κ²°κ³Ό λ°˜ν™˜(Response) : μ΅œμ’…μ μœΌλ‘œ μ‚¬μš©μžμ—κ²ŒλŠ” 배달비 3000μ›μ΄λΌλŠ” 결과만 λ”± 보여쀀닀.
  • μ£Όμ†Œ μ˜ˆμ‹œ : POST /calculate_delivery_fee
    • calculate(κ³„μ‚°ν•˜λ‹€)λΌλŠ” 동사

λ„μ„œκ΄€μ˜ λ„μ„œ 검색 ν‚€μ˜€μŠ€ν¬ μ˜ˆμ‹œ (RESTful)

  • μš”μ²­(Request) : ν‚€μ˜€μŠ€ν¬ 화면에 μ§±κ΅¬λΌλŠ” μ±… 제λͺ©μ„ μž…λ ₯
  • λ‚΄λΆ€ 처리 : μ‹œμŠ€ν…œμ€ λ„μ„œκ΄€μ˜ 수만 ꢌ의 μ±… DBμ—μ„œ β€œμ§±κ΅¬β€λ₯Ό μ°Ύκ³ , ν˜„μž¬ λŒ€μΆœ 쀑인지, μ–΄λŠ μ„œκ°€μ— μžˆλŠ”μ§€ 확인
  • 응닡(Response) : λŒ€μΆœ κ°€λŠ₯/3μΈ΅ λ§Œν™”μ±… μ½”λ„ˆ/청ꡬ기호 811.4λΌλŠ” 정보λ₯Ό 화면에 λ„μš΄λ‹€.
  • μ£Όμ†Œ μ˜ˆμ‹œ :GET /books/123
    • books(μ±…)λΌλŠ” λͺ…사

πŸ’‘μΈν„°νŽ˜μ΄μŠ€λž€?

  • λ‘˜ 이상이 마주 보고 μ†Œν†΅ν•˜λŠ” μ ‘μ μ΄λΌλŠ” 뜻으둜 연결에 의미λ₯Ό κ°€μ§„λ‹€.
  • 예) TV리λͺ¨μ»¨μ€ μ‚¬λžŒκ³Ό TV ν”„λ‘œκ·Έλž¨μ΄ μ†Œν†΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

REST 응닡에 λŒ€ν•΄

πŸ’‘REST 응닡 μ΄ν•΄ν•˜κΈ°

  • μƒνƒœ μ½”λ“œ(state code) : κ²°κ³Όλ₯Ό μ„€λͺ…ν•œλ‹€. (예 : 200, 201, 204, 400, 401, 404, 500)

  • 헀더 (header) : 메타데이터 (예 : μ½˜ν…μΈ -νƒ€μž…, μΊμ‹œ-μ œμ–΄, 속도 μ œν•œ 헀더)

  • λ³Έλ¬Έ (body) : 데이터 ν‘œν˜„ (JSON)

    HTTP/1.1 200 OK
    Content-Type: application/json
    Cache-Control: max-age=3600
    X-RateLimit-Remaining: 95
    {
      "success": true,
      "data": {
        "product_id": "789",
        "name": "Developer Toolkit",
        "price": 49.99
      }
    }"

REST API에 λŒ€ν•΄

πŸ’‘REST API λž€?

μœ„μ˜ REST원칙을 기반으둜 ν•œ API 섀계 방식이닀.

  • μ›Ή μžμ›μ„ URL둜 μ •μ˜ν•˜κ³ , HTTP λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄ ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ CRUD μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

    HTTP λ©”μ„œλ“œURLμ„€λͺ…
    GET/usersλͺ¨λ“  μœ μ € 정보λ₯Ό λΆˆλŸ¬μ˜¨λ‹€.
    GET/users/1νŠΉμ • μœ μ €(pk=1) 정보λ₯Ό λΆˆλŸ¬μ˜¨λ‹€.
    POST/usersμƒˆλ‘œμš΄ μœ μ €λ₯Ό μƒμ„±ν•œλ‹€.
    PUT/users/1νŠΉμ • μœ μ €(pk=1) 정보λ₯Ό 전체 μˆ˜μ •ν•œλ‹€.
    PATCH/users/1νŠΉμ • μœ μ €(pk=1) 정보λ₯Ό λΆ€λΆ„ μˆ˜μ •ν•œλ‹€.
    DELETE/users/1νŠΉμ • μœ μ €(pk=1) 정보λ₯Ό μ‚­μ œν•œλ‹€.
  1. μ•ˆμ •μ„±(Safe)
    • GET λ©”μ„œλ“œ(쑰회)λŠ” μ•ˆμ „ν•˜λ‹€.
      • μ €μž₯된 데이터λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • POST, DELETE, PUT, PATCHλŠ” μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.
      • 데이터λ₯Ό 생성, μˆ˜μ •, μ‚­μ œν•œλ‹€.
  2. λ©±λ“±μ„±(Idempotent)
    • ν•œλ²ˆμ„ ν˜ΈμΆœν•˜κ±°λ‚˜ μˆ˜μ²œλ²ˆμ„ ν˜ΈμΆœν•˜κ±°λ‚˜ 항상 κ²°κ³ΌλŠ” κ°™λ‹€.
      • GET β†’ 같은 κ²°κ³Όκ°€ 계속 μ‘°νšŒλœλ‹€.
      • PUT β†’ μˆ˜μ •ν•΄μ„œ λŒ€μ²΄λœ ν›„μ˜ κ²°κ³ΌλŠ” 계속 κ°™λ‹€.
      • DELETE β†’ 같은 μš”μ²­μ„ μ—¬λŸ¬λ²ˆν•΄λ„ μ‚­μ œλœ κ²°κ³ΌλŠ” κ°™λ‹€.
      • POST β†’ 멱등성을 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
        • λˆ„λ₯Ό λ•Œλ§ˆλ‹€ 데이터가 계속 μƒˆλ‘œ 생김
  3. μΊμ‹œ κ°€λŠ₯μ„±(Cacheable)
    • μž¬μ‚¬μš©μ„ μœ„ν•΄ μš”μ²­μ— λŒ€ν•œ 응닡을 μ €μž₯ν•  수 μžˆμ„κΉŒ?
      • GET, HEAD, POST λ©”μ†Œλ“œλŠ” μΊμ‹œκ°€ κ°€λŠ₯ν•˜λ‹€.
      • 일반적으둜 GET, HEAD μ •λ„λ§Œ μΊμ‹œλ‘œ μ‚¬μš©ν•œλ‹€.
      • λ³€κ²½ κ°€λŠ₯성이 적은 정적 μžμ›(HTML, CSS, IMAGE, JS λ“±)을 주둜 μΊμ‹±ν•œλ‹€.

REST API의 URL 넀이밍 κ·œμΉ™

  1. λͺ…사λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¦¬μ†ŒμŠ€λ₯Ό ν‘œν˜„

    • λ¦¬μ†ŒμŠ€λŠ” 동사가 μ•„λ‹Œ λͺ…μ‚¬λ‘œ ν‘œν˜„
    • 단일 λ¦¬μ†ŒμŠ€(객체 μΈμŠ€ν„΄μŠ€ λ“±)에 λŒ€ν•΄μ„œλŠ” λ‹¨μˆ˜ λͺ…사λ₯Ό μ‚¬μš©
    • ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ λ¦¬μ†ŒμŠ€μ— λŒ€ν•΄μ„œλŠ” 볡수 λͺ…사λ₯Ό μ‚¬μš©
    βœ… μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
    GET /users
    GET /users/admin
    GET /users/{id}/playlists
    
    ❌ 잘λͺ»λœ μ˜ˆμ‹œ
    GET /getUsers
    GET /users/admins
    GET /user/{id}/playlist
  2. 일관성이 핡심

    • 계측적 관계λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄μ„œλŠ” μŠ¬λž˜μ‹œ( / )λ₯Ό μ‚¬μš©
    • URL λ§ˆμ§€λ§‰μ— 슬래슀( / )λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • URL 가독성을 μœ„ν•΄ ν•˜μ΄ν”ˆ( - )을 μ‚¬μš©
    • 언더라인( _ )을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • URL에 μ†Œλ¬Έμžλ₯Ό μ‚¬μš©
    βœ… μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
    GET /order-management/customer-orders
    GET /order-management/customer-orders/{order-id}
    GET /order-management/customer-orders/{order-id}/order-items
    
    ❌ 잘λͺ»λœ μ˜ˆμ‹œ
    GET /order-management/customer-orders/
    GET /ordeManagement/customerOrders
    GET /order_management/customer_orders
  3. 파일 ν™•μž₯자λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

    • URL에 파일 ν™•μž₯자λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    βœ… μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
    GET /content-management/authors
    
    ❌ 잘λͺ»λœ μ˜ˆμ‹œ
    GET /content-management/authors.xml
  4. CRUD ν•¨μˆ˜ 이름을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

    • URL에 CRUD κΈ°λŠ₯을 λ‚˜νƒ€λ‚΄λŠ” 단어λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    βœ… μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
    GET /user-accounts
    
    ❌ 잘λͺ»λœ μ˜ˆμ‹œ
    GET /get-all-users
  5. 쿼리 νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•΄ λ¦¬μ†ŒμŠ€λ₯Ό ν•„ν„°λ§ν•œλ‹€.

    • μƒˆλ‘œμš΄ API 생성을 μ§€μ–‘ν•˜κ³ , 쿼리 νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•΄ λ¦¬μ†ŒμŠ€λ₯Ό ν•„ν„°λ§ν•œλ‹€.
    βœ… μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
    GET /drivers?status=active
    GET /drivers?region=KR&age=30
    GET /drivers?page=2&limit=100

REST API의 μž‘λ™μ›λ¦¬μ— λŒ€ν•΄

πŸ’‘REST API의 μž‘λ™ 원리

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ„ μ‹œμž‘ν•œλ‹€.

    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ API μ•€λ“œν¬μΈνŠΈμ— HTTP μš”μ²­μ„ 보낸닀.
  2. λ„€νŠΈμ›Œν¬ 이동 μš”μ²­

    • λ„€νŠΈμ›Œν¬ 이동 μš”μ²­ : μš”μ²­μ€ HTTP/HTTPSλ₯Ό 톡해 인터넷을 톡해 μ„œλ²„μ— λ„λ‹¬ν•œλ‹€.
  3. μ„œλ²„κ°€ μš”μ²­μ„ 처리

    • APIλŠ” μž…λ ₯을 κ²€μ¦ν•˜κ³  λ…Όλ¦¬λ‚˜ κΈ°λŠ₯을 μˆ˜ν–‰
  4. DB 운영

    • ν•„μš” μ‹œ μ„œλ²„κ°€ DBλ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈ ν•œλ‹€.
  5. 응닡 생성

    • μ„œλ²„λŠ” μƒνƒœ μ½”λ“œ, 헀더, 본문이 ν¬ν•¨λœ κ΅¬μ‘°ν™”λœ 응닡(μ’…μ’… JSON ν˜•μ‹)을 λ°˜ν™˜
  6. 닡변이 λŒμ•„μ˜΄

    • ν΄λΌμ΄μ–ΈνŠΈλŠ” 응닡을 λ°›κ³  UI λ Œλ”λ§, 둜그, μΆ”κ°€ 호좜 λ“± 이λ₯Ό 처리

RESTful API에 λŒ€ν•΄

πŸ’‘REST 섀계 원칙을 μΆ©μ‹€ν•˜κ²Œ μ œλŒ€λ‘œ μ§€ν‚€λŠ” APIλ₯Ό 의미

ꡬ뢄REST(배달 μ•± 방식)RESTful(λ„μ„œκ΄€ 방식)
섀계 μ΄ˆμ μ–΄λ–€ κΈ°λŠ₯을 μˆ˜ν–‰ν•  것인가?μ–΄λ–€ μžμ›μ„ λ‹€λ£° 것인가?
URL ꡬ쑰/get_price, /order_food(동사 포함 κ°€λŠ₯)/prices, /orders(였직 λͺ…μ‚¬λ§Œ μ‚¬μš©)
κ°€λ…μ„±κ°œλ°œμžκ°€ μ •ν•œ κ·œμΉ™μ„ λ”°λ‘œ 곡뢀해야 ν•¨μ£Όμ†Œμ™€ λ©”μ„œλ“œλ§Œ 봐도 λˆ„κ΅¬λ‚˜ μ˜λ„λ₯Ό 이해함
μ—„κ²©ν•¨β€œλ°μ΄ν„°λ§Œ 잘 μ˜€κ°€λ©΄ λ˜μ§€!!” (μ‹€μš©μ£Όμ˜)β€œμ›μΉ™μ„ μ§€μΌœμ•Ό μœ μ§€λ³΄μˆ˜κ°€ 쉽닀” (원칙 주의)
  • λΉ„-RESTful: /get_work_hours?name=홍길동&start=20240101 (동사 μ‚¬μš©)
  • RESTful: GET /employees/hong-gildong/work-hours?from=2024-01-01&to=2024-01-31 (μžμ› 쀑심)

πŸ“Œ
Q. 이 APIλŠ” REST APIμΈκ°€μš”?
A. 그건 REST API라고 λΆ€λ₯Ό 순 μžˆμ§€λ§Œ, 원칙을 μ–΄κ²ΌμœΌλ‹ˆ RESTful ν•˜μ§€λŠ” μ•Šλ„€μš”.
β†’ μ’€ 더 μ „λ¬Έκ°€ λŠλ‚Œ

RESTful API μš”μ²­ 처리 흐름(5단계)

RESTful API μš”μ²­ 처리 흐름 (5단계)

  1. [μΆœμž…κ΅¬] Controller : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ κ°€μž₯ λ¨Όμ € λ°›λŠ”λ‹€. μš”μ²­ μ£Όμ†Œ(URL)와 방식(GET, POST λ“±)을 ν™•μΈν•˜κ³  λ‹΄λ‹Ήμž(Service)μ—κ²Œ λ„˜κΈ΄λ‹€.
    1. ν΄λΌμ΄μ–ΈνŠΈ : β€œκ·œκ²©μ— λ§žμΆ°μ„œ λ³΄λ‚Όκ²Œ GETλ°©μ‹μœΌλ‘œ /users/1μ£Όμ†Œλ‘œ μš”μ²­!!”
    2. 컨트둀러 : β€œμ˜€μΌ€μ΄, 1번 μœ μ € 정보 λ‹¬λΌλŠ” κ±°μ§€? Serviceμ•Ό! 데이터 μ’€ 가져와 봐”
  2. [κ°œλ… ] Stateless (λ¬΄μƒνƒœμ„±) : 이 μ‹œμ μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 인증 정보(token λ“±)λ₯Ό ν™•μΈν•œλ‹€.
    1. β€œμ„œλ²„λŠ” 당신이 λˆ„κ΅°μ§€ κΈ°μ–΅ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ‹ˆ μš”μ²­μ„œμ— λͺ¨λ“  정보λ₯Ό λ‹€ λ‹΄μ•„μ„œ μ™”κ² μ§€?”
  3. [인증/검증] Security/Filter (ν•„ν„°) : (선택 사항 / μ€‘μš”) μš”μ²­ν•œ μ‚¬λžŒμ΄ λ§žλŠ”μ§€, κΆŒν•œμ΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
  4. [μ£Όλ°©] Service (μ„œλΉ„μŠ€) : μ‹€μ œ 핡심 둜직 (계산, 가곡 λ“±)을 μ²˜λ¦¬ν•œλ‹€. 데이터가 ν•„μš”ν•˜λ©΄ μ°½κ³ (Repository)에 μš”μ²­ν•œλ‹€.
    1. DBκ°€κΈ° μ „ : β€œμž κΉλ§Œ, Repositoryμ•Ό DBκ°€μ„œ 1번 μœ μ € μžˆλŠ”μ§€ 확인해봐!”
    2. DBκ°„ ν›„ : β€œλ°›μ•˜λ‹€! 이 데이터λ₯Ό ν΄λΌμ΄μ–ΈνŠΈκ°€ 보기 μ’‹κ²Œ κ°€κ³΅ν•΄μ„œ Controllerμ—κ²Œ μ€„κ²Œ!”
  5. [μ°½κ³ ] Repository(λ ˆν¬μ§€ν† λ¦¬) : DB에 직접 μ ‘κ·Όν•˜μ—¬ 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μ €μž₯ν•œλ‹€.
    1. β€œμ—¬κΈ° μžˆμ–΄!(DBμ—μ„œ 데이터λ₯Ό κΊΌλ‚΄ Service에 전달)”
  6. [λ°˜ν™˜] Controller : μ„œλΉ„μŠ€κ°€ μ²˜λ¦¬ν•œ κ²°κ³Όλ₯Ό λ°›μ•„μ„œ, ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 규격(JSON + μƒνƒœ μ½”λ“œ)에 맞좰 응닡을 보낸닀.
    1. β€œμ™„λ²½ν•΄! μƒνƒœ μ½”λ“œ 200 ok 찍고, 결과물은 JSON으둜 포μž₯ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보낸닀.”
  • RESTful API 배달 μ‹œμŠ€ν…œμœΌλ‘œ μ˜ˆμ‹œ
    • ν΄λΌμ΄μ–ΈνŠΈ (μ†λ‹˜): μ•±μœΌλ‘œ GET /pizzas/1 (1번 ν”Όμž μ£Όμ„Έμš”)라고 κ·œκ²©ν™”λœ 주문을 λ„£λŠ”λ‹€.
    • Controller (μΉ΄μš΄ν„° 직원): 주문을 μ ‘μˆ˜ν•˜κ³ , μ£Όλ°©(Service)에 μ „λ‹¬ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μ— μ™„μ„±λœ ν”Όμžλ₯Ό μ†λ‹˜μ—κ²Œ λ°°λ‹¬ν•œλ‹€.
    • Service (μš”λ¦¬μ‚¬): ν”Όμžλ₯Ό λ§Œλ“­λ‹ˆλ‹€. μž¬λ£Œκ°€ ν•„μš”ν•˜λ©΄ μ°½κ³ (Repository)μ—μ„œ κ°€μ Έμ˜¨λ‹€.
    • Repository (μ°½κ³  κ΄€λ¦¬μž): 냉μž₯κ³ (DB)μ—μ„œ 재료λ₯Ό κΊΌλ‚΄ μš”λ¦¬μ‚¬μ—κ²Œ μ€€λ‹€.
    • 응닡 (배달): μΉ΄μš΄ν„° 직원이 ν”Όμžμ™€ ν•¨κ»˜ 200 OK (성곡) μ˜μˆ˜μ¦μ„ λΆ™μ—¬ μ†λ‹˜μ—κ²Œ 보낸닀.

RESTful API μ„œλ²„ 응닡에 무엇이 ν¬ν•¨λ˜μ–΄μžˆμ„κΉŒ?

1. μƒνƒœ ν‘œμ‹œμ€„

  • 2xx : 일반 성곡 응닡
  • 201 : POST λ©”μ„œλ“œ 성곡 응닡
  • 4xx : μ„œλ²„κ°€ μ²˜λ¦¬ν•  수 μ—†λŠ” 잘λͺ»λœ μš”μ²­(ν΄λΌμ΄μ–ΈνŠΈ 잘λͺ»)
  • 404 : λ¦¬μ†ŒμŠ€λ₯Ό 찾을 수 μ—†μŒ
  • 5xx : μ„œλ²„ λ‚΄λΆ€ 였λ₯˜

2. λ©”μ‹œμ§€ λ³Έλ¬Έ

  • 응닡 λ³Έλ¬Έμ—λŠ” λ¦¬μ†ŒμŠ€ ν‘œν˜„μ΄ ν¬ν•¨λœλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” 데이터 μž‘μ„± 방식을 XML λ˜λŠ” JSON ν˜•μ‹μœΌλ‘œ 정보λ₯Ό μš”μ²­ν•  수 μžˆλ‹€.
  • 예 ) ν΄λΌμ΄μ–ΈνŠΈκ°€ Johnμ΄λΌλŠ” μ‚¬λžŒμ˜ 이름과 λ‚˜μ΄λ₯Ό μš”μ²­ν•˜λ©΄ μ„œλ²„λŠ” JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
'{"name":"John", "age":30}'

3. 헀더

  • μ‘λ‹΅μ—λŠ” 응닡에 λŒ€ν•œ 헀더 λ˜λŠ” 메타이터도 ν¬ν•¨λœλ‹€.

  • Content-Type (μ€‘μš”!!)

    • μ„œλ²„κ°€ λ³΄λ‚΄λŠ” λ³Έλ¬Έ 데이터가 μ–΄λ–€ ν˜•μ‹μΈ μ•Œλ €μ€€λ‹€.
    • application/json : κ°€μž₯ 많이 μ“°μ΄λŠ” JSON ν˜•μ‹
    • text/html : HTML νŽ˜μ΄μ§€
    • image/png : 이미지 파일

    β†’ 이 헀더가 μžˆμ–΄μ•Ό ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)κ°€ 데이터λ₯Ό κΈ€μžλ‘œ 보여쀄지, 그림으둜 보여쀄지 κ²°μ •ν•œλ‹€.

  • Cache-Control

    • 데이터λ₯Ό λΈŒλΌμš°μ €μ— μ–Όλ§ˆλ‚˜ 였래 μ €μž₯(캐싱)ν•΄λ‘˜μ§€ κ²°μ •ν•œλ‹€.
    • no-store : μ ˆλŒ€ μ €μž₯ν•˜μ§€ 마라(λ³΄μ•ˆμ΄ μ€‘μš”ν•œ 데이터)
    • max-age=3600 : 1μ‹œκ°„ λ™μ•ˆμ€ μ„œλ²„μ— λ‹€μ‹œ 묻지 말고 μ €μž₯된 κ±Έ 써라

    β†’ 이λ₯Ό 톡해 μ„œλ²„ λΆ€ν•˜λ₯Ό 쀄이고 속도λ₯Ό 높일 수 μžˆλ‹€.

  • Set-Cookie

    • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ β€œμ΄ 정보λ₯Ό λ„€ 컴퓨터에 μ €μž₯해둬”라고 μš”μ²­ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
    • 주둜 둜그인 μ„Έμ…˜ μ •λ³΄λ‚˜ μ‚¬μš©μž μ„€μ • 값을 μ €μž₯ν•˜μ—¬ λ‹€μŒ μš”μ²­ λ•Œ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μ‹œ 보낼 수 있게 ν•œλ‹€.
    • λ§Œλ£ŒκΈ°κ°„(expire, max-age), μ‚¬μš©λ  μœ„μΉ˜(domain, path)λ₯Ό μ„€μ •ν•  수 μžˆλ‹€.
    • μ£Όμ˜ν•  점
      • 항상 μ„œλ²„μ— μ „λ‹¬λ˜λ‹ˆ μ΅œμ†Œν•œμ˜ μ •λ³΄λ§Œ μ‚¬μš©ν•˜μ—¬ νŠΈλž˜ν”½μ„ μ΅œμ ν™” μ‹œμΌœμ•Ό ν•œλ‹€.
      • νƒˆμ·¨ λ‹Ήν•˜κΈ° μ‰¬μš°λ‹ˆ λ³΄μ•ˆμ— λ―Όκ°ν•œ κ°œμΈμ •λ³΄ 등은 μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • Access-Control-Allow-Origin(CORS κ΄€λ ¨)

    • 이 응닡은 μ–΄λ–€ μ›Ήμ‚¬μ΄νŠΈμ—μ„œ 읽을 수 μžˆλŠ”μ§€ ν—ˆμš© λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    • λ³΄μ•ˆμƒμ˜ 이유둜 λΈŒλΌμš°μ €λŠ” λ‹€λ₯Έ λ„λ©”μΈμ—μ„œμ˜ API ν˜ΈμΆœμ„ λ§‰λŠ”λ°, 이λ₯Ό ν—ˆμš©ν•΄μ€„ λ•Œ μ‚¬μš©ν•˜λŠ” μ•„μ£Ό μ€‘μš”ν•œ 헀더이닀.
  • Location

    • μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λ˜μ—ˆκ±°λ‚˜(201 Created), νŽ˜μ΄μ§€κ°€ μ΄λ™ν–ˆμ„ λ•Œ (3XX) 이동할 URL μ£Όμ†Œλ₯Ό λ‹΄λŠ”λ‹€.

RESTful API 인증 방법에 λŒ€ν•΄

πŸ’‘RESTful API 인증

인증은 당신이 λˆ„κ΅¬μΈμ§€ 증λͺ…ν•˜λŠ” 과정이닀. μ„œλ²„λŠ” μ‹ λ’°ν•  수 μžˆλŠ” μš”μ²­μΈμ§€ ν™•μΈν•œ λ’€μ—λ§Œ λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•œλ‹€.

  1. HTTP 기본 인증 (Basic Auth)
    • 방식 : Authorization : Basice [ID:PWλ₯Ό Base64둜 μΈμ½”λ”©ν•œ κ°’
    • 주의 : Base64λŠ” μ•”ν˜Έν™”κ°€ μ•„λ‹Œ λ‹¨μˆœ μΈμ½”λ”©μ΄λ―€λ‘œ, λ°˜λ“œμ‹œ HTTPS μ•”ν˜Έν™” 톡신과 ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  2. μ „λ‹¬μž 인증(Bearer/Token Auth)
    • 방식 : Authorization: Bearer [Access_Token]
    • μž₯점: μ„œλ²„κ°€ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ”(Stateless) REST의 νŠΉμ„±μ— κ°€μž₯ 잘 λ§žλ‹€. 토큰에 유효 기간을 μ„€μ •ν•  수 μžˆμ–΄ λ³΄μ•ˆμ„±μ΄ λ†’λ‹€.
  3. API ν‚€ (API Key)
    • 방식: 쿼리 νŒŒλΌλ―Έν„°λ‚˜ 헀더(x-api-key)에 ν‚€λ₯Ό ν¬ν•¨ν•œλ‹€.
    • μš©λ„: μ„œλΉ„μŠ€ 이용 κΆŒν•œ 확인 및 νŠΈλž˜ν”½ μ œν•œ(Throttling) 관리에 주둜 쓰인닀.
  4. OAuth 2.0 (Open Authorization)
    • 핡심: μ‚¬μš©μžκ°€ μ„œλΉ„μŠ€(A)에 μžμ‹ μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ£Όμ§€ μ•Šκ³ λ„, λ‹€λ₯Έ μ„œλΉ„μŠ€(B)의 μžμ›μ„ μ“Έ 수 있게 ν•΄μ£ΌλŠ” κΆŒν•œ μœ„μž„ ν‘œμ€€μ΄λ‹€.
    • ꡬ성: Access Token, Refresh Token을 μ‚¬μš©ν•˜μ—¬ 맀우 μ„Έλ°€ν•œ λ³΄μ•ˆ μ œμ–΄κ°€ κ°€λŠ₯ν•˜λ‹€.
  5. WWW-Authenticate
    • 방식 : 이 ν—€λ”λŠ” 주둜 401 Unauthorized μƒνƒœ μ½”λ“œμ™€ ν•¨κ»˜ μ„ΈνŠΈλ‘œ 움직인닀.
    • 상황: ν΄λΌμ΄μ–ΈνŠΈκ°€ 인증 정보 없이(ν˜Ήμ€ 잘λͺ»λœ μ •λ³΄λ‘œ) 보호된 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•œλ‹€.
    • μ„œλ²„μ˜ 응닡: "μ•ˆλΌ! (401)"라고 ν•˜λ©΄μ„œ WWW-Authenticate 헀더에 μ–΄λ–€ 인증 방식을 써야 ν•˜λŠ”μ§€ μ μ–΄μ„œ 보낸닀.
    • WWW-Authenticate: Basic realm="api" (ID/PW 방식 μš”κ΅¬)
    • WWW-Authenticate: Bearer realm="token_required" (토큰 방식 μš”κ΅¬)

πŸ”— μ°Έκ³  자료 (Reference)

슀파λ₯΄νƒ€ μ›Ή 개발 기초 κ°•μ˜ 자료

https://devpro.kr/posts/rest-restful-api/

https://blog.postman.com/rest-api-examples/
https://aws.amazon.com/ko/what-is/restful-api/

0개의 λŒ“κΈ€