λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
SpringBoot

[SpringBoot] RESTful API

by 개발LOG 2025. 1. 14.
λ°˜μ‘ν˜•

RESTful APIλŠ” REpresentational State Transfer (μƒνƒœ 전달 ν‘œν˜„) μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ„ 기반으둜 ν•œ μ›Ή APIμž…λ‹ˆλ‹€. RESTλŠ” μ›Ή μ„œλΉ„μŠ€μ˜ 섀계λ₯Ό μœ„ν•œ μ•„ν‚€ν…μ²˜μ  κ·œμΉ™κ³Ό μ œμ•½μ„ λ”°λ₯΄λ©°, HTTP ν”„λ‘œν† μ½œμ„ 톡해 μžμ›(Resource)을 μ •μ˜ν•˜κ³ , 이λ₯Ό HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)둜 μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

RESTful API의 μ£Όμš” νŠΉμ§•

  1. μžμ›(Resource): RESTful APIμ—μ„œλŠ” "μžμ›"이 기본적인 κ°œλ…μž…λ‹ˆλ‹€. μžμ›μ€ μ›Ήμ—μ„œ μ²˜λ¦¬ν•˜κ³ μž ν•˜λŠ” λŒ€μƒμ΄λ©°, URL을 톡해 μ‹λ³„λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, "μ±…"μ΄λΌλŠ” μžμ›μ„ 닀룬닀면, κ·Έ 책은 http://example.com/books/123와 같이 URL둜 ν‘œν˜„λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ 123은 νŠΉμ • μ±…μ˜ 고유 μ‹λ³„μž(ID)κ°€ λ©λ‹ˆλ‹€.
  2. HTTP λ©”μ„œλ“œ (CRUD와 λ§€ν•‘): RESTful APIμ—μ„œλŠ” HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)λ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ›μ— λŒ€ν•œ μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€. 각 HTTP λ©”μ„œλ“œλŠ” CRUD(Create, Read, Update, Delete) μž‘μ—…κ³Ό λ§€ν•‘λ©λ‹ˆλ‹€.
    • GET: μžμ›μ„ 쑰회(읽기)ν•©λ‹ˆλ‹€. (GET /books → μ±… λͺ©λ‘ 쑰회, GET /books/123 → νŠΉμ • μ±… 쑰회)
    • POST: μƒˆλ‘œμš΄ μžμ›μ„ μƒμ„±ν•©λ‹ˆλ‹€. (POST /books → μƒˆλ‘œμš΄ μ±… 생성)
    • PUT: κΈ°μ‘΄ μžμ›μ„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. (PUT /books/123 → νŠΉμ • μ±… μˆ˜μ •)
    • DELETE: μžμ›μ„ μ‚­μ œν•©λ‹ˆλ‹€. (DELETE /books/123 → νŠΉμ • μ±… μ‚­μ œ)
  3. μƒνƒœ λΉ„μ €μž₯μ„± (Stateless): RESTful APIλŠ” μƒνƒœ λΉ„μ €μž₯μ„±(Stateless)을 μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” 각 μš”μ²­μ΄ 독립적이어야 ν•˜λ©°, μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ 이전 μš”μ²­ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 즉, μ„œλ²„λŠ” 각 μš”μ²­μ—μ„œ ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό μš”μ²­ 본문에 ν¬ν•¨ν•˜μ—¬ 보내야 ν•˜λ©°, μ„œλ²„λŠ” μ΄μ „μ˜ μƒνƒœλ₯Ό κΈ°μ–΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  4. μΊμ‹œ 처리 (Cacheable): RESTful API의 응닡은 μΊμ‹œ κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ„œλ²„μ—μ„œ λ°˜ν™˜λœ 응닡은 μΊμ‹œκ°€ κ°€λŠ₯ν•˜λ„λ‘ λͺ…μ‹œμ  λ˜λŠ” μ•”μ‹œμ μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 응닡 μ‹œκ°„μ„ 쀄이고 μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  5. κ³„μΈ΅ν™”λœ μ‹œμŠ€ν…œ (Layered System): RESTful APIλŠ” μ—¬λŸ¬ κ³„μΈ΅μœΌλ‘œ ꡬ성될 수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 쀑간 μ„œλ²„λ‚˜ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 μ΅œμ’… μ„œλ²„μ™€ 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 각 계측을 μ•Œ ν•„μš” 없이 μ΅œμ’… μ„œλ²„μ™€ 톡신할 수 μžˆμ–΄ μœ μ—°ν•œ μ•„ν‚€ν…μ²˜ 섀계λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.
  6. μΌκ΄€λœ μΈν„°νŽ˜μ΄μŠ€ (Uniform Interface): RESTful APIλŠ” μΌκ΄€λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 톡신을 λ‹¨μˆœν™”ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ νŠΉμ • κ·œμΉ™μ— 따라 URL, HTTP λ©”μ„œλ“œ, μƒνƒœ μ½”λ“œ 등을 μ •μ˜ν•˜κ³  μ‚¬μš©ν•©λ‹ˆλ‹€.

RESTful API의 ꡬ성 μš”μ†Œ

1. μžμ›(Resouces): μžμ›μ€ URI(Uniform Resource Identifier)둜 μ‹λ³„λ˜λ©°, RESTful APIμ—μ„œ λ‹€λ£¨λŠ” 기본적인 κ°μ²΄μž…λ‹ˆλ‹€. μžμ›μ€ 보톡 λͺ…μ‚¬λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.

  • μ˜ˆμ‹œ:
    • GET /books → μ±… λͺ©λ‘ 쑰회
    • GET /books/{id} → νŠΉμ • μ±… 쑰회
    • POST /books → μƒˆλ‘œμš΄ μ±… 생성
    • PUT /books/{id} → νŠΉμ • μ±… 정보 μˆ˜μ •
    • DELETE /books/{id} → νŠΉμ • μ±… μ‚­μ œ

2. HTTP λ©”μ„œλ“œμ™€ μžμ› RESTful APIμ—μ„œ μžμ›μ— λŒ€ν•œ μ‘°μž‘μ€ HTTP λ©”μ„œλ“œ(λ˜λŠ” 동사)둜 κ²°μ •λ©λ‹ˆλ‹€:

  • GET: μžμ› 쑰회
  • POST: μžμ› 생성
  • PUT: μžμ› μˆ˜μ •
  • DELETE: μžμ› μ‚­μ œ

μ˜ˆμ‹œ:

  • GET /users → μ‚¬μš©μž λͺ©λ‘ 쑰회
  • POST /users → μ‚¬μš©μž μΆ”κ°€
  • GET /users/{id} → νŠΉμ • μ‚¬μš©μž 쑰회
  • PUT /users/{id} → νŠΉμ • μ‚¬μš©μž 정보 μ—…λ°μ΄νŠΈ
  • DELETE /users/{id} → νŠΉμ • μ‚¬μš©μž μ‚­μ œ

3. HTTP μƒνƒœ μ½”λ“œ (HTTP Status Codes) RESTful APIλŠ” HTTP μƒνƒœ μ½”λ“œλ₯Ό 톡해 μš”μ²­μ˜ κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 자주 μ‚¬μš©λ˜λŠ” μƒνƒœ μ½”λ“œμž…λ‹ˆλ‹€:

  • 200 OK: μš”μ²­μ΄ μ„±κ³΅μ μœΌλ‘œ 처리됨
  • 201 Created: μƒˆ μžμ›μ΄ 생성됨
  • 400 Bad Request: 잘λͺ»λœ μš”μ²­ (예: νŒŒλΌλ―Έν„° λΆ€μ‘±)
  • 404 Not Found: μš”μ²­ν•œ μžμ›μ΄ μ—†μŒ
  • 500 Internal Server Error: μ„œλ²„ μΈ‘ 였λ₯˜

4. JSON λ˜λŠ” XML 응닡 ν˜•μ‹ RESTful APIλŠ” 보톡 JSON ν˜•μ‹μœΌλ‘œ 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. μ΄λŠ” μ‚¬λžŒμ΄ 읽기 쉽고, λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œ μ‰½κ²Œ μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ— 널리 μ‚¬μš©λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ (JSON ν˜•μ‹):

{
  "id": 1,
  "title": "The Great Gatsby",
  "author": "F. Scott Fitzgerald"
}

RESTful API의 μž₯점

  • ν™•μž₯μ„±: RESTful APIλŠ” λ‹€μ–‘ν•œ μ‹œμŠ€ν…œ 간에 μ‰½κ²Œ ν™•μž₯ κ°€λŠ₯ν•˜κ³ , λ‹€λ₯Έ μ‹œμŠ€ν…œκ³Ό 톡합이 μš©μ΄ν•©λ‹ˆλ‹€.
  • ν‘œμ€€ν™”: HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ ν‘œμ€€ν™”λœ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λ―€λ‘œ λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈ(λͺ¨λ°”일, μ›Ή λ“±)와 μ„œλ²„ κ°„μ˜ μƒν˜Έ μž‘μš©μ„ μ›ν™œν•˜κ²Œ ν•©λ‹ˆλ‹€.
  • 독립성: μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 있으며, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ˜ λ‚΄λΆ€ λ™μž‘ 방식을 μ•Œ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
  • μœ μ—°μ„±: RESTful APIλŠ” λ‹€μ–‘ν•œ 데이터 ν˜•μ‹(JSON, XML λ“±)을 μ§€μ›ν•˜λ―€λ‘œ λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈ ν™˜κ²½μ— μ ν•©ν•©λ‹ˆλ‹€.

RESTful API의 μ˜ˆμ‹œ

  1. μžμ› 쑰회 (GET):
    • GET /users → μ‚¬μš©μž λͺ©λ‘ 쑰회
    • GET /users/{userId} → νŠΉμ • μ‚¬μš©μž 정보 쑰회
  2. μžμ› 생성 (POST):
    • POST /users → μƒˆλ‘œμš΄ μ‚¬μš©μž 생성
  3. μžμ› μˆ˜μ • (PUT):
    • PUT /users/{userId} → νŠΉμ • μ‚¬μš©μž 정보 μˆ˜μ •
  4. μžμ› μ‚­μ œ (DELETE):
    • DELETE /users/{userId} → νŠΉμ • μ‚¬μš©μž μ‚­μ œ

κ²°λ‘ 

RESTful APIλŠ” HTTPλ₯Ό 기반으둜 ν•˜μ—¬ μžμ›μ„ HTTP λ©”μ„œλ“œλ₯Ό 톡해 λ‹€μ–‘ν•œ 데이터 ν˜•μ‹(JSON, XML λ“±)으둜 μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‹œμŠ€ν…œ κ°„μ˜ 효율적이고 ν‘œμ€€ν™”λœ 톡신이 κ°€λŠ₯ν•˜λ©°, 특히 μ›Ή μ„œλΉ„μŠ€λ‚˜ λͺ¨λ°”일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 널리 μ‚¬μš©λ©λ‹ˆλ‹€.

λ°˜μ‘ν˜•