Search

REST

REST API의 탄생

β€’
Representational State Transfer
β€’
μ›Ήμ˜ μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•  수 μžˆλŠ” μ•„ν‚€ν…μ²˜λ‘œμ„œ REST λ°œν‘œ

APIλž€?

β€’
μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€
β€’
λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œκ³Ό ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ 따라야 ν•˜λŠ” κ·œμΉ™ μ •μ˜
β€’
μ›Ή API - ν΄λΌμ΄μ–ΈνŠΈμ™€ μ›Ή λ¦¬μ†ŒμŠ€ μ‚¬μ΄μ˜ κ²Œμ΄νŠΈμ›¨μ΄
ν΄λΌμ΄μ–ΈνŠΈ
μ›Ήμ—μ„œ 정보에 μ•‘μ„ΈμŠ€ν•˜λ €λŠ” μ‚¬μš©μž ( μ‚¬λžŒ or μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œ )
λ¦¬μ†ŒμŠ€
λ‹€μ–‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ œκ³΅ν•˜λŠ” 정보 (이미지, λ™μ˜μƒ λ“± λͺ¨λ“  μœ ν˜•μ˜ 데이터)
μ„œλ²„ : ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•˜λŠ” μ‹œμŠ€ν…œ

RESTλž€ λ¬΄μ—‡μΈκ°€μš”?

β€’
API μž‘λ™ 방식에 λŒ€ν•œ 쑰건을 λΆ€κ³Όν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜
β€’
인터넷과 같은 λ³΅μž‘ν•œ λ„€νŠΈμ›Œν¬μ—μ„œ 톡신을 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ§€μΉ¨
β€’
λŒ€κ·œλͺ¨μ˜ κ³ μ„±λŠ₯ 톡신을 μ•ˆμ •μ μœΌλ‘œ 지원
HTTP URI(Uniform Resorce Identifier)λ₯Ό 톡해 μžμ›(Resource)을 λͺ…μ‹œν•˜κ³  HTTP Method(POST, GET, PUT, DELETE, PATCH λ“±)을 톡해 ν•΄λ‹Ή μžμ›(URI)에 λŒ€ν•œ CRUD Operation을 μ μš©ν•˜λŠ” 것

CRUD Operation

β€’
CRUDλŠ” λŒ€λΆ€λΆ„μ˜ 컴퓨터 μ†Œν”„νŠΈμ›¨μ–΄κ°€ κ°€μ§€λŠ” 기본적인 데이터 처리 κΈ°λŠ₯을 λ¬Άμ–΄μ„œ μΌμ»«λŠ” 말
Create
데이터 생성 (POST)
Read
데이터 쑰회 (GET)
Update
데이터 μˆ˜μ • (PUT, PATCH)
Delete
데이터 μ‚­μ œ (DELETE)
REST API : REST μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ„ λ”°λ₯΄λŠ” API
RESTful API : REST μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬ν˜„ν•˜λŠ” μ›Ή μ„œλΉ„μŠ€ (RESTful μ›Ή API)
β€’
RESTful
β—¦
REST의 원리λ₯Ό λ”°λ₯΄λŠ” μ‹œμŠ€ν…œ
β—¦
RESTλ₯Ό μ‚¬μš©ν–ˆλ‹€κ³  λͺ¨λ‘κ°€ RESTfulν•œ 것은 μ•„λ‹˜
β—¦
REST API 섀계 κ·œμΉ™μ„ μ˜¬λ°”λ₯΄κ²Œ 지킨 μ‹œμŠ€ν…œ
β—¦
RESTful ν•˜μ§€ λͺ»ν•œ 경우
β–ͺ
CRUD κΈ°λŠ₯을 λͺ¨λ‘ POST둜만 μ²˜λ¦¬ν•˜λŠ” API
β–ͺ
route에 resource, id μ™Έμ˜ 정보닀 λ“€μ–΄κ°€λŠ” 경우
β€’
REST API와 RESTful APIλΌλŠ” μš©μ–΄λŠ” 같은 의미둜 μ‚¬μš©ν•  수 있음

REST ꡬ성 μš”μ†Œ

β€’
μžμ›(Resource) : HTTP URI
β€’
μžμ›μ— λŒ€ν•œ ν–‰μœ„(Verb) : HTTP METHOD
β€’
μžμ›μ— λŒ€ν•œ ν–‰μœ„μ˜ λ‚΄μš©(ν‘œν˜„)(Representations) : HTTP Message Pay Load
Pay Load : μ „μ†‘λ˜λŠ” 데이터

REST API 호좜 단계

1.
ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­μ„ 전솑 고유 λ¦¬μ†ŒμŠ€ μ‹λ³„μž + λ©”μ„œλ“œ + HTTP 헀더 (API λ¬Έμ„œμ— 따라 μ„œλ²„κ°€ μ΄ν•΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ μš”μ²­ ν˜•μ‹ μ§€μ •)
2.
μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό 인증 β‡’ κΆŒν•œμ΄ ν΄λΌμ΄μ–ΈνŠΈμ— μžˆλŠ”μ§€ 확인
3.
μ„œλ²„κ°€ μš”μ²­μ„ μˆ˜μ‹ ν•˜κ³  λ‚΄λΆ€μ μœΌλ‘œ 처리
4.
μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ— 응닡 λ°˜ν™˜ μš”μ²­ 성곡 μ—¬λΆ€ + μš”μ²­ν•œ λͺ¨λ“  정보
(μƒνƒœν‘œμ‹œμ€„ + λ©”μ‹œμ§€ λ³Έλ¬Έ + 헀더)

REST μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ˜ 원칙 (REST API νŠΉμ§•)

κ· μΌν•œ μΈν„°νŽ˜μ΄μŠ€ (Uniform Interface)

URI둜 μ§€μ •ν•œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ‘°μž‘μ„ ν†΅μΌλ˜κ³  ν•œμ •μ μΈ μΈν„°νŽ˜μ΄μŠ€λ‘œ μˆ˜ν–‰ν•˜λŠ” μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌ

λ¬΄μƒνƒœ (Stateless)

μž‘μ—…μ„ μœ„ν•œ μƒνƒœ 정보λ₯Ό λ”°λ‘œ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜μ§€ μ•ŠμŒ - μ„Έμ…˜ μ •λ³΄λ‚˜ μΏ ν‚€ 정보λ₯Ό λ³„λ„λ‘œ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— API μ„œλ²„λŠ” λ“€μ–΄μ˜€λŠ” μš”μ²­λ§Œμ„ λ‹¨μˆœ 처리

계측화 μ‹œμŠ€ν…œ (Layered System)

REST μ„œλ²„λŠ” 닀쀑 κ³„μΈ΅μœΌλ‘œ ꡬ성될 수 있으며 λ³΄μ•ˆ λ“±μ˜ 계측을 μΆ”κ°€ν•΄ ꡬ쑰 μƒμ˜ μœ μ—°μ„±μ„ λ‘˜ 수 있음

μΊμ‹œ κ°€λŠ₯μ„± (Cache)

HTTPλΌλŠ” κΈ°μ‘΄ μ›Ή ν‘œμ€€μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— HTTP의 캐싱 κΈ°λŠ₯ 적용

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

μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ ꡬ뢄

μ˜¨λ””λ§¨λ“œ μ½”λ“œ (Code-On-Demand)

μ„œλ²„λ‘œλΆ€ν„° 슀크립트λ₯Ό λ°›μ•„μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‹€ν–‰ν•˜λŠ” 것 λ°˜λ“œμ‹œ μΆ©μ‘±ν•  ν•„μš” X

REST API 섀계 μ˜ˆμ‹œ

URIλŠ” λ™μ‚¬λ³΄λ‹€λŠ” λͺ…사λ₯Ό, λŒ€λ¬Έμžλ³΄λ‹€λŠ” μ†Œλ¬Έμžλ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€
Bad Example http://ssafy.com/Running Good Example http://ssafy.com/run
JavaScript
볡사
λ§ˆμ§€λ§‰μ— μŠ¬λž˜μ‹œ(/) λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€
Bad Example http://ssafy.com/test/ Good Example http://ssafy.com/test
JavaScript
볡사
언더바 λŒ€μ‹  ν•˜μ΄ν”ˆμ„ μ‚¬μš©ν•œλ‹€
Bad Example http://ssafy.com/test_blog Good Example http://ssafy.com/test-blog
JavaScript
볡사
파일 ν™•μž₯μžλŠ” URI에 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€
Bad Example http://ssafy.com/photo.jpg Good Example http://ssafy.com/photo
JavaScript
볡사
ν–‰μœ„λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€
Bad Example http://ssafy.com/delete-post/1 Good Example http://ssafy.com/post/1
HTML
볡사

RESTful APIλ₯Ό μ‚¬μš©ν•˜λ©΄ μ–΄λ–€ 이점이 μžˆλ‚˜μš”?

μœ„μ˜ λ‚΄μš©μ„ λ‹€μ‹œ μ •λ¦¬ν•œ 것 (λ„˜μ–΄κ°)

ν™•μž₯μ„±

β€’
REST APIλ₯Ό κ΅¬ν˜„ν•˜λŠ” μ‹œμŠ€ν…œμ€ RESTκ°€ ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μƒν˜Έ μž‘μš©μ„ μ΅œμ ν™”ν•˜κΈ° λ•Œλ¬Έμ— 효율적으둜 크기 μ‘°μ • κ°€λŠ₯
β€’
λ¬΄μƒνƒœλŠ” μ„œλ²„κ°€ κ³Όκ±° ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 정보λ₯Ό μœ μ§€ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— μ„œλ²„ λ‘œλ“œλ₯Ό 제거
λ¬΄μƒνƒœ
β€’
잘 κ΄€λ¦¬λœ 캐싱은 일뢀 ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μƒν˜Έ μž‘μš©μ„ λΆ€λΆ„μ μœΌλ‘œ λ˜λŠ” μ™„μ „νžˆ 제거
β‡’ μ΄λŸ¬ν•œ λͺ¨λ“  κΈ°λŠ₯은 μ„±λŠ₯을 μ €ν•˜μ‹œν‚€λŠ” 톡신 병λͺ© ν˜„μƒμ„ μΌμœΌν‚€μ§€ μ•ŠμœΌλ©΄μ„œ ν™•μž₯성을 지원

μœ μ—°μ„±

β€’
RESTful μ›Ή μ„œλΉ„μŠ€λŠ” μ™„μ „ν•œ ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ 뢄리λ₯Ό 지원 각 뢀뢄이 λ…λ¦½μ μœΌλ‘œ λ°œμ „ν•  수 μžˆλ„λ‘ λ‹€μ–‘ν•œ μ„œλ²„ ꡬ성 μš”μ†Œλ₯Ό λ‹¨μˆœν™”ν•˜κ³  뢄리
β€’
μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν”Œλž«νΌ λ˜λŠ” 기술 변경은 ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 영ν–₯ X
β€’
μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν•¨μˆ˜λ₯Ό κ³„μΈ΅ν™”ν•˜λŠ” κΈ°λŠ₯은 μœ μ—°μ„±μ„ λ”μš± ν–₯μƒμ‹œν‚΄
(예) κ°œλ°œμžλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ„ λ‹€μ‹œ μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ λ°μ΄ν„°λ² μ΄μŠ€ 계측을 λ³€κ²½ν•  수 있음

독립성

β€’
REST APIλŠ” μ‚¬μš©λ˜λŠ” 기술과 독립적
β€’
API 섀계에 영ν–₯을 μ£Όμ§€ μ•Šκ³  λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ¨λ‘ μž‘μ„±ν•  수 있음
β€’
톡신에 영ν–₯을 μ£Όμ§€ μ•Šκ³  μ–‘μͺ½μ˜ κΈ°λ³Έ κΈ°μˆ μ„ λ³€κ²½ν•  수 있음

REST API μž₯점

1.
Open API λ₯Ό μ œκ³΅ν•˜κΈ° 쉽닀
2.
λ©€ν‹°ν”Œλž«νΌ 지원 및 연동이 μš©μ΄ν•˜λ‹€.
3.
μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ 데이터λ₯Ό μ£Όκ³  받을 수 μžˆλ‹€.
4.
κΈ°μ‘΄ μ›Ή 인프라(HTTP)λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

REST API 단점

1.
μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œκ°€ μ œν•œμ μ΄λ‹€.
2.
λΆ„μ‚°ν™˜κ²½μ—λŠ” λΆ€μ ν•©ν•˜λ‹€.** rest api λŠ” μ λŒ€μ (μΌλŒ€μΌλ‘œ λ…λ¦½μ μœΌλ‘œ μ—°κ²°ν•˜λŠ” 방식) λͺ¨λΈμ„ κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ— λ‘˜ 이상을 λŒ€μƒμœΌλ‘œν•˜λŠ” λΆ„μ‚°ν™˜κ²½μ—λŠ” 뢀적합
3.
HTTP 톡신 λͺ¨λΈμ— λŒ€ν•΄μ„œλ§Œ μ§€μ›ν•œλ‹€.
+단점 이유, url&uri, restapi μ•„ν‚€ν…μ²˜
λ‹€λ₯Έμ‚¬λžŒ μš”μ•½λ³Έ