Study_Develop

REST APIλž€?

hiijihyun 2023. 8. 27. 16:46
λ°˜μ‘ν˜•

REST λž€?

 

REST ꡬ성 3κ°€μ§€ : μžμ›, ν–‰μœ„, λ©”μ‹œμ§€

 

1. μžμ›(resource) : μ ‘κ·Όν•  λŒ€μƒ

 

2. λ©”μ„œλ“œ : HTTP Method - GET(쑰회) , POST(생성) , PUT(μˆ˜μ •), DELELTE(μ‚­μ œ)
* μΌλ°˜μ μœΌλ‘œλŠ” GET, POST λ°©μ‹μ„ μ‚¬μš©ν•˜λ‚˜, RESTμ—μ„œλŠ” PUT, DELETE도 μ‚¬μš©ν•œλ‹€.

 

3. λ©”μ‹œμ§€

ex) " μƒν’ˆλͺ…이  μ§„라면인 μƒν’ˆμ„ μƒμ„±ν•œλ‹€” λΌλŠ” 호좜이 μžˆμ„ λ•Œ,
“μƒν’ˆ”은 μƒμ„±λ˜λŠ” μžμ› (resource)
“μƒμ„±ν•œλ‹€”λΌλŠ” ν–‰μœ„λŠ” λ©”μ„œλ“œ (post)
"μƒν’ˆλͺ…이 μ§„라면인 μƒν’ˆ"은 λ©”μ‹œμ§€   ({"name":"진라면","price":"1000"})

 

μœ„μ˜ μ˜ˆμ‹œλ₯Ό rest ν˜•νƒœλ‘œ ν‘œν˜„ν•˜λ©΄?

 

HTTP POST , http://localhost/products/ {
	"products": {
    		"name":"진라면",
		"price":"1000"
	}
}

 

- “Representational State Transfer”의 μ•½μž, μžμ›μ„ 이름(μžμ›μ˜ ν‘œν˜„)으둜 κ΅¬λΆ„ν•˜μ—¬ ν•΄λ‹Ή μžμ›μ˜ μƒνƒœ(정보)λ₯Ό μ£Όκ³  λ°›λŠ” λͺ¨λ“  것을 μ˜λ―Έν•œλ‹€.

 

- 즉, μžμ›(resource)의 ν‘œν˜„(representation)에 μ˜ν•œ μƒνƒœ 전달

 

A. μžμ›(resource)의 ν‘œν˜„(representation)μ΄λž€? 

 

μžμ›: ν•΄λ‹Ή swκ°€ κ΄€λ¦¬ν•˜λŠ” λͺ¨λ“  것 ( λ¬Έμ„œ, κ·Έλ¦Ό, 데이터, ν•΄λ‹Ή μ†Œν”„νŠΈμ›¨μ–΄ 자체 λ“±) 

μžμ›μ˜ ν‘œν˜„: κ·Έ μžμ›μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•œ 이름 

 

B. μƒνƒœ(정보) 전달

 

- 데이터가 μš”μ²­λ˜μ–΄μ§€λŠ” μ‹œμ μ—μ„œ μžμ›μ˜ μƒνƒœ(정보)λ₯Ό μ „λ‹¬ν•œλ‹€. JSON ν˜Ήμ€ XMLλ₯Ό ν†΅ν•΄ λ°μ΄ν„°λ₯Ό μ£Όκ³  λ°›λŠ” κ²ƒμ΄ μΌλ°˜μ μ΄λ‹€.

 

- μ›”λ“œ μ™€μ΄λ“œ μ›Ή (WWW)κ³Ό κ°™μ€ λΆ„μ‚° ν•˜μ΄νΌλ―Έλ””μ–΄ μ‹œμŠ€ν…œμ„ μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œ μ•„ν‚€ν…μ²˜μ˜ ν•œ ν˜•식RESTλŠ” κΈ°λ³Έμ μœΌλ‘œ μ›Ήμ˜ κΈ°μ‘΄ κΈ°μˆ κ³Ό HTTP ν”„λ‘œν† μ½œμ„ κ·ΈλŒ€λ‘œ ν™œμš©ν•˜κΈ° λ•Œλ¬Έμ— μ›Ήμ˜ μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•  μˆ˜ μžˆλŠ” μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ΄λ‹€.

 

- RESTλŠ” λ„€νŠΈμ›Œν¬μƒμ—μ„œ Client와 Server μ‚¬μ΄μ˜ 톡신 방식 쀑 ν•˜λ‚˜μ΄λ‹€.

 

 

REST 의 ꡬ체적인 κ°œλ…

 

- HTTP(HyperText Transfer Protocol) λŠ” μ›Ήμƒμ—μ„œ 데이터λ₯Ό μ£Όκ³  λ°›κΈ° μœ„ν•œ ν”„λ‘œν† μ½œμ„ μ˜λ―Έν•œλ‹€.

 

- HTTP URL(Uniform Resource Identifier)을 ν†΅ν•΄ μžμ›(Resource)을 λͺ…μ‹œν•˜κ³ , HTTP Method(POST, GET, PUT, DELETE)λ₯Ό ν†΅ν•΄ ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ CRUD Operation을 μ μš©ν•˜λŠ” κ²ƒμ„ μ˜λ―Έν•œλ‹€.

 

- 즉, RESTλŠ” μžμ› 기반의 ꡬ쑰(ROA, Resource Oriented Architecture) μ„€κ³„μ˜ 쀑심에 Resourceκ°€ 있고 HTTP Methodλ₯Ό 톡해 Resourceλ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ μ„€κ³„λœ μ•„ν‚€ν…μ²˜λ₯Ό μ˜λ―Έν•œλ‹€.


- μ›Ή μ‚¬μ΄νŠΈμ˜ 이미지, ν…μŠ€νŠΈ, DB λ‚΄μš© λ“±μ˜ λͺ¨λ“  μžμ›μ— κ³ μœ ν•œ ID인 HTTP URLλ₯Ό λΆ€μ—¬ν•œλ‹€.

 

- Create : 생성(POST)
- Read : 쑰회(GET)
- UPdate : μˆ˜μ •(PUT)
- Delete : μ‚­μ œ(DELETE)
- HEAD : header 정보 쑰회(HEAD)

 

 

REST 의 ν•„μš”μ„±

 

- ‘μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 뢄리 및 톡합’


- ‘λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈμ˜ λ“±μž₯’


- 졜근의 μ„œλ²„ ν”„λ‘œκ·Έλž¨μ€ λ‹€μ–‘ν•œ λΈŒλΌμš°μ €μ™€ μ•ˆλ“œλ‘œμ΄λ“œν°, 아이폰과 같은 λͺ¨λ°”일 λ””λ°”μ΄μŠ€μ—μ„œλ„ 톡신을 ν•  수 μžˆμ–΄μ•Όν•œλ‹€.


- μ΄λŸ¬ν•œ λ©€ν‹° ν”Œλž«νΌμ— λŒ€ν•œ 지원을 μœ„ν•΄ μ„œλΉ„μŠ€ μžμ›μ— λŒ€ν•œ μ•„ν‚€ν…μ²˜λ₯Ό μ„Έμš°κ³  μ΄μš©ν•˜λŠ” 방법을 λͺ¨μƒ‰ν•œ κ²°κ³Ό, REST에 관심을 κ°€μ§€κ²Œ λ˜μ—ˆλ‹€.

 

REST ꡬ성 μš”μ†Œ

 

μžμ›(Resource): URL

 

- λͺ¨λ“  μžμ›μ— κ³ μœ ν•œ idκ°€ μ‘΄μž¬ν•˜κ³ , 이 μžμ›μ€ server에 μ‘΄μž¬ν•œλ‹€.

 

- μžμ›μ„ κ΅¬λ³„ν•˜λŠ” id λŠ” '/groups/:group_id'와 같은 http url이닀.

 

- client λŠ” urlλ₯Ό μ΄μš©ν•΄μ„œ μžμ›μ„ μ§€μ •ν•˜κ³  ν•΄λ‹Ή μžμ›μ˜ μƒνƒœ(정보)에 λŒ€ν•œ μ‘°μž‘μ„ server에 μš”μ²­ν•œλ‹€.

 

ν–‰μœ„ (Verb) : http method

 

- httpν”„λ‘œν† μ½œμ˜ Methodλ₯Ό μ‚¬μš©ν•œλ‹€.

 

- httpν”„λ‘œν† μ½œμ€ get, post, put, delete와 같은 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

 

ν‘œν˜„(Representation of Resource): νŽ˜μ΄λ‘œλ“œλ₯Ό 이

 

- clientκ°€ μžμ›μ˜ μƒνƒœ(정보)에 λŒ€ν•œ μ‘°μž‘μ„ μš”μ²­ν•˜λ©΄ ServerλŠ” 이에 μ μ ˆν•œ 응닡(Representation)을 보낸닀.

 

- Restμ—μ„œ ν•˜λ‚˜μ˜ μžμ›μ€ json, xml, rss, text λ“± μ—¬λŸ¬ ν˜•νƒœμ˜  Representation으둜 λ‚˜νƒ€λ‚΄μ–΄ 질 수 μžˆλ‹€.

 

- jsonν˜Ήμ€ xmlλ₯Ό 톡해 데이터λ₯Ό μ£Όκ³  λ°›λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

 

 

REST νŠΉμ§•

 

 

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

 

ν΄λΌμ΄μ–ΈνŠΈ(Client) = 고객

μ„œλ²„(Server) : μ„œλΉ„μŠ€ 제곡자

 

 

- μžμ›μ΄ μžˆλŠ” μͺ½μ΄ server, μžμ›μ„ μš”μ²­ν•˜λŠ” μͺ½μ΄ Clientκ°€ λœλ‹€.

 

REST Server: apiλ₯Ό μ œκ³΅ν•˜κ³ , λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리 및 μ €μž₯을 μ±…μž„μ§„λ‹€.

client: μ‚¬μš©μž μΈμ¦μ΄λ‚˜ context(μ„Έμ…˜, 둜그인 정보) 등을 직접 κ΄€λ¦¬ν•˜κ³  μ±…μž„μ§„λ‹€.

 

- μ„œλ‘œκ°„ μ˜μ‘΄μ„±μ΄ 쀄어든닀.

 

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

 

- httpν”„λ‘œν† μ½œμ€ Stateless Protocolμ΄λ―€λ‘œ rest μ—­μ‹œ λ¬΄μƒνƒœμ„±μ„ κ°–λŠ”λ‹€.

 

- client의 contextλ₯Ό Server에 μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. ( 즉, μ„Έμ…˜κ³Ό 쿠킀와 같은 context정보λ₯Ό μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ κ΅¬ν˜„μ΄ λ‹¨μˆœν•΄μ§„λ‹€.)

 

- ServerλŠ” 각각의 μš”μ²­μ„ μ™„μ „νžˆ λ³„κ°œμ˜ κ²ƒμœΌλ‘œ μΈμ‹ν•˜κ³  μ²˜λ¦¬ν•œλ‹€.

 

- 각 api μ„œλ²„λŠ” client의 μš”μ²­λ§Œμ„ λ‹¨μˆœ μ²˜λ¦¬ν•œλ‹€.

- 즉, 이전 μš”μ²­μ΄ λ‹€μŒ μš”μ²­μ˜ 처링 μ—°κ΄€λ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€.

- λ¬Όλ‘  이전 μš”μ²­μ΄ DBλ₯Ό μˆ˜μ •ν•˜μ—¬ DB에 μ˜ν•΄ λ°”λ€ŒλŠ” 것은 ν—ˆμš©ν•œλ‹€.

- server의 처리 방식에 일관성을 λΆ€μ—¬ν•˜κ³  뢀담이 쀄어듀며, μ„œλΉ„μŠ€μ˜ μžμœ λ„κ°€ λ†’μ•„μ§„λ‹€.

 

Cacheable(μΊμ‹œ 처리 κΈ°λŠ₯)

 

- μ›Ή ν‘œμ€€ httpν”„λ‘œν† μ½œμ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ―€λ‘œ μ›Ήμ—μ„œ μ‚¬μš©ν•˜λŠ” 기쑴의 인프라λ₯Ό κ·ΈλŒ€λ‘œ ν™œμš©ν•  수 μžˆλ‹€.

 

- 즉, httpκ°€ κ°€μ§„ κ°€μž₯ κ°•λ ₯ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜μΈ 캐싱 κΈ°λŠ₯을 μ μš©ν•  수 μžˆλ‹€.

 

- httpν”„λ‘œν† μ½œ ν‘œμ€€μ—μ„œ μ‚¬μš©ν•˜λŠ” Last-ModifiedνƒœμŠ€λ‚˜ E-Tagλ₯Ό μ΄μš©ν•˜λ©΄ 캐싱 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

 

- λŒ€λŸ‰μ˜ μš”μ²­μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μΊμ‹œκ°€ μš”κ΅¬λœλ‹€.

 

- μΊμ‹œ μ‚¬μš©μ„ 톡해 μ‘λ‹΅μ‹œκ°„μ΄ 빨라지고 REST ServerνŠΈλžœμž­μ…˜μ΄ λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 전체 μ‘λ‹΅μ‹œκ°„, μ„±λŠ₯, μ„œλ²„μ˜ μžμ› 이용λ₯ μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

 

Layered System(계측화)

- ClientλŠ” REST API server만 ν˜ΈμΆœν•œλ‹€.

 

- REST ServerλŠ” λ‹€μ€‘ κ³„μΈ΅μœΌλ‘œ κ΅¬μ„±λ  μˆ˜ μžˆλ‹€.

- API ServerλŠ” 순수 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³  κ·Έ μ•žλ‹¨μ— λ³΄μ•ˆ, λ‘œλ“œλ°ΈλŸ°μ‹±, μ•”ν˜Έν™”, μ‚¬μš©μž 인증 등을 μΆ”κ°€ν•˜μ—¬ κ΅¬μ‘°μƒμ˜ μœ μ—°μ„±μ„ 쀄 수 μžˆλ‹€.

- λ˜ν•œ λ‘œλ“œλ°ΈλŸ°μ‹±, 곡유 μΊμ‹œ 등을 톡해 ν™•μž₯μ„±κ³Ό λ³΄μ•ˆμ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

 

- PROXY, κ²Œμ΄νŠΈμ›¨μ–΄ 같은 λ„€νŠΈμ›Œν¬ 기반의 쀑간 맀체λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

REST APIλž€?

 API(Application Programming Interface) λž€?

 

- apiλž€ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  수 μžˆλ„λ‘ μ„œλ²„ μΈ‘μ—μ„œ 제곡된 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€.

 

- REST API: REST μ•„ν‚€ν…μ²˜λ₯Ό λ”°λ₯΄λŠ” APIλ₯Ό 의미

 

- REST API호좜 : REST 방식을 λ”°λ₯΄κ³  μžˆλŠ” μ„œλ²„μ— νŠΉμ •ν•œ μš”μ²­μ„ μ „μ†‘ν•˜λŠ” 것을 의미 (μ—¬κΈ°μ„œ μ–΄λ–€ ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό 주고받을지 λͺ…μ‹œν•  ν•„μš”κ°€ μžˆλŠ”λ°, λ°”λ‘œ μ—¬κΈ°μ„œ JSON포맷이 μ‚¬μš©λœλ‹€.)

 

+ ) JSONμ΄λž€? JavaScript Object Notation, 데이터λ₯Ό μ£Όκ³  λ°›λŠ”κ²Œ μ‚¬μš©ν•˜λŠ” κ²½λŸ‰μ˜ 데이터 ν˜•μ‹

 

 

 

- μ΄λŸ¬ν•œ api둜 데이터와 κΈ°λŠ₯의 집합을 μ œκ³΅ν•˜μ—¬ 컴퓨터 ν”„λ‘œκ·Έλž¨ κ°„ μƒν˜Έμž‘μš©μ„ μ΄‰μ§„ν•˜λ©°, μ„œλ‘œ 정보λ₯Ό κ΅ν™˜κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€.

 

- μ„œλ²„λ₯Ό κ°œλ°œν•œλ‹€λŠ” 것은 api에 λŒ€ν•œ λ§ˆμŠ€ν„° κΆŒν•œμ΄ μƒκΈ°λŠ” 것이닀.

 

- api와 ν•¨κ»˜ 항상 메뉴얼도 μ œκ³΅λ˜μ–΄μ•Ό ν•œλ‹€. 

 

REST API의 μ •μ˜

 

- REST 기반으둜 μ„œλΉ„μŠ€ APIλ₯Ό κ΅¬ν˜„ν•˜λŠ” 것

 

- 졜근 OPEN API(λˆ„κ΅¬λ‚˜ μ‚¬μš©ν•  수 μžˆλ„λ‘ 곡개된 API) , 마이크둜 μ„œλΉ„μŠ€(ν•˜λ‚˜μ˜ 큰 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ—¬λŸ¬ 개의 μž‘μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μͺΌκ°œμ–΄ λ³€κ²½κ³Ό 쑰합이 κ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“  아킀텍쳐) 등을 μ œκ³΅ν•˜λŠ” 업체 λŒ€λΆ€λΆ„μ€ REST APIλ₯Ό μ œκ³΅ν•œλ‹€.

 

 

REST API 섀계 μ˜ˆμ‹œ

 

μ°Έκ³ : 응닡 μƒνƒœ μ½”λ“œ

 

1XX : μ „솑 ν”„λ‘œν† μ½œ μˆ˜μ€€μ˜ μ •보 κ΅ν™˜
2XX : ν΄λΌμ΄μ–ΈνŠΈ μš”청이 μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λ¨
3XX : ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”청을 μ™„λ£Œν•˜κΈ° μœ„ν•΄ μΆ”가적인 ν–‰λ™μ„ μ·¨ν•΄μ•Ό ν•¨
4XX : ν΄λΌμ΄μ–ΈνŠΈμ˜ μž˜λͺ»λœ μš”μ²­
5XX : μ„œλ²„μͺ½ μ˜€λ₯˜λ‘œ μΈν•œ μƒνƒœμ½”λ“œ