REST
a way of providing interoperability between computer systems on the internet. ์ปดํจํฐ ์์คํ ๊ฐ์ ์ํธ์ด์ฉ์ฑ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ค ํ๋
WEB (1991)
์ด๋ป๊ฒ ์ธํฐ๋ท์์ ์ ๋ณด๋ฅผ ๊ณต์ ํ ๊ฒ์ธ๊ฐ? -> ์ ๋ณด๋ค์ ํ์ดํผํ ์คํธ๋ก ์ฐ๊ฒฐํ๋ค. ํ์ : HTML ์๋ณ์ : URI ์ ์ก ๋ฐฉ๋ฒ : HTTP
HTTP/1.0 (1994-1996)
Roy T.Fielding : ์ด๋ป๊ฒ ํ๋ฉด ์น์ ๋ง๊ฐ๋จ๋ฆฌ์ง ์๊ณ HTTP ํ๋กํ ์ฝ์ ์ง๋ณด์ํฌ ์ ์์๊น? -> HTTP Object Model -> (1998) Representational State Transfer๋ก ๋ฐํ -> (2000) โArchitectural Styles and the Design of Network-based Software Architecturesโ๋ก ๋ฐํ
API
-
XML-RPC(1998) ์๊ฒฉ์ผ๋ก ๋ค๋ฅธ ์์คํ ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ ํ๋กํ ์ฝ
-
Salesforce API(SOAP)(2000.2)
- flickr API(2004.8)
- SOAP, REST
-
SOAP vs REST : REST๊ฐ ๋จ์ํ๊ณ ์ฝ๋ค
-
CMIS(2008) CMS๋ฅผ ์ํ ํ์ค REST ๋ฐ์ธ๋ฉ ์ง์ Roy T.Fielding โNo REST in CMISโ
- REST API Guidelines(2016) uri๋ https://{serviceRoot}/{collection}/{id} ํ์์ด์ด์ผ ํ๋ค. GET, PUT, DELETE, POST, HEAD, PATCH, OPTIONS๋ฅผ ์ง์ํด์ผ ํ๋ค. ๋ฒ์ ๋์ Major.minor๋ก ํ๊ณ uri์ ๋ฒ์ ์ ๋ณด๋ฅผ ํฌํจ์ํจ๋ค. -> Roy T.Fielding โREST API๊ฐ ์๋๋ผ HTTP API๋ผ๊ณ ํด์ผ ํ๋ค.โ -> โREST APIs must be hypertext-drivenโ -> REST API๋ฅผ ์ํ ์ต๊ณ ์ ๋ฒ์ ๋ ์ ๋ต์ ๋ฒ์ ๋์ ์ ํ๋ ๊ฒ
์ฌ๋๋ค์ด ์๊ฐํ๋ REST API์ Roy T.Fielding์ด ์๊ฐํ๋ REST API๊ฐ ๋ค๋ฅด๋ค. ๋ฌธ์ ๊ฐ ๋ญ๊น?โฆ
REST API
-> REST ์ํคํ ์ณ ์คํ์ผ์ ๋ฐ๋ฅด๋ API
REST
-> ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ (ex.์น)์ ์ํ ์ํคํ ์ณ ์คํ์ผ
์ํคํ ์ณ ์คํ์ผ
-> ์ ์ฝ์กฐ๊ฑด์ ์งํฉ, ์ฆ, ์ํคํ ์ณ ์คํ์ผ์ ๋ชจ๋ ๋ฐ๋ผ์ผ REST๋ฅผ ๋ง์กฑํ๋ ๊ฒ์
REST๋ฅผ ๊ตฌ์ฑํ๋ ์คํ์ผ
- client-server
- stateless
- cache
- layered system
- uniform interface : ์ ๋ง์กฑ ๋ชปํจ
- uniform Interface์ ์ ์ฝ์กฐ๊ฑด
- ๋ฆฌ์์ค๊ฐ uri๋ก ์๋ณ๋๋ฉด ๋๋ค.
- ๋ฆฌ์์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ญ์ ํ ๋ http ๋ฉ์ธ์ง์ ํํ์ ๋ด์์ ์ ์กํ ์ ์์ด์ผ ํ๋ค.
- self-descriptive messages(๋ฉ์ธ์ง๋ ์ค์ค๋ก๋ฅผ ์ค๋ช ํด์ผ ํ๋ค.)
- ๋ฉ์ธ์ง์ ๋ด์ฉ์ผ๋ก ์จ์ ํ ํด์์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
- hyper media as the engine of application state(HATEOAS)
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ ํ์ดํผ๋งํฌ๋ฅผ ์ด์ฉํด ์ ์ด๋์ด์ผ ํ๋ค.
- 3,4๋ฒ์ ๋๋ถ๋ถ ์ ์ง์ผ์ง- code-on-demand(optional) : ์๋ฒ์์ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ๋ฅผ ๋ณด๋ด์ ์คํํ ์ ์์ด์ผ ํ๋ค(์๋ฐ์คํฌ๋ฆฝํธ)
๊ทธ๋ ๋ค๋ฉด ์ Uniform Interface๊ฐ ํ์ํ๊ฐ?
๋ ๋ฆฝ์ ์งํ๋ฅผ ์ํด์โฆ
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์งํํ๋ค.
- ์๋ฒ์ ๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋์ด๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ค.
- REST๋ฅผ ๋ง๋ค๊ฒ ๋ ๊ณ๊ธฐ : ์ด๋ป๊ฒ ํ๋ฉด ์น์ ๋ง๊ฐ๋จ๋ฆฌ์ง ์๊ณ HTTP ํ๋กํ ์ฝ์ ์ง๋ณด์ํฌ ์ ์์๊น?
์น์ ์ ๋ง์กฑํ๋?
- REST๋ฅผ ์์ฃผ ์ ๋ง์กฑํ๊ณ ์์
- ์น ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ๋ฐ์ดํธํ ํ์X
- ๋ฐ๋๋ ์ฑ๋ฆฝ
- HTTP ๋ช ์ธ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ HTML ๋ช ์ธ๊ฐ ๋ณ๊ฒฝ๋๋ ์น์ ์ ๋์
- ์ด์จ๋ ์ต์ํ์ ๋์์ ํ๋ค!!!!
-> ์น์ ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฑธ๊น? HTML, HTTP, ์น ๋ธ๋ผ์ฐ์ , ์น ์๋ฒ ๊ฐ๋ฐ์๋ค์ ๋ ธ๋ ฅโฆ ํ์ํธํ์ฑ์ ๊นจ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์ด๋ง์ด๋งํ ์๊ฐ์ด ๋ค์ด๊ฐ
์๋ชป ๋ง๋ค์ด์ง ๊ตฌํ์ฒด๋ค๊ณผ์ ์ํธ์ด์ฉ์ฑ์กฐ์ฐจ๋ ์ง์ผ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ์กด์ฌํ๋ค.
- Referer ์คํ์ง๋ง ์ ๊ณ ์นจ
- charset ์๋ชป ์ง์ ์ด๋ฆ์ด์ง๋ง ์ ๊ณ ์นจ
- HTTP ์ํ ์ฝ๋ 416 ํฌ๊ธฐํจ
- HTTP/0.9 ์์ง๋ ์ง์ํจ(ํฌ๋กฌ, ํ์ด์ดํญ์ค)
REST๊ฐ ์น์ ๋ ๋ฆฝ์ ์งํ์ ๋์์ ์ฃผ์๋?
- HTTP ์ง์์ ์ผ๋ก ์ํฅ์ ์ค
- Host ํค๋ ์ถ๊ฐ
- ๊ธธ์ด ์ ํ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ด ๋ช ์(414 URI Too Long๋ฑ)
- URL์์ ๋ฆฌ์์ค์ ์ ์๊ฐ ์ถ์์ ์ผ๋ก ๋ณ๊ฒฝ๋จ: โ์๋ณํ๊ณ ์ ํ๋ ๋ฌด์ธ๊ฐโ ์์ ์๋ โ๋ฌธ์์ ์์นโ๋ก ์ ์ํ์
- ๊ธฐํ HTTP์ URI์ ๋ง์ ์ํฅ์ ์ค
- HTTP/1.1 ๋ช ์ธ ์ต์ ํ์์ REST์ ๋ํ ์ธ๊ธ์ด ๋ค์ด๊ฐ
- Roy T.Fielding๊ฐ REST ๋ฟ ์๋๋ผ HTTP, URI ๋ช ์ธ์ ์ ์์ด๊ธฐ ๋๋ฌธ
๊ทธ๋ผ REST๋ ์ฑ๊ณตํ๋๊ฐ?
- REST๋ ์น์ ๋ ๋ฆฝ์ ์งํ๋ฅผ ์ํด ๋ง๋ค์ด์ก๋ค.
- ์น์ ๋ ๋ฆฝ์ ์ผ๋ก ์งํํ๊ณ ์๋ค.
-> ์ฑ๊ณต
๊ทธ๋ ๋ค๋ฉด REST API๋?
REST API๋ ์ ์ฝ์กฐ๊ฑด์ ๋ค ์ง์ผ์ผ ํ๋ค๊ณ Roy T.Fielding๊ฐ ๋ช ์ํจ
ํ์ค์ ์ผ๋ก ์ฝ์ง ์์๋ฐ ์๊ฒฉ API๊ฐ ๊ผญ REST API์ฌ์ผ ํ๋๊ฑด๊ฐ?
๊ทธ๊ฑด ์๋๋ผ๊ณ ํจ!!
- ์์คํ ์ ์ฒด๋ฅผ ํต์ ํ ์ ์๋ค๊ณ ์๊ฐํ๊ฑฐ๋, ์งํ์ ๊ด์ฌ์ด ์๋ค๋ฉด, REST์ ๋ํด ๋ฐ์ง๋๋ผ ์๊ฐ์ ๋ญ๋นํ์ง ๋ง๋ผ
๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ ํ ๊น?
- REST API๋ฅผ ๊ตฌํํ๊ณ REST API๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- REST API ๊ตฌํ์ ํฌ๊ธฐํ๊ณ HTTP API๋ผ๊ณ ๋ถ๋ฅธ๋ค. 3. REST API๊ฐ ์๋์ง๋ง REST API๋ผ๊ณ ๋ถ๋ฅธ๋ค.(ํ์ฌ ์ํ)
1๋ฒ ๊ฒฝ์ฐ๋ฅผ ๋์ ํด๋ณด์
์ผ๋จ ์ API๋ REST๊ฐ ์ ์๋๋ ์ผ๋ฐ์ ์ธ ์น๊ณผ ๋น๊ต ํด๋ณธ๋ค.
โ๋ถ์์ โ ํ๋จ ์๋ฏธ๋ ๋ฌธ๋ฒ ํด์์ ๊ฐ๋ฅํ๋, ์๋ฏธ๋ฅผ ํด์ํ๋ ค๋ฉด ๋ณ๋๋ก ๋ฌธ์(API ๋ฌธ์ ๋ฑ)๊ฐ ํ์ํ๋ค๋ ์๋ฏธ
Self-descriptive
- ์๋ต ๋ฉ์์ง์ Content-Type์ ๋ณด๊ณ media type์ด text/html์์ ํ์ธ
- HTTP ๋ช ์ธ์ media type์ IANA์ ๋ฑ๋ก๋์ด์๋ค๊ณ ํ๋ฏ๋ก, IANA์์ text/html์ ์ค๋ช ์ ์ฐพ๋๋ค.
- IANA์ ๋ฐ๋ฅด๋ฉด text/html์ ๋ช ์ธ๋ http://www.w3.org/TR/html์ด๋ฏ๋ก ๋งํฌ๋ฅผ ์ฐพ์๊ฐ ๋ช ์ธ๋ฅผ ํด์ํ๋ค.
- ๋ช ์ธ์ ๋ชจ๋ ํ๊ทธ์ ํด์๋ฐฉ๋ฒ์ด ๋์์์ผ๋ฏ๋ก ํด์ ๊ฐ๋ฅ
HATEOAS
a ํ๊ทธ๋ฅผ ์ด์ฉํด ํํ๋ ๋งํฌ๋ฅผ ํตํด ๋ค์ ์ํ๋ก ์ ์ด๋ ์ ์์ผ๋ฏ๋ก ๋ง์กฑ
Self-descriptive
- ์๋ต ๋ฉ์์ง์ Content-Type์ ๋ณด๊ณ media type์ด application/json์์ ํ์ธ
- HTTP ๋ช ์ธ์ media type์ IANA์ ๋ฑ๋ก๋์ด์๋ค๊ณ ํ๋ฏ๋ก, IANA์์ application/json์ ์ค๋ช ์ ์ฐพ๋๋ค.
- IANA์ ๋ฐ๋ฅด๋ฉด application/json์ ๋ช ์ธ๋ draft-ietf-jsonbis-rfc7159bis-04์ด๋ฏ๋ก ๋งํฌ๋ฅผ ์ฐพ์๊ฐ ๋ช ์ธ๋ฅผ ํด์ํ๋ค.
- ๋ช ์ธ์ json ๋ฌธ์๋ฅผ ํ์ฑํ๋ ๋ฐฉ๋ฒ์ด ๋ช ์๋์ด์์ผ๋ฏ๋ก ์ฑ๊ณต์ ์ผ๋ก ํ์ฑ์ ์ฑ๊ณตํ๋ค. **๊ทธ๋ฌ๋ โidโ๊ฐ ๋ฌด์์ ์๋ฏธํ๊ณ , โtitleโ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ฐฉ๋ฒ์ ์๋ค. **
HATEOAS
๋งํฌ๊ฐ ์์ด ๋ค์ ์ํ๋ก ์ ์ดํ ์ ์๋ค.
HTML ์ฑ๊ณต, json ์คํจ
๊ทธ๋ฐ๋ฐ Self-descriptive์ HATEOAS๊ฐ ๋ ๋ฆฝ์ ์งํ์ ์ด๋ป๊ฒ ๋์์ด ๋๋๊ฐ?
- Self-descriptive(ํ์ฅ ๊ฐ๋ฅํ ์ปค๋ฎค๋์ผ์ด์
)
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ค๊ณ ๊ฐ๋ ๋ฉ์์ง๋ ์ธ์ ๋ ๋ฉ์์ง๋ง์ผ๋ก ํด์ ๊ฐ๋ฅํ๋ค.
- HATEOAS
- ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์ ์ด์ late binding : ์ด๋์ ์ด๋๋ก ์ ์ด๊ฐ ๊ฐ๋ฅํ์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ๋์ง ์๋๋ค. ์ด๋ค ์ํ๋ก ์ ์ด๊ฐ ์๋ฃ๋๊ณ ๋์์ผ ๊ทธ ๋ค์ ์ ์ด๋ ์ ์๋ ์ํ๊ฐ ๊ฒฐ์ ๋๋ค. ์ฆ, ๋งํฌ๋ฅผ ์๋ฒ๊ฐ ๋ง์๋๋ก ๋ฐ๊ฟ ์ ์๋ค. ์๋ฒ๊ฐ ๋งํฌ๋ฅผ ๋ฐ๊พธ์ด๋ ํด๋ผ์ด์ธํธ์ ๋์์ ๋ณํ์ง ์๋๋ค.
์ ๋ฆฌ
- ์ค๋๋ ๋๋ถ๋ถ์ โREST APIโ๋ ์ฌ์ค REST๋ฅผ ๋ฐ๋ฅด์ง ์๊ณ ์๋ค.
- REST์ ์ ์ฝ์กฐ๊ฑด ์ค์์ Self-descriptive์ HATEOAS๋ฅผ ์ ๋ง์กฑํ์ง ๋ชปํ๋ค.
- REST๋ ๊ธด ์๊ฐ์ ๊ฑธ์ณ ์งํํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ฒ์ด๋ค.
- REST๋ฅผ ๋ฐ๋ฅผ ๊ฒ์ธ์ง๋ API๋ฅผ ์ค๊ณํ๋ ์ด๋ค์ด ์ค์ค๋ก ํ๋จํ์ฌ ๊ฒฐ์ ํด์ผ ํ๋ค.
- ๋ฐ๋ฅผ ๊ฒ์ด๋ผ๋ฉด, Self-descriptive์ HATEOAS๋ฅผ ๋ง์กฑ์์ผ์ผ ํ๋ค.
- Self-descriptive๋ custom media type์ด๋ profile link relation ๋ฑ์ผ๋ก ๋ง์กฑ์ํฌ ์ ์๋ค.
- HATEOAS๋ HTTP ํค๋๋ ๋ณธ๋ฌธ์ ๋งํฌ๋ฅผ ๋ด์ ๋ง์กฑ์ํฌ ์ ์๋ค.
- ๋ฌผ๋ก ๋จ์ ๋ค์ด ์กด์ฌํ์ง๋งโฆ
- ๋ฐ๋ฅด์ง ์๊ฒ ๋ค๋ฉด, ๋ญ๋ผ๊ณ ๋ถ๋ฅผ์ง ๊ฒฐ์ ํด์ผ ํ๋ค.
- HTTP API๋ผ๊ณ ๋ถ๋ฅด๊ฑฐ๋ ๊ทธ๋ฅ REST๋ฅผ ๋ฐ๋ฅด์ง ์์์๋ REST API๋ผ๊ณ ๋ถ๋ฅผ ์๋ ์๋ค.
Leave a comment