Home > Backend Development > πŸ“š[Backend Development] CRUD 각 κΈ°λŠ₯별 Request/Response Body 원칙과 νŒ¨ν„΄ μ™„λ²½ μ΄ν•΄ν•˜κΈ°

πŸ“š[Backend Development] CRUD 각 κΈ°λŠ₯별 Request/Response Body 원칙과 νŒ¨ν„΄ μ™„λ²½ μ΄ν•΄ν•˜κΈ°
Backend Ddevelopment HTTP RESTful API API Architecture CRUD

🌏 CRUD 각 κΈ°λŠ₯별 Request/Response Body 원칙과 νŒ¨ν„΄ μ™„λ²½ μ΄ν•΄ν•˜κΈ°

μ™œ 이 λ¬Έμ„œλ₯Ό μž‘μ„±ν–ˆλ‚˜? πŸ€”
API λͺ…μ„Έμ„œ μž‘μ„± κ³Όμ •μ—μ„œ CRUD의 Request / Response Body μ˜ˆμ‹œλ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ, Request / Response Body에 λŒ€ν•œ
μž‘μ„± 원칙과 νŒ¨ν„΄μ„ μ œλŒ€λ‘œ μ•Œμ§€ λͺ»ν•˜μ—¬ μ •λ¦¬ν•œ ν•™μŠ΅ λ…ΈνŠΈμž…λ‹ˆλ‹€.

🎯 핡심 λͺ©ν‘œ.

CRUD의 Request / Response Body μž‘μ„± 원칙과 방법을 μ™„λ²½νžˆ μ΄ν•΄ν•˜μž!

πŸͺ΅πŸ¦Ά λͺ©μ°¨

  1. CRUD의 Request / Response Body μž‘μ„± 원칙.
  2. CRUD의 Request / Response Body μž‘μ„± 방법.

πŸ“¦ CRUD의 Request / Response Body μž‘μ„± 원칙

API λͺ…μ„Έμ„œμ˜ BodyλŠ” β€˜μ΅œμ†Œν•œμ˜ μ •λ³΄λ‘œ λͺ…ν™•ν•˜κ²Œ μ†Œν†΅ν•œλ‹€β€™ λŠ” λŒ€μ›μΉ™μ„ λ”°λ¦…λ‹ˆλ‹€.
각 HTTP Method의 역할에 따라 ν•„μš”ν•œ 정보λ₯Ό 주고받도둝 μ„€κ³„ν•©λ‹ˆλ‹€.

  • C (Create - POST):
    • Request :
      • μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό λ§Œλ“œλŠ” 데 ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό λ‹΄μŠ΅λ‹ˆλ‹€.
      • 단, μ„œλ²„κ°€ μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” κ°’(ID, μƒμ„±μΌμ‹œ λ“±)은 μ œμ™Έν•©λ‹ˆλ‹€.
    • Response :
      • μƒμ„±λœ λ¦¬μ†ŒμŠ€μ˜ μ™„μ „ν•œ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜μ—¬, ν΄λΌμ΄μ–ΈνŠΈκ°€ IDλ‚˜ μ„œλ²„ 생성 값을 λ‹€μ‹œ μš”μ²­ν•  ν•„μš”κ°€ μ—†κ²Œ ν•©λ‹ˆλ‹€.
  • R (Read - GET):
    • Request :
      • Bodyλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      • λͺ¨λ“  쑰건은 URL 경둜(Path Variable)λ‚˜ 쿼리 νŒŒλΌλ―Έν„°(Query Parameter)둜 μ „λ‹¬ν•©λ‹ˆλ‹€.
    • Response :
      • 쑰회된 λ¦¬μ†ŒμŠ€μ˜ 정보λ₯Ό λ‹΄μŠ΅λ‹ˆλ‹€.
      • 단일 λ¦¬μ†ŒμŠ€λŠ” 객체({}), λͺ©λ‘μ€ λ°°μ—΄([]) 둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • U (Update - PATCH / PUT):
    • Request :
      • λ³€κ²½ν•˜λ €λŠ” λ°μ΄ν„°λ§Œ λ‹΄μŠ΅λ‹ˆλ‹€.
      • PATCHλŠ” λ³€κ²½ν•  ν•„λ“œλ§Œ, PUTλŠ” λ¦¬μ†ŒμŠ€ 전체λ₯Ό λ³΄λƒ…λ‹ˆλ‹€.
    • Response :
      • μˆ˜μ •μ΄ μ™„λ£Œλœ λ¦¬μ†ŒμŠ€μ˜ μ™„μ „ν•œ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜μ—¬, ν΄λΌμ΄μ–ΈνŠΈκ°€ μˆ˜μ • κ²°κ³Όλ₯Ό λͺ…ν™•νžˆ μ•Œ 수 있게 ν•©λ‹ˆλ‹€.
  • D (Delete - DELETE):
    • Request :
      • Bodyλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      • μ‚­μ œν•  λŒ€μƒμ€ URL 경둜둜 μ‹λ³„ν•©λ‹ˆλ‹€.
    • Response :
      • μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŒμ„ μ•Œλ¦¬κΈ° μœ„ν•΄ Bodyλ₯Ό λΉ„μ›Œλ‘λŠ” 것이 μ›μΉ™μž…λ‹ˆλ‹€. (μƒνƒœ μ½”λ“œ 204 No Content μ‚¬μš©)

πŸ“¦ CRUD의 Request / Response Body μž‘μ„± 방법

μœ„ 원칙에 따라 μ˜ˆμ‹œμΈ β€˜μƒν’ˆ 관리 APIβ€™μ˜ 각 Bodyλ₯Ό μ–΄λ–»κ²Œ μž‘μ„±ν•˜λŠ”μ§€ λ³΄μ—¬λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

C: μƒν’ˆ 등둝 (POST /products)

  • Request Body:
    • λͺ©μ :
      • μ‹ κ·œ μƒν’ˆ 정보와 초기 재고 정보λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.
    • λ‚΄μš©:
      • productName, productSaleCost, initialStockCount, expirationDate λ“± μ‚¬μš©μžκ°€ 직접 μž…λ ₯ν•΄μ•Ό ν•˜λŠ” λͺ¨λ“  ν•„λ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
      • productIdλŠ” ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
{
    "productName": "μ‹ μ„ ν•œ λͺ©μž₯ 우유 1L",
    "productSaleCost": 2500,
    "initialStockCount": 5,
    "expirationDate": "2025-08-18"
}
  • Response Body:
    • λͺ©μ :
      • μ„œλ²„μ—μ„œ μƒμ„±λœ productId, createdAtκ³Ό κ³„μ‚°λœ margin 등을 ν¬ν•¨ν•œ μ™„μ „ν•œ μƒν’ˆ 정보λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ•Œλ €μ€λ‹ˆλ‹€.
    • λ‚΄μš©:
      • productIdλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  ν•„λ“œμ™€ κ³„μ‚°λœ 값을 λ‹΄μŠ΅λ‹ˆλ‹€.
{
    "productId": "8801234567890",
    "productName": "μ‹ μ„ ν•œ λͺ©μž₯ 우유 1L",
    "totalStockCount": 8,
    "createdAt": "2025-08-09",
    "margin": 25.5,
    ...
}

R: μƒν’ˆ 검색 (GET /products?name=...)

  • Request Body:
    • μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • Response Body:
    • λͺ©μ :
      • 검색 쑰건에 λ§žλŠ” μƒν’ˆ λͺ©λ‘μ„ μ „λ‹¬ν•©λ‹ˆλ‹€.
    • λ‚΄μš©:
      • 각 μƒν’ˆμ˜ μš”μ•½ 정보λ₯Ό 담은 κ°μ²΄λ“±μ˜ λ°°μ—΄([]) ν˜•νƒœμž…λ‹ˆλ‹€.
      • κ²°κ³Όκ°€ μ—†μœΌλ©΄ 빈 λ°°μ—΄([])을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
[
    { "productId": "8801234567890", "productName": "μ‹ μ„ ν•œ λͺ©μž₯ 우유 1L", ...},
    { "productId": "8801234145725", "productName": "진라면 μˆœν•œλ§› 1ea", ... },
]

U: μƒν’ˆ μˆ˜μ • (PATCH /products/{productId})

  • Request Body:
    • λͺ©μ :
      • λ³€κ²½ν•  μ •λ³΄λ§Œ μ „λ‹¬ν•˜μ—¬ νš¨μœ¨μ„±μ„ λ†’μž…λ‹ˆλ‹€.
    • λ‚΄μš©:
      • productSaleCost, productDiscountRate λ“± 변경이 ν•„μš”ν•œ ν•„λ“œλ§Œ ν¬ν•¨ν•©λ‹ˆλ‹€.
{
    "productSaleCost": 3200
    "productDiscountRate": 20
}
  • Response Body:
    • λͺ©μ :
      • μˆ˜μ •μ΄ 반영된 μ΅œμ’… κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈκ°€ 확인할 수 μžˆκ²Œν•©λ‹ˆλ‹€.
    • λ‚΄μš©:
      • μˆ˜μ •λœ ν•„λ“œλΏλ§Œ μ•„λ‹ˆλΌ, 그둜 인해 ν•¨κ»˜ λ³€κ²½λœ 계산값(margin λ“±)κΉŒμ§€ ν¬ν•¨ν•œ μƒν’ˆμ˜ 전체 정보λ₯Ό λ‹΄μŠ΅λ‹ˆλ‹€.
{
    "productId": "8801234567890",
    "productSaleCost": 3200,
    "productDiscountRate": 20,
    "margin": 31.2 // μž¬κ³„μ‚°λœ κ°’
    ...
}

D: μƒν’ˆ μ‚­μ œ (DELETE /products/{productId})

  • Request Body:
    • μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • Response Body:
    • λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • μ‚­μ œ 성곡 μ—¬λΆ€λŠ” HTTP μƒνƒœ μ½”λ“œ(204 No Content)둜 μ „λ‹¬ν•©λ‹ˆλ‹€.