REST(Representational State Transfer)λ ν¨μ¨μ , μμ μ μ΄λ©° νμ₯κ°λ₯ν λΆμ°μμ€ν μ κ°μ Έμ¬ μ μλ μννΈμ¨μ΄ μν€ν μ² λμμΈ μ μ½μ λͺ¨μμ λνλ λλ€. κ·Έλ¦¬κ³ κ·Έ μ μ½λ€μ μ€μνμ λ κ·Έ μμ€ν μ RESTfulνλ€κ³ μΌμ»¬μ΄μ§λλ€.
-
RESTful
- RESTfulμ μΌλ°μ μΌλ‘ RESTλΌλ μν€ν
μ²λ₯Ό ꡬννλ μΉ μλΉμ€λ₯Ό λνλ΄κΈ° μν΄ μ¬μ©λλ μ©μ΄μ΄λ€.
- μ¦, REST μ리λ₯Ό λ°λ₯΄λ μμ€ν μ RESTfulμ΄λ μ©μ΄λ‘ μ§μΉλλ€.
- RESTfulμ RESTλ₯Ό RESTλ΅κ² μ°κΈ° μν λ°©λ²μΌλ‘, λκ΅°κ°κ° 곡μμ μΌλ‘ λ°νν κ²μ΄ μλλ€.
- RESTfulμ μΌλ°μ μΌλ‘ RESTλΌλ μν€ν
μ²λ₯Ό ꡬννλ μΉ μλΉμ€λ₯Ό λνλ΄κΈ° μν΄ μ¬μ©λλ μ©μ΄μ΄λ€.
-
HTTP νλ‘ν μ½μ κ·Έλλ‘ νμ©νκΈ° λλ¬Έμ μΉμ μ₯μ μ νμ©ν μ μλ μν€ν μ³ μ€νμΌμ΄λ€.
-
μμμ μ΄λ¦μΌλ‘ ꡬλΆνμ¬ ν΄λΉ μμμ μνλ₯Ό μ£Όκ³ , λ°λ λͺ¨λ κ²
μμ, μ‘°μ, νν
μμ(Resource)
-
μλ²μ μλ κ². DB μμ λ€μ΄κ° μλ λ°μ΄ν° λλ μ΄λ―Έμ§ νλνλλ₯Ό μλ―Ένλ€. ex) μ μ , μ£Όλ¬Έ, μ΄λ―Έμ§μ£Όμ λ±
-
URIλ₯Ό ν΅ν΄ μμμ λͺ μνκ³ , ꡬλΆν μ μλ€.
μ‘°μ(Verb; νμ)
- ν΄λΌμ΄μΈνΈλ HTTP Methodλ₯Ό μ΄μ©νμ¬ μ§μ ν μμμ λν μ‘°μμ μμ²νλ€.
νν(Representation of Resource)
-
μ΄λ€ 리μμ€μ νΉμ μμ μ μνλ₯Ό λ°μνκ³ μλ μ 보
-
ν΄λΌμ΄μΈνΈκ° μλ²μκ² μμμ λν μ‘°μμ μμ²νλ©΄ μλ²λ μ΄μ λν μ μ ν μλ΅μ 보λΈλ€.
-
RESTμμ νλμ μμμ JSON, XML λ± μ¬λ¬ ννμ RepresentationμΌλ‘ λνλ΄μ΄ μ§ μ μλ€.
-
Server-Client(μλ²-ν΄λΌμ΄μΈνΈ ꡬ쑰)
- ν΄λΌμ΄μΈνΈ-μλ² κ΅¬μ‘°λ μ¬μ©μ μΈν°νμ΄μ€μ λν κ΄μ¬μ λ°μ΄ν° μ μ₯μ λν κ΄μ¬μΌλ‘λΆν° λΆλ¦¬ν¨μΌλ‘μ¨ ν΄λΌμ΄μΈνΈμ μ΄μμ±κ³Ό μλ²μ κ·λͺ¨νμ₯μ±μ κ°μ νλ€.
- REST Server: APIλ₯Ό μ 곡νκ³ λΉμ¦λμ€ λ‘μ§ μ²λ¦¬ λ° μ μ₯μ μ± μμ§λ€.
- Client: μ¬μ©μ μΈμ¦μ΄λ context(μΈμ , λ‘κ·ΈμΈ μ 보) λ±μ μ§μ κ΄λ¦¬νκ³ μ± μμ§λ€.
- μλ‘ κ° μμ‘΄μ±μ΄ μ€μ΄λ λ€.
-
Stateless(무μν)
- ν΄λΌμ΄μΈνΈμ μλ²μ ν΅μ μλ μνκ° μμ΄μΌνλ€.
- λͺ¨λ μμ²μ νμν λͺ¨λ μ 보λ₯Ό λ΄κ³ μμ΄μΌνλ€.
- Clientμ contextλ₯Ό Serverμ μ μ₯νμ§ μλλ€. -> μΈμ κ³Ό μΏ ν€μ κ°μ context μ 보λ₯Ό μ κ²½μ°μ§ μμλ λλ―λ‘ κ΅¬νμ΄ λ¨μν΄μ§λ€.
- Serverλ κ°κ°μ μμ²μ μμ ν λ³κ°μ κ²μΌλ‘ μΈμνκ³ μ²λ¦¬νλ€. -> κ° API μλ²λ Clientμ μμ²λ§μ λ¨μ μ²λ¦¬νλ€. μ΄μ μμ²μ΄ λ€μ μμ²μ μ²λ¦¬μ μ°κ΄λμ΄μλ μλλ€.
-
Cacheable(μΊμ μ²λ¦¬ κ°λ₯)
- μΊμκ° κ°λ₯ν΄μΌνλ€. μ¦ λͺ¨λ μλ² μλ΅μ μΊμ κ°λ₯νμ§ κ·Έλ μ§ μλμ§ μ μ μμ΄μΌνλ€.
- μΊμ μ¬μ©μ ν΅ν΄ μλ΅μκ°μ΄ λΉ¨λΌμ§κ³ REST Server νΈλμμ μ΄ λ°μνμ§ μκΈ° λλ¬Έμ μ 체 μλ΅μκ°, μ±λ₯, μλ²μ μμ μ΄μ©λ₯ μ ν₯μμν¬ μ μλ€.
- HTTP νλ‘ν μ½ νμ€μμ μ¬μ©νλ LAST-Modified νκ·Έλ E-Tagλ₯Ό μ΄μ©ν΄ μΊμ± ꡬνμ΄ κ°λ₯νλ€.
-
Layered System(κ³μΈ΅ν)
- κ³μΈ΅(hierarchical layers)μΌλ‘ ꡬμ±μ΄ κ°λ₯ν΄μΌνλ©°, κ° λ μ΄μ΄μ μν ꡬμ±μμλ μΈμ νμ§ μμ λ μ΄μ΄μ ꡬμ±μμλ₯Ό λ³Ό μ μμ΄μΌνλ€.
- Clientλ REST API Serverλ§ νΈμΆνλ€.
- REST Serverλ λ€μ€ κ³μΈ΅μΌλ‘ ꡬμ±λ μ μμΌλ©°, 보μλ‘λ λ°Έλ°μ±, μνΈν κ³μΈ΅μ μΆκ°ν΄ ꡬ쑰μμ μ μ°μ±μ λ μ μκ³ PROXY, κ²μ΄νΈμ¨μ΄ κ°μ λ€νΈμν¬ κΈ°λ°μ μ€κ°λ§€μ²΄λ₯Ό μ¬μ©ν μ μκ² νλ€.
-
Uniform Interface(μΈν°νμ΄μ€ μΌκ΄μ±)
- ꡬμ±μμ(ν΄λΌμ΄μΈνΈ, μλ² λ±) μ¬μ΄μ μΈν°νμ΄μ€λ κ· μΌ(uniform)ν΄μΌνλ€.
- μμ²μ΄ μ΄λμμ μ€λμ§μ 무κ΄νκ², λμΌν 리μμ€μ λν λͺ¨λ API μμ²μ λμΌνκ² λ³΄μ¬μΌ νλ€.
- μ΄κ²μ μμ²μ νλ Clientκ° νλ«νΌ(Android, Ios, Jsp λ±) μ 무κ΄νλ©°, νΉμ μΈμ΄λ κΈ°μ μ μ’ μλ°μ§ μλ νΉμ§μ μλ―Ένλ€.
- REST APIλ μ¬μ©μμ μ΄λ¦μ΄λ μ΄λ©μΌ μ£Όμ λ±μ λμΌν λ°μ΄ν° μ‘°κ°μ΄ μ€μ§ νλμ URI(Uniform Resource Identifier)μ μν¨μ 보μ₯ν΄μΌ νλ€. 리μμ€κ° λ무 ν΄ νμλ μμ§λ§, μ΄λ ν΄λΌμ΄μΈνΈκ° νμλ‘ νλ λͺ¨λ μ 보λ₯Ό ν¬ν¨ν΄μΌ ν©λλ€.
-
Identification of resources
- 리μμ€κ° URIλ‘ μλ³λλ©΄ λλ€.
-
Manipulation of resources through representation
- 리μμ€λ₯Ό μμ²ν λ μλ²λ 리μμ€λ₯Ό νννμ¬ μλ΅νλ€.
- μ΄ ννμ ν΄λΌμ΄μΈνΈκ° μ΄ν΄νκ³ μ‘°μν μ μλ νμμΌλ‘ 리μμ€μ νμ¬ μνλ₯Ό μΊ‘μ²νλ€.
- μλ²κ° μμμ ννμ 보λ΄κΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈκ° ν΄λΌμ΄μΈνΈμ μꡬμ λ§λ νΉμ ννμ μμ²ν μ μλ€. (λ©νλ°μ΄ν° λ±μ νμ©) -> μ½ν μΈ νμ
- APIμμ μ½ν μΈ νμμ μ¬μ©νμ¬ μ¬λ¬ ν΄λΌμ΄μΈνΈκ° λμΌν URLμμ λ€λ₯Έ 리μμ€ ννμ μ‘μΈμ€ν μ μλλ‘ ν μ μλ€.
-
Self-Descriptiveness(μ체νν ꡬ쑰)
- REST API λ©μμ§λ§ λ³΄κ³ λ μ΄λ₯Ό μ½κ² μ΄ν΄ν μ μλ μ체 νν κ΅¬μ‘°λ‘ λμ΄μλ€.
-
HATEOS(Hypermedia As The Engine Of Application State)
- RESTful APIλ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈκ° μ μ μΌλ‘ μλ²μ μν΄ λμ μΌλ‘ μνΈμμ©μ ν μ μλ€. μ½κ² λ§νλ©΄ ν΄λΌμ΄μΈνΈκ° μλ²μ μμ²μ μλ²λ μμ²μ μμ‘΄λλ URIλ₯Ό Responseμ ν¬ν¨μμΌ λ°ννλ€.
- λμ μΈ APIλ₯Ό μ 곡ν μ μκ²λ©λλ€.(λͺ¨λ κ΄λ ¨λ λμμ URIλ₯Ό ν΅ν΄ μλ €μ€λλ€.) μ¦, ν΄λΌμ΄μΈνΈκ° APIμ λ³νμ μΌμΌμ΄ λμνμ§ μμλ λλ€λ μ₯μ μ κ°μ Έμ΅λλ€.
- Hypermedia (λ§ν¬)λ₯Ό ν΅ν΄μ μ ν리μΌμ΄μ μ μν μ μ΄κ° κ°λ₯ν΄μΌ νλ€. (Hypermedia (λ§ν¬)μ μκΈ° μμ μ λν΄ν μ λ³΄κ° λ΄κ²¨μΌ νλ€.)
{ "timeline_url": "https://github.com/timeline", "user_url": "https://github.com/{user}", "current_user_public_url": "https://github.com/octocat", "current_user_url": "https://github.com/octocat.private?token=abc123", "current_user_actor_url": "https://github.com/octocat.private.actor?token=abc123", "current_user_organization_url": "", "current_user_organization_urls": [ "https://github.com/organizations/github/octocat.private.atom?token=abc123" ], "security_advisories_url": "https://github.com/security-advisories", "_links": { "timeline": { "href": "https://github.com/timeline", "type": "application/atom+xml" }, "user": { "href": "https://github.com/{user}", "type": "application/atom+xml" }, "current_user_public": { "href": "https://github.com/octocat", "type": "application/atom+xml" }, "current_user": { "href": "https://github.com/octocat.private?token=abc123", "type": "application/atom+xml" }, "current_user_actor": { "href": "https://github.com/octocat.private.actor?token=abc123", "type": "application/atom+xml" }, "current_user_organization": { "href": "", "type": "" }, "current_user_organizations": [ { "href": "https://github.com/organizations/github/octocat.private.atom?token=abc123", "type": "application/atom+xml" } ], "security_advisories": { "href": "https://github.com/security-advisories", "type": "application/atom+xml" } } }
-
Code-On-Demand
- ν΄λΌμ΄μΈνΈμ μμ²μ λ°λΌ μλ²μμ ν΄λΌμ΄μΈνΈλ‘ μ€ν κ°λ₯ν μννΈμ¨μ΄λ₯Ό μ λ¬ν©λλ€.
- Clientμ 보λ΄λ λ°μ΄ν°λ₯Ό λ°λ‘ μ€ν κ°λ₯ν μ½λλ₯Ό 보λ΄μ μ΄κ²μ Clientμμ μ€ννλ κ²μ λ§νλ€.
- optional
μ₯μ
-
HTTP νλ‘ν μ½μ μΈνλΌλ₯Ό κ·Έλλ‘ μ¬μ©νλ―λ‘ REST API μ¬μ©μ μν λ³λμ μΈνλΌλ₯Ό ꡬμΆν νμκ° μλ€.
-
HTTP νλ‘ν μ½μ νμ€μ μ΅λν νμ©νμ¬ μ¬λ¬ μΆκ°μ μΈ μ₯μ μ ν¨κ» κ°μ Έκ° μ μκ² ν΄μ€λ€.
-
HTTP νμ€ νλ‘ν μ½μ λ°λ₯΄λ λͺ¨λ νλ«νΌμμ μ¬μ©μ΄ κ°λ₯νλ€.
-
REST API λ©μμ§κ° μλνλ λ°λ₯Ό λͺ ννκ² λνλ΄λ―λ‘ μλνλ λ°λ₯Ό μ½κ² νμ ν μ μλ€.
-
μλ²μ ν΄λΌμ΄μΈνΈμ μν μ λͺ ννκ² λΆλ¦¬νλ€.
λ¨μ
-
νμ€μ΄ μ‘΄μ¬νμ§ μλλ€. -> κ΄λ¦¬κ° μ½μ§ μλ€.
-
HTTP Method ννκ° μ νμ μ΄λ€. -> λ¨μν 보λ΄λ κΈ°λ₯ μΈμλ λ€μν μΈλΆ κΈ°λ₯λ€μ ꡬννλλ° μ μ½μ΄ λ°μν μ μλ€.
-
λΈλΌμ°μ λ₯Ό ν΅ν΄ ν μ€νΈν μΌμ΄ λ§μ μλΉμ€λΌλ©΄ μ½κ² κ³ μΉ μ μλ URLλ³΄λ€ Header κ°μ μ²λ¦¬ν΄μΌνλ―λ‘ μ λ¬Έμ±μ΄ μꡬλλ€.
-
point-to-point ν΅μ λͺ¨λΈμ κ°μ νλ―λ‘ λ μ΄μμΌλ‘ μνΈμμ©νλ λΆμ°νκ²½μλ μ μ©νμ§ μλ€.
-
REST APIμ μ μ
- REST κΈ°λ°μΌλ‘ μλΉμ€ APIλ₯Ό ꡬνν κ²
-
REST API μ€κ³ κΈ°λ³Έ κ·μΉ
- URIλ μ 보μ μμμ ννν΄μΌ νλ€.
- resourceλ λμ¬λ³΄λ€λ λͺ μ¬λ₯Ό μ¬μ©νλ€.
- resourceλ μμ΄ μλ¬Έμ 볡μνμ μ¬μ©νμ¬ νννλ€.
- Ex)
GET /Member/1->GET /members/1
- μμμ λν νμλ HTTP Method(GET, PUT, POST, DELETE λ±)λ‘ νννλ€.
- URIμ HTTP Methodκ° λ€μ΄κ°λ©΄ μλλ€.
- Ex)
GET /members/delete/1->DELETE /members/1 - URIμ νμμ λν λμ¬ ννμ΄ λ€μ΄κ°λ©΄ μλλ€.
- Ex)
GET /members/show/1->GET /members/1 - Ex)
GET /members/insert/2->POST /members/2
- URIλ μ 보μ μμμ ννν΄μΌ νλ€.