backgroundbackground
Sidebar Background Day
Sidebar Background Night
YoonCarrot

전체 (52)

    • Blog(4)
    • Design Pattern(20)
    • Clean Code(2)
    • Refactoring(5)
    • Augmented Coding(1)
    • μ•„ν‚€ν…μ²˜(1)
    • Typescript(2)
    • Algorithm(1)
    • 운영체제(4)
    • Network(4)
    • React(6)
    • NextJs(1)
    • μ›Ή μ΅œμ ν™”(1)
λ§›μžˆλŠ” νŽ˜μ΄μ§€ 쀀비쀑...λ§›μžˆλŠ” νŽ˜μ΄μ§€ 쀀비쀑...
REST

[ CS > Network ]

[API] RESTful API μ•„ν‚€ν…μ²˜

Β Carrot Yoon
Β 2025-06-19
Β 18

RESTful API μ•„ν‚€ν…μ²˜

REST(Representational State Transfer)λŠ” Web을 κ°œλ°œν•˜λŠ”λ° 지침을 μ œκ³΅ν•˜κ³  κ·Έ ꡬ쑰λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ΄λ‹€.

1. Rest μ•„ν‚€ν…μ²˜ νŠΉμ§•

Restful API의 핡심은 URL을 Endpoint둜 λ°”λΌλ³΄λŠ” 것이 μ•„λ‹ˆλΌ ν•˜λ‚˜μ˜ μžμ›μœΌλ‘œ λ°”λΌλ³΄λŠ” 것이고, 일관성을 κ°€μ Έμ„œ 예츑 κ°€λŠ₯ν•˜κ²Œ λ˜λŠ” 것이닀. μ•„λž˜λŠ” Rest μ•„ν‚€ν…μ²˜μ—μ„œ κ°€μ§€λŠ” νŠΉμ„±μ΄λΌκ³  ν•œλ‹€.

1.1 Stateless λ¬΄μƒνƒœμ„±

ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μš”μ²­μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ 정보가 μ €μž₯λ˜μ§€ μ•Šκ³ , 각 μš”μ²­μ€ λΆ„λ¦¬λ˜μ–΄μ•Ό ν•œλ‹€.

1.2 Client-Server ꡬ쑰

ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„, λ¦¬μ†ŒμŠ€λ‘œ κ΅¬μ„±λ˜μ–΄ 있으며 HTTP둜 μš”μ²­μ΄ 이루어진닀.

1.3 데이터 캐싱

캐싱이 κ°€λŠ₯ν•˜λ„λ‘ ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„κ°„ μƒν˜Έμž‘μš©μ„ μ΅œμ†Œν™”ν•œλ‹€.

1.4 μΌκ΄€λœ μΈν„°νŽ˜μ΄μŠ€

λ¦¬μ†ŒμŠ€ 식별이 κ°€λŠ₯ν•΄μ•Ό ν•˜λ©°, ν΄λΌμ΄μ–ΈνŠΈμ— μ „μ†‘λœ ν‘œν˜„κ³Ό κ΅¬λΆ„λ˜μ–΄μ•Όν•œλ‹€.
그리고 μˆ˜μ‹ ν•˜λŠ” ν‘œν˜„μ„ 톡해 λ¦¬μ†ŒμŠ€κ°€ μ‘°μž‘λ˜μ–΄μ•Ό ν•œλ‹€.
ν΄λΌμ΄μ–ΈνŠΈλŠ” 자기 μ„œμˆ μ  λ©”μ‹œμ§€μ— 정보λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν• μ§€ μ„€λͺ…ν•˜λŠ” 정보가 μΆ©λΆ„νžˆ ν¬ν•¨λ˜μ–΄μ•Ό ν•œλ‹€.(Content-type, method, encoding λ“±)

1.5 λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜ 지원

μ„œλ²„λŠ” 계측 ꡬ쑰(λ³΄μ•ˆ, λ‘œλ“œλ°ΈλŸ°μ‹± λ“±)둜 κ΅¬μ„±ν•˜λŠ” κ³„μΈ΅ν™”λœ μ‹œμŠ€ν…œμ„ κ°€μ§ˆ 수 μžˆλ‹€.

1.6 μ½”λ“œ 온 λ””λ§¨λ“œ

μš”μ²­μ„ λ°›μœΌλ©΄ μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μ „μ†‘ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€.

2.λ©”μ„œλ“œμ™€ μƒνƒœ 정리

Restful APIμ—μ„œλŠ” μžμ›μ— λŒ€ν•œ ν–‰μœ„λ₯Ό HTTP λ©”μ„œλ“œλ₯Ό 톡해 λ‚˜νƒ€λ‚΄μ–΄ μ„œλ²„μ—μ„œ 이 λ©”μ„œλ“œμ— 따라 μ²˜λ¦¬ν•˜κ³ , Response둜 μƒνƒœ μ½”λ“œλ₯Ό 전달해 μ‘λ‹΅μ˜ μƒνƒœλ₯Ό ν‘œν˜„ν•œλ‹€.

2.1 λ©”μ„œλ“œ

λ©”μ„œλ“œ

μ„€λͺ…

주된 μš©λ„

λ©±λ“±μ„± (Idempotent)

μ•ˆμ „μ„± (Safe)

μ˜ˆμ‹œ URI

GET

λ¦¬μ†ŒμŠ€λ₯Ό 쑰회

데이터 쑰회

βœ… 예 (같은 μš”μ²­ μ—¬λŸ¬ 번 해도 κ²°κ³Ό 동일)

βœ… 예 (μ„œλ²„ μƒνƒœ λ³€κ²½ μ—†μŒ)

/users/1

POST

λ¦¬μ†ŒμŠ€λ₯Ό 생성

데이터 μΆ”κ°€

❌ μ•„λ‹ˆμ˜€

❌ μ•„λ‹ˆμ˜€

/users

PUT

λ¦¬μ†ŒμŠ€λ₯Ό 전체 μˆ˜μ •

데이터 전체 μ—…λ°μ΄νŠΈ

βœ… 예

❌ μ•„λ‹ˆμ˜€

/users/1

PATCH

λ¦¬μ†ŒμŠ€λ₯Ό 일뢀 μˆ˜μ •

데이터 일뢀 μ—…λ°μ΄νŠΈ

❌ 일반적으둜 μ•„λ‹ˆμ˜€ (μ„œλ²„ κ΅¬ν˜„μ— 따라 닀름)

❌ μ•„λ‹ˆμ˜€

/users/1

DELETE

λ¦¬μ†ŒμŠ€λ₯Ό μ‚­μ œ

데이터 μ‚­μ œ

βœ… 예 (이미 μ‚­μ œλœ κ²½μš°μ—λ„ λ™μΌν•œ 응닡 κ°€λŠ₯)

❌ μ•„λ‹ˆμ˜€

/users/1

OPTIONS

μ§€μ›ν•˜λŠ” λ©”μ„œλ“œ 쑰회

CORS 사전 μš”μ²­ λ“±

βœ… 예

βœ… 예

/users

HEAD

λ¦¬μ†ŒμŠ€μ˜ ν—€λ”λ§Œ 쑰회 (λ³Έλ¬Έ μ—†μŒ)

메타데이터 확인

βœ… 예

βœ… 예

/users/1

2.2 μƒνƒœ

μƒνƒœ

μƒνƒœ μ½”λ“œ

의미

μ„€λͺ…

μ‚¬μš© μ˜ˆμ‹œ



성곡

(2xx)

200 OK

μš”μ²­ 성곡

GET, PUT, PATCH, DELETE 등에 μ‚¬μš©

데이터 쑰회 성곡

201 Created

생성됨

POST μš”μ²­μœΌλ‘œ λ¦¬μ†ŒμŠ€ 생성 μ‹œ μ‚¬μš©

νšŒμ›κ°€μž…, κΈ€ μž‘μ„± λ“±

204 No Content

λ‚΄μš© μ—†μŒ

μ„±κ³΅ν–ˆμ§€λ§Œ 응닡 본문이 없을 λ•Œ

DELETE, PUT 성곡 ν›„ 응닡 μ—†μŒ



λ¦¬λ‹€μ΄λ ‰μ…˜

(3xx)

301 Moved Permanently

영ꡬ 이동

λ¦¬μ†ŒμŠ€κ°€ 영ꡬ적으둜 이동

URL λ³€κ²½ μ•ˆλ‚΄

302 Found

μž„μ‹œ 이동

λ¦¬μ†ŒμŠ€κ°€ μž„μ‹œλ‘œ λ‹€λ₯Έ μœ„μΉ˜μ— 있음

둜그인 ν›„ λ¦¬λ””λ ‰μ…˜

304 Not Modified

λ³€κ²½ μ—†μŒ

μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš© κ°€λŠ₯

쑰건뢀 GET (If-Modified-Since λ“±)





ν΄λΌμ΄μ–ΈνŠΈ 였λ₯˜

(4xx)

400 Bad Request

잘λͺ»λœ μš”μ²­

μœ νš¨ν•˜μ§€ μ•Šμ€ νŒŒλΌλ―Έν„° λ“±

ν•„λ“œ λˆ„λ½, JSON νŒŒμ‹± μ‹€νŒ¨

401 Unauthorized

인증 ν•„μš”

둜그인 ν•„μš” λ˜λŠ” 토큰 였λ₯˜

JWT μ—†μŒ/만료

403 Forbidden

μ ‘κ·Ό κΈˆμ§€

κΆŒν•œμ΄ μ—†λŠ” 경우

κ΄€λ¦¬μž μ „μš© μ ‘κ·Ό

404 Not Found

λ¦¬μ†ŒμŠ€ μ—†μŒ

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” URI μš”μ²­

잘λͺ»λœ ID둜 쑰회 μ‹œ

409 Conflict

좩돌

쀑볡 λ¦¬μ†ŒμŠ€ 생성 μ‹œ λ“±

동일 ID 쀑볡 생성 λ“±

422 Unprocessable Entity

μ²˜λ¦¬ν•  수 μ—†μŒ

ν˜•μ‹μ€ λ§žμ§€λ§Œ μ˜λ―Έκ°€ 잘λͺ»λ¨

폼 검증 μ‹€νŒ¨ λ“±



μ„œλ²„ 였λ₯˜

(5xx)

500 Internal Server Error

λ‚΄λΆ€ μ„œλ²„ 였λ₯˜

μ„œλ²„ λ‚΄λΆ€ μ˜ˆμ™Έ λ°œμƒ

μ˜ˆμƒμΉ˜ λͺ»ν•œ μ—λŸ¬

502 Bad Gateway

κ²Œμ΄νŠΈμ›¨μ΄ 였λ₯˜

μ„œλ²„κ°€ 잘λͺ»λœ 응닡 μˆ˜μ‹ 

ν”„λ‘μ‹œ, κ²Œμ΄νŠΈμ›¨μ΄ 문제

503 Service Unavailable

μ„œλΉ„μŠ€ λΆˆκ°€

μ„œλ²„ 점검 쀑 λ˜λŠ” κ³ΌλΆ€ν•˜

μ„œλ²„ λ‹€μš΄, μœ μ§€λ³΄μˆ˜

504 Gateway Timeout

κ²Œμ΄νŠΈμ›¨μ΄ νƒ€μž„μ•„μ›ƒ

응닡 μ§€μ—°

λ°±μ—”λ“œ 응닡 μ§€μ—° μ‹œ

3. λ¦¬μ°¨λ“œμŠ¨ μ„±μˆ™λ„ λͺ¨λΈ(Richardson Maturity Model)

λ¦¬μ°¨λ“œμŠ¨(Richardson)은 Rest APIλ₯Ό 잘 μ μš©ν•˜κΈ° μœ„ν•΄ 4λ‹¨κ³„μ˜ μ„±μˆ™λ„ λͺ¨λΈμ„ μ •μ˜ν–ˆλ‹€.

image.webp