////
Search
Duplicate

REST APIλž€ 무엇인가

1. 주제 μ„ μ • 이유

μ§€λ‚œ ITμš©μ–΄ μ •λ¦¬μ—μ„œ API에 λŒ€ν•œ μ„€λͺ…을 ν–ˆμœΌλ‚˜, κ°€μž₯ μ€‘μš”ν•œ REST API에 λŒ€ν•œ μ„€λͺ…을 κ°„λž΅ν•˜κ²Œ ν–ˆλ‹€κ³  μƒκ°ν•΄μ„œ ν•΄λ‹Ή μ£Όμ œμ— λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•˜κ³ μž μ„ μ •ν–ˆλ‹€. ν”„λ‘ νŠΈ μ—”λ“œλΏλ§Œ μ•„λ‹ˆλΌ ITμ—…κ³„μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” API 방식이기에 이에 λŒ€ν•œ μ •ν™•ν•œ κ°œλ…μ€ λ°˜λ“œμ‹œ μˆ™μ§€ν•΄μ•Ό ν•  것이닀.

2. APIλž€ 무엇인가? === λ©”λ‰΄νŒ

β€’
Application Programming Interface의 μ•žμžλ¦¬λ₯Ό μ‘°ν•©ν•˜μ—¬ λ§Œλ“  μš©μ–΄λ‘œ, μ‘μš© ν”„λ‘œκ·Έλž¨μ„ ν”„λ‘œκ·Έλž˜λ°ν•˜κΈ° μœ„ν•΄ μ„œλ‘œ 데이터λ₯Ό μ£Όκ³  λ°›λŠ” μƒν˜Έμž‘μš©μ˜ 방법이라고 μ •μ˜ν•  수 μžˆλ‹€.
β€’
데이터λ₯Ό μš”μ²­ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ(ν”„λ‘ νŠΈμ—”λ“œ)μ—κ²Œ μ„œλ²„(λ°±μ—”λ“œ)κ°€ 데이터λ₯Ό μ œκ³΅ν•΄μ£Όλ©°, μ΄λŸ¬ν•œ μƒν˜Έμž‘μš©μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” 것이 API이닀.

3. REST APIλž€ 무엇인가?

3-1. REST API의 κ°œλ…

β€’
REpresentational State Transfer의 μ•½μžλ‘œ, μ›Ή μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ΄λ‹€.
β€’
μ–΄μ›μ μœΌλ‘œ λΆ„μ„ν•˜λ©΄ 'λŒ€ν‘œμ μΈ μƒνƒœ μ „λ‹¬μž'둜 API 방식 쀑 κ°€μž₯ 많이 그리고 ν‘œμ€€μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 방법둠이닀.
β€’
μ•„ν‚€ν…μ²˜λŠ” μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” κ΅¬μ„±μš”μ†Œλ“€μ˜ μ‘°ν•©κ³Ό κ·Έλ“€ κ°„μ˜ μƒν˜Έμž‘μš© 방식을 μ„€κ³„ν•˜λŠ” 것을 μ˜λ―Έν•˜λ©°, REST APIμ—μ„œ μ–ΈκΈ‰ν•˜λŠ” μ›Ή μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ μ•„ν‚€ν…μ²˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μ•„ν‚€ν…μ²˜λ₯Ό μ˜λ―Έν•œλ‹€.
β€’
ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μ•„ν‚€ν…μΈ λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°€ 각자의 역할을 λΆ„λ°°ν•˜μ—¬ μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ‚˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , μ„œλ²„λŠ” 그에 ν•„μš”ν•œ 데이터λ₯Ό 전달 및 처리λ₯Ό ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.
β€’
즉, REST APIλŠ” μ›Ή μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μ‹œμŠ€ν…œ(μ•„ν‚€ν…μ²˜)적 μŠ€νƒ€μΌμ΄λΌ 정리 ν•  수 μžˆλ‹€.
β€’
REST APIλŠ” HTTP ν”„λ‘œν† μ½œμ„ 기반으둜 λ™μž‘ν•œλ‹€.

3-2. REST APIλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

β€’
μžμ›(Resource) 쀑심적: λ¦¬μ†ŒμŠ€(데이터)λ₯Ό μ€‘μ‹¬μœΌλ‘œ APIλ₯Ό μ„€κ³„ν•œλ‹€. 각 λ¦¬μ†ŒμŠ€λŠ” κ³ μœ ν•œ μ‹λ³„μž(URI)λ₯Ό κ°€μ§€κΈ° λ•Œλ¬Έμ— 가독성이 μ’‹μ•„ μˆ˜μ •μ΄λ‚˜ 변경이 μš©μ΄ν•˜λ‹€.
β€’
ν‘œμ€€ν™”λœ μΈν„°νŽ˜μ΄μŠ€: REST APIλŠ” 일반적으둜 HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE)와 HTTP μƒνƒœ μ½”λ“œ(200 OK, 404 Not Found λ“±)λ₯Ό μ‚¬μš©ν•˜μ—¬ μΌκ΄€λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€. μ΄λŠ” κ°œλ°œμžκ°€ APIλ₯Ό μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•˜κΈ° 쉽도둝 도와쀀닀.

3-3. HTTPλŠ” 무엇인가?

β€’
HyperText Transfer Protocol의 μ•½μžλ‘œ, μΈν„°λ„·μ—μ„œ μ›ΉνŽ˜μ΄μ§€λ₯Ό μ „μ†‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν”„λ‘œν† μ½œ(κ·œμΉ™)을 μ˜λ―Έν•œλ‹€.
β€’
HTTPλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터λ₯Ό 'μš”μ²­'ν•˜κ³  μ„œλ²„κ°€ 이에 '응닡'ν•˜μ—¬ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” ν˜•νƒœλ‘œ 이루어져 μžˆλ‹€.
β€’
REST APIλŠ” HTTP ν”„λ‘œν† μ½œμ„ 기반으둜 λ™μž‘ν•˜κΈ°μ—, 각쒅 HTTP λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ ν‘œμ€€ν™”λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.

4. HTTP λ©”μ„œλ“œ 정리

β€’
GET : μš”μ²­λ°›μ€ URI의 정보λ₯Ό κ²€μƒ‰ν•˜μ—¬ μ‘λ‹΅ν•œλ‹€. 주둜 μ‚¬μš©μžκ°€ ν΄λ¦­ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ λ²„νŠΌλ“€μ΄ GET λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€κ³  생각해도 λ¬΄λ°©ν•˜λ‹€. ex). GET /index.html HTTP/1.1
β€’
POST : μš”μ²­λœ μžμ›μ„ 생성(create)ν•œλ‹€. 즉, μ„œλ²„μ— μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜, μ„œλ²„μ— 데이터λ₯Ό μ œμΆœν•˜μ—¬ μ²˜λ¦¬ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©ν•œλ‹€. 주둜 κ²Œμ‹œλ¬Όμ„ μž‘μ„±ν•˜κ±°λ‚˜, μ£Όλ¬Έ 정보λ₯Ό μƒμ„±ν•˜κ±°λ‚˜, μƒˆλ‘œμš΄ νŒŒμΌμ„ μ—…λ‘œλ“œ ν•˜λŠ” λ“±, μƒˆλ‘œμš΄ μžμ›μ„ 생성할 λ•Œ μ‚¬μš©ν•œλ‹€. ex). POST / request-uri/ HTTP/1.1
β€’
PUT : μš”μ²­λœ μžμ› 전체λ₯Ό μˆ˜μ •(update)ν•œλ‹€. 기쑴의 URI에 λ‚΄μš©μ„ μˆ˜μ •ν•˜λŠ” 것이기에 μƒˆλ‘œμš΄ URIλ₯Ό μƒμ„±ν•˜λŠ” POSTμ™€λŠ” 차이λ₯Ό 두어야 ν•œλ‹€. 주둜 λ¦¬μ†ŒμŠ€λ₯Ό μ—…λ°μ΄νŠΈν• λ•Œ PUT λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€κ³  μ΄ν•΄ν•˜λ©΄ λœλ‹€. ex). PUT / request-uri/ HTTP/1.1
β€’
PATCH : μš”μ²­λœ μžμ›μ„ μˆ˜μ •(update)ν•œλ‹€. λ‹€λ§Œ, μžμ› 전체λ₯Ό μˆ˜μ •ν•˜λŠ” PUTλ©”μ„œλ“œμ™€λŠ” 달리, PATCHλ©”μ„œλ“œμ˜ 경우 ν•΄λ‹Ήμžμ›μ˜ μΌλΆ€λ§Œμ„ κ΅μ²΄ν•œλ‹€λŠ” 차이점이 μžˆλ‹€. ex). PATCH / request-uri/ HTTP/1.1
β€’
DELETE : μš”μ²­λœ μžμ›μ„ μ‚­μ œν•  것을 μš”μ²­ν•œλ‹€. ν•˜μ§€λ§Œ μ•ˆμ •μ„±μ˜ 문제둜 λŒ€λΆ€λΆ„μ˜ μ„œλ²„μ—μ„œλŠ” λΉ„ν™œμ„±ν™” λ˜μ–΄μžˆμœΌλ©°, 주둜 PATCHλ₯Ό 톡해 μˆ˜μ •ν•œλ‹€κ³  ν•œλ‹€. ex). DELETE / request-uri/ HTTP/1.1

4-1. POST와 PUT의 μ°¨μ΄λŠ” 무엇인가?

β€’
POST λ©”μ„œλ“œλŠ” INSERT이며 PUT λ©”μ„œλ“œλŠ” UPDATE이닀.
β€’
POSTλ©”μ„œλ“œμ˜ 경우, λ©±λ“±ν•˜μ§€ μ•Šμ•„ λ™μΌν•œ μžμ›μ„ μ—¬λŸ¬λ²ˆ POSTν•˜λ©΄ μ„œλ²„μžμ›μ— λ³€ν™”κ°€ 생긴닀.
β€’
PUTλ©”μ„œλ“œμ˜ 경우, λ©±λ“±ν•˜μ—¬ λ™μΌν•œ μžμ›μ„ μ—¬λŸ¬λ²ˆ PUTν•˜λ©΄ μ„œλ²„μžμ›μ΄ λ³€ν™”ν•˜μ§€ μ•Šκ³  λ™μΌν•œ λ¦¬μ†ŒμŠ€λ‘œ μ‘λ‹΅ν•œλ‹€.
β€’
즉, POSTλ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ μžμ›μ„ μƒμ„±ν•˜κΈ°μ— μ—¬λŸ¬λ²ˆ μš”μ²­ν•˜λ©΄ μ„œλ²„ λ¦¬μ†ŒμŠ€μ— λ³€ν™”κ°€ μƒκΈ°μ§€λ§Œ, PUT의 경우, 생성이 μ•„λ‹Œ μˆ˜μ •μ„ ν•˜λ©°, μ—¬λŸ¬λ²ˆ μš”μ²­ν•΄λ„ μ„œλ²„ λ¦¬μ†ŒμŠ€μ— λ³€ν™”κ°€ μ—†λ‹€.

4-2. PUTκ³Ό PATCH의 μ°¨μ΄λŠ” 무엇인가?

β€’
PUT은 ν•΄λ‹Ή μžμ›μ˜ 전체λ₯Ό κ΅μ²΄ν•˜μ§€λ§Œ, PATCHλŠ” μΌλΆ€λ§Œ λ³€κ²½ν•œλ‹€.
β€’
PUT은 λ©±λ“±ν•˜μ§€λ§Œ, PATCHλŠ” λ©±λ“±ν•˜μ§€ λͺ»ν•˜λ‹€.

4-3. λ©±λ“±(Idempotent)은 무엇인가?

β€’
λ™μΌν•œ μž‘μ—…μ„ μ—¬λŸ¬ 번 μ‹€ν–‰ν•˜λ”λΌλ„ κ²°κ³Όκ°€ λ™μΌν•˜κ²Œ μœ μ§€λ˜λŠ” μ„±μ§ˆμ„ μ˜λ―Έν•œλ‹€.
β€’
즉, λ™μΌν•œ μš”μ²­μ„ μ—¬λŸ¬ 번 μ‹€ν–‰ν•˜λ”λΌλ„ 처음 μš”μ²­κ³Ό 같은 μƒνƒœμ™€ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
β€’
μ΄λŠ” μš”μ²­μ˜ 반볡 μ‹€ν–‰μ΄λ‚˜ 쀑볡 전솑이 λ°œμƒν•΄λ„ μ‹œμŠ€ν…œμ˜ μƒνƒœκ°€ λ³€ν•˜μ§€ μ•ŠλŠ” 것을 μ˜λ―Έν•œλ‹€.

5. μš”μ•½ 정리 및 λ©΄μ ‘ν˜• QnA

5-1. Q. REST APIκ°€ λ¬΄μ—‡μΈκ°€μš”?

β€’
REST APIλŠ” HTTP ν”„λ‘œν† μ½œμ„ 기반으둜 λ™μž‘ν•˜λŠ”, μ›Ή μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μ‹œμŠ€ν…œ(μ•„ν‚€ν…μ²˜)적 μŠ€νƒ€μΌμž…λ‹ˆλ‹€.
β€’
REST APIκ°€ κ°κ΄‘λ°›λŠ” μ΄μœ λŠ” 각 λ¦¬μ†ŒμŠ€λŠ” κ³ μœ ν•œ μ‹λ³„μž(URI)λ₯Ό κ°€μ§€κΈ° λ•Œλ¬Έμ— 가독성이 μ’‹μ•„ μˆ˜μ •μ΄λ‚˜ 변경이 μš©μ΄ν•˜κ³ , μΌκ΄€λœ HTTP ν”„λ‘œν† μ½œμ„ λ”°λ₯΄κΈ°μ— 개발자둜 ν•˜μ—¬κΈˆ μΉœμˆ™ν•˜κ³  νŽΈλ¦¬ν•˜κΈ°μ— 자주 μ‚¬μš©λ©λ‹ˆλ‹€.

5-2. Q. POST와 PUT의 μ°¨μ΄λŠ” 무엇인가?

β€’
POST λ©”μ„œλ“œλŠ” INSERT이며 PUT λ©”μ„œλ“œλŠ” UPDATE이닀.
β€’
POSTλ©”μ„œλ“œμ˜ 경우, λ©±λ“±ν•˜μ§€ μ•Šμ•„ λ™μΌν•œ μžμ›μ„ μ—¬λŸ¬λ²ˆ POSTν•˜λ©΄ μ„œλ²„μžμ›μ— λ³€ν™”κ°€ 생긴닀.
β€’
PUTλ©”μ„œλ“œμ˜ 경우, λ©±λ“±ν•˜μ—¬ λ™μΌν•œ μžμ›μ„ μ—¬λŸ¬λ²ˆ PUTν•˜λ©΄ μ„œλ²„μžμ›μ΄ λ³€ν™”ν•˜μ§€ μ•Šκ³  λ™μΌν•œ λ¦¬μ†ŒμŠ€λ‘œ μ‘λ‹΅ν•œλ‹€.
β€’
즉, POSTλ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ μžμ›μ„ μƒμ„±ν•˜κΈ°μ— μ—¬λŸ¬λ²ˆ μš”μ²­ν•˜λ©΄ μ„œλ²„ λ¦¬μ†ŒμŠ€μ— λ³€ν™”κ°€ μƒκΈ°μ§€λ§Œ, PUT의 경우, 생성이 μ•„λ‹Œ μˆ˜μ •μ„ ν•˜λ©°, μ—¬λŸ¬λ²ˆ μš”μ²­ν•΄λ„ μ„œλ²„ λ¦¬μ†ŒμŠ€μ— λ³€ν™”κ°€ μ—†λ‹€.

5-3. Q. PUTκ³Ό PATCH의 μ°¨μ΄λŠ” 무엇인가?

β€’
PUT은 ν•΄λ‹Ή μžμ›μ˜ 전체λ₯Ό κ΅μ²΄ν•˜μ§€λ§Œ, PATCHλŠ” μΌλΆ€λ§Œ λ³€κ²½ν•œλ‹€.
β€’
PUT은 λ©±λ“±ν•˜μ§€λ§Œ, PATCHλŠ” λ©±λ“±ν•˜μ§€ λͺ»ν•˜λ‹€.

5-4. Q. λ©±λ“±(Idempotent)은 무엇인가?

β€’
λ™μΌν•œ μž‘μ—…μ„ μ—¬λŸ¬ 번 μ‹€ν–‰ν•˜λ”λΌλ„ κ²°κ³Όκ°€ λ™μΌν•˜κ²Œ μœ μ§€λ˜λŠ” μ„±μ§ˆμ„ μ˜λ―Έν•œλ‹€.
β€’
즉, λ™μΌν•œ μš”μ²­μ„ μ—¬λŸ¬ 번 μ‹€ν–‰ν•˜λ”λΌλ„ 처음 μš”μ²­κ³Ό 같은 μƒνƒœμ™€ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
β€’
μ΄λŠ” μš”μ²­μ˜ 반볡 μ‹€ν–‰μ΄λ‚˜ 쀑볡 전솑이 λ°œμƒν•΄λ„ μ‹œμŠ€ν…œμ˜ μƒνƒœκ°€ λ³€ν•˜μ§€ μ•ŠλŠ” 것을 μ˜λ―Έν•œλ‹€.