[TECH-QA] RESTful APIμ΄λž€?

RESTful API(Representational State Transfer API)λŠ” μ›Ή μ„œλΉ„μŠ€λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ 섀계 방식 쀑 ν•˜λ‚˜λ‘œ, RESTλΌλŠ” μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ„ λ”°λ₯΄λŠ” API둜, 주둜 HTTP ν”„λ‘œν† μ½œμ„ κΈ°λ°˜μœΌλ‘œν•˜λŠ” μ›Ή μ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μž…λ‹ˆλ‹€. μžμ›, λ©”μ†Œλ“œ, λ©”μ‹œμ§€ 등을 μ •μ˜ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ κ°„μ˜ 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

λ©”μ‹œμ§€(Message)

λ©”μ‹œμ§€λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ ν†΅μ‹ μ—μ„œ μ „λ‹¬λ˜λŠ” λ°μ΄ν„°μ˜ λ‚΄μš©μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. RESTful APIμ—μ„œ λ©”μ‹œμ§€λŠ” μš”μ²­(Request)κ³Ό 응닡(Response)둜 κ΅¬λΆ„λ©λ‹ˆλ‹€.

μš”μ²­ λ©”μ‹œμ§€

μš”μ²­ λ©”μ‹œμ§€λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ λ³΄λ‚΄λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€. 이 λ°μ΄ν„°μ—λŠ” μš”μ²­μ˜ λͺ©μ κ³Ό ν•¨κ»˜ ν•„μš”ν•œ 정보가 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. 주둜 JSON ν˜•μ‹μœΌλ‘œ 데이터가 μ „μ†‘λ©λ‹ˆλ‹€. μš”μ²­ λ©”μ‹œμ§€μ—λŠ” μš”μ²­ν•˜λŠ” μžμ›μ˜ 식별, μžμ›μ˜ μƒνƒœ 변경을 μœ„ν•œ 데이터, μš”μ²­ν•˜λŠ” μž‘μ—…μ˜ μ’…λ₯˜(λ©”μ†Œλ“œ) 등이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ μš”μ²­(Request)

IDκ°€ 123인 μ‚¬μš©μžμ˜ 정보λ₯Ό 쑰회 : GET /users/123
{
  "id": 123,
  "name": "John Doe",
  "email": "john@example.com"
}
       
μƒˆλ‘œμš΄ μ‚¬μš©μž 생성 : POST /users
{
  "name": "Jane Doe",
  "email": "jane@example.com"
}
       
  • 응닡: 201 Created (성곡 μ‹œ)

응닡 λ©”μ‹œμ§€

응닡 λ©”μ‹œμ§€λŠ” μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ³΄λ‚΄λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ 성곡 μ—¬λΆ€, 처리된 데이터, λ˜λŠ” 였λ₯˜ 정보λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•©λ‹ˆλ‹€. 일반적으둜 HTTP μƒνƒœ μ½”λ“œμ™€ ν•¨κ»˜ JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜λ˜λ©°, 상황에 따라 λ‹€μ–‘ν•œ ꡬ쑰λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ 주둜 JSON ν˜•μ‹μœΌλ‘œ 데이터가 μ „μ†‘λ©λ‹ˆλ‹€.
  • 상황: μ‚¬μš©μžκ°€ νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό μ„±κ³΅μ μœΌλ‘œ μ‘°νšŒν–ˆμ„ λ•Œ
  • HTTP μƒνƒœ μ½”λ“œ: 200 OK

πŸ“ 예제) IDκ°€ 123인 μ‚¬μš©μžλ₯Ό 쑰회

{
  "status": "success",
  "data": {
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com",
    "created_at": "2025-01-01T10:00:00Z"
  },
  "message": "User retrieved successfully"
}
  • 상황: μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμ„ λ•Œ
  • HTTP μƒνƒœ μ½”λ“œ: 201 Created

πŸ“ 예제) μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μΆ”κ°€

{
  "status": "success",
  "data": {
    "id": 124,
    "name": "Jane Doe",
    "email": "jane@example.com",
    "created_at": "2025-03-11T09:00:00Z"
  },
  "message": "User created successfully",
  "location": "/users/124"
}
  • location: μƒˆλ‘œ μƒμ„±λœ λ¦¬μ†ŒμŠ€μ˜ URIλ₯Ό λ‚˜νƒ€λƒ„ (선택적).

πŸ“ μ„œλ²„μ—μ„œ 응닡 λ©”μ‹œμ§€ 섀계 팁

  • 일관성 μœ μ§€: 성곡/였λ₯˜ 응닡 ν˜•μ‹μ„ μΌκ΄€λ˜κ²Œ 섀계 (예: 항상 status, data, message ν•„λ“œ μ‚¬μš©).
  • μƒνƒœ μ½”λ“œ ν™œμš©: μ μ ˆν•œ HTTP μƒνƒœ μ½”λ“œλ₯Ό μ‚¬μš©ν•΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ 응닡을 μ‰½κ²Œ ν•΄μ„ν•˜λ„λ‘ 도움.
  • 였λ₯˜ 상세 제곡: 였λ₯˜ λ°œμƒ μ‹œ error 객체에 ꡬ체적인 정보(μ½”λ“œ, λ©”μ‹œμ§€, 세뢀사항)λ₯Ό 포함해 디버깅 μš©μ΄μ„±μ„ λ†’μž„.
  • ν•„μš”ν•œ λ°μ΄ν„°λ§Œ λ°˜ν™˜: ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•„μš”λ‘œ ν•˜λŠ” μ •λ³΄λ§Œ μ œκ³΅ν•΄ μ˜€λ²„νŽ˜μΉ­(over-fetching)을 λ°©μ§€.

μžμ›(Resource)

μžμ›μ€ RESTful API의 핡심 κ°œλ… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. URI(Uniform Resource Identifier)λž€ μ›Ήμƒμ˜ 자료의 id 즉, λ‚΄κ°€ 올린 λΈ”λ‘œκ·Έ κΈ€μ˜ νŠΉμ • idλ₯Ό μž…λ ₯ν•΄μ€˜μ•Ό 글을 볼수 μžˆλŠ” κ²ƒμ²˜λŸΌ URIλŠ” 인터넷 μžμ›μ„ λ‚˜νƒ€λ‚΄λŠ” μ„œλ²„μ— μžˆλŠ” 정보(고유 μ‹λ³„μž)의 ν‘œν˜„μž…λ‹ˆλ‹€.
일반적으둜 μ›Ήμ—μ„œλŠ” URIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„λž˜μ™€ 같이 μžμ›μ„ μ‹λ³„ν•©λ‹ˆλ‹€.
  • /todos ---- 할일 λͺ©λ‘μ΄λΌλŠ” μžμ›
  • /todos/1 ---- IDκ°€ 1인 νŠΉμ • 할일 μžμ›

λ©”μ†Œλ“œ(Method) λ©”μ‹œμ§€

λ©”μ†Œλ“œ λ©”μ‹œμ§€λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μš”μ²­ν•˜λŠ” μž‘μ—…μ˜ μ’…λ₯˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. RESTful APIμ—μ„œλŠ” 주둜 λ‹€μŒκ³Ό 같은 λ„€ κ°€μ§€ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • GET: μ„œλ²„μ—μ„œ μžμ›μ„ κ°€μ Έμ˜€κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ νŠΉμ • μžμ›μ— λŒ€ν•œ 정보λ₯Ό μš”μ²­ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, /todos에 GET μš”μ²­μ„ 보내면 λͺ¨λ“  할일 λͺ©λ‘μ„ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • POST: μ„œλ²„μ— μƒˆλ‘œμš΄ μžμ›μ„ μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μƒˆλ‘œμš΄ μžμ›μ„ μΆ”κ°€ν•˜λ €λŠ” 경우 μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, /todos에 POST μš”μ²­μ„ 보내면 μƒˆλ‘œμš΄ 할일을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • PUT: μ„œλ²„μ˜ μžμ›μ„ μˆ˜μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ νŠΉμ • μžμ›μ„ μˆ˜μ •ν•˜λ €λŠ” 경우 μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, /todos/1에 PUT μš”μ²­μ„ 보내면 IDκ°€ 1인 할일을 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • DELETE: μ„œλ²„μ—μ„œ μžμ›μ„ μ‚­μ œν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ νŠΉμ • μžμ›μ„ μ‚­μ œν•˜λ €λŠ” 경우 μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, /todos/2에 DELETE μš”μ²­μ„ 보내면 IDκ°€ 2인 할일을 μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

REST의 μ£Όμš” νŠΉμ§•

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

ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°€ λͺ…ν™•νžˆ λΆ„λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­μ„ 보내고, μ„œλ²„λŠ” 이에 λŒ€ν•œ 응닡을 μ œκ³΅ν•©λ‹ˆλ‹€. 이둜 인해 각 ꡬ성 μš”μ†Œκ°€ λ…λ¦½μ μœΌλ‘œ λ°œμ „ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ μœ λ‹ˆνΌ μΈν„°νŽ˜μ΄μŠ€(일관적인 μΈν„°νŽ˜μ΄μŠ€)

REST APIλŠ” λ¦¬μ†ŒμŠ€(데이터)λ₯Ό URI둜 μ‹λ³„ν•˜κ³ , HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)λ₯Ό 톡해 μ‘°μž‘ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‹¨μˆœν•˜κ³  μΌκ΄€λœ μ ‘κ·Ό 방식을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 예: GET /users/123 (νŠΉμ • μ‚¬μš©μž 쑰회), POST /users (μ‚¬μš©μž 생성).

πŸ“ λ¬΄μƒνƒœμ„±(Statelessness)

REST APIλŠ” μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” statelessν•œ νŠΉμ„±μ„ κ°€μ§‘λ‹ˆλ‹€. μƒνƒœκ°€ μ—†λ‹€λŠ” 것은 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ˜ μš”μ²­μ„ 보낼 λ•Œ 각 μš”μ²­μ€ λ…λ¦½μ μœΌλ‘œ 처리되며, μ„œλ²„λŠ” 이전 μš”μ²­μ˜ μƒνƒœλ₯Ό κΈ°μ–΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό μš”μ²­μ— 포함해야 ν•©λ‹ˆλ‹€. μ΄λŠ” μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄이고, ν™•μž₯성을 λ†’μ΄λŠ”λ° 도움이 λ©λ‹ˆλ‹€. HTTPλŠ” 기본적으둜 μƒνƒœκ°€ μ—†λŠ” ν”„λ‘œν† μ½œ μž…λ‹ˆλ‹€. λ”°λΌμ„œ HTTPλ₯Ό μ‚¬μš©ν•˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 기본적으둜 μƒνƒœκ°€ μ—†λŠ” ꡬ쑰λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

πŸ“ μΊμ‹œ κ°€λŠ₯ (Cacheable)

응닡 λ°μ΄ν„°λŠ” μΊμ‹œ κ°€λŠ₯ μ—¬λΆ€λ₯Ό λͺ…μ‹œν•  수 μžˆμ–΄, ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μ„œλ²„κ°€ λ™μΌν•œ μš”μ²­μ— λŒ€ν•΄ 이전 응닡을 μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ„±λŠ₯을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

πŸ“ 계측화 μ‹œμŠ€ν…œ (Layered System)

ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ™€ 직접 ν†΅μ‹ ν•˜λŠ”μ§€, μ•„λ‹ˆλ©΄ ν”„λ‘μ‹œλ‚˜ κ²Œμ΄νŠΈμ›¨μ΄ 같은 쀑간 계측을 κ±°μΉ˜λŠ”μ§€ μ•Œ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” λ³΄μ•ˆκ³Ό ν™•μž₯성을 λ†’μž…λ‹ˆλ‹€.

πŸ“ λ¦¬μ†ŒμŠ€ 쀑심 (Resource-Based)

λͺ¨λ“  λ°μ΄ν„°λŠ” λ¦¬μ†ŒμŠ€λ‘œ ν‘œν˜„λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ†ŒμŠ€λ₯Ό μ‘°μž‘ν•©λ‹ˆλ‹€. λ¦¬μ†ŒμŠ€λŠ” JSON, XML λ“±μ˜ ν˜•μ‹μœΌλ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.

πŸ“ HTTP ν”„λ‘œν† μ½œ ν™œμš©

RESTλŠ” 주둜 HTTPλ₯Ό 기반으둜 λ™μž‘ν•˜λ©°, μƒνƒœ μ½”λ“œ(200 OK, 404 Not Found λ“±)λ₯Ό μ‚¬μš©ν•΄ μš”μ²­μ˜ 성곡/μ‹€νŒ¨ μ—¬λΆ€λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

πŸ“ 기타

  • ν™•μž₯μ„±: Stateless와 계측화 덕뢄에 μ„œλ²„ λΆ€ν•˜λ₯Ό λΆ„μ‚°ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • μœ μ—°μ„±: λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈ(μ›Ή, λͺ¨λ°”일 λ“±)μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • λ‹¨μˆœμ„±: 직관적인 μ„€κ³„λ‘œ 개발과 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•©λ‹ˆλ‹€.
이와 같은 νŠΉμ§•λ“€λ‘œ REST APIλŠ” 인터넷 μƒμ˜ μžμ›μ„ ν‘œν˜„ν•˜κ³ , λ‹€μ–‘ν•œ ν”Œλž«νΌ 및 μ–Έμ–΄ κ°„μ˜ 톡신을 κ°„μ†Œν™”ν•˜λ©°, ν™•μž₯μ„± μžˆλŠ” μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.