REST์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ API
์ต๊ทผ OpenAPI(๋๊ตฌ๋ ์ฌ์ฉํ ์ ์๋๋ก ๊ณต๊ฐ๋ API: ๊ตฌ๊ธ ๋งต, ๊ณต๊ณต ๋ฐ์ดํฐ ๋ฑ),
๋ง์ดํฌ๋ก ์๋น์ค(ํ๋์ ํฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์ชผ๊ฐ์ด
๋ณ๊ฒฝ๊ณผ ์กฐํฉ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ ์ํคํ
์ฒ) ๋ฑ์ ์ ๊ณตํ๋ ์
์ฒด ๋๋ถ๋ถ์ REST API๋ฅผ ์ ๊ณตํ๋ค
API(Application Programming Interface)๋
- ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ์งํฉ์ ์ ๊ณตํ์ฌ ์ปดํจํฐ ํ๋ก๊ทธ๋จ๊ฐ ์ํธ์์ฉ์ ์ด์งํ๋ฉฐ, ์๋ก ์ ๋ณด๋ฅผ ๊ตํ๊ฐ๋ฅ ํ๋๋ก ํ๋ ๊ฒ
- ์ฌ๋ด ์์คํ ๋ค๋ REST ๊ธฐ๋ฐ์ผ๋ก ์์คํ ์ ๋ถ์ฐํด ํ์ฅ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ ์ ์ง๋ณด์ ๋ฐ ์ด์ฉ์ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋ค.
- REST๋ HTTP ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ฏ๋ก, HTTP๋ฅผ ์ง์ํ๋ ํ๋ก๊ทธ๋จ ์ธ์ด๋ก ํด๋ผ์ด์ธํธ, ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์๋ค.
- ์ฆ, REST API๋ฅผ ์ ์ํ๋ฉด ๋ธํ์ด ํด๋ผ์ด์ธํธ ๋ฟ ์๋๋ผ, ์๋ฐ, C#, ์น ๋ฑ์ ์ด์ฉํด ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ํ ์ ์๋ค.
1๏ธโฃURI์ ํํ ์ฌ๋์(/ => ๋ง์ง๋ง์ ๋ถ์ด๋ ์ฌ๋์) ๋ ํฌํจ๋์ง ์์์ผ ํฉ๋๋ค.
ํผ๋์ ์ค์ ์๊ณ ์๋ฏธ๊ฐ ์๋ ํํ ์ฌ๋์๋ฅผ URI ๊ฒฝ๋ก์ ๋ง์ง๋ง์ย ํฌํจ์ํค์ง ์๋ ๊ฒ์ ๋ฐ๋ผ์ผ ํ ๊ท์น๋ค ์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ค ํ๋ ์ ๋๋ค. REST API๋ ํํ ์ฌ๋์๋ฅผ ๊ฐ์ง์ง ์์์ผ ํ๊ณ client๋ค์๊ฒ ์ ๊ณตํ๋ ๋งํฌ์ ํํ ์ฌ๋์๋ ํฌํจ๋์ง ์์์ผ ํฉ๋๋ค.
๋ง์ ์น component๋ค๊ณผ framework๋ค์ ์๋ ๋๊ฐ์ URI๋ฅผ ๊ฐ๊ฒ ์ธ์ํฉ๋๋ค :
**http://api.canvas.com/shapes/**
**http://api.canvas.com/shapes**
๊ทธ๋ฌ๋ URI์ ๋ชจ๋ ๊ธ์๋ค์ resource๋ค์ ๊ณ ์ ํ ๊ตฌ๋ณ์๋ก ๊ณ์ฐ๋ฉ๋๋ค.
๋๊ฐ์ ๋ค๋ฅธ URI๋ ๋๊ฐ์ ๋ค๋ฅธ resource๋ค์ ๊ฐ๋ฆฌํต๋๋ค. ๋ง์ฝ URI๊ฐ ๋ค๋ฅด๋ค๋ฉด resource๋ค๋ ๋ค๋ฅธ๊ฒ์ ๋๋ค, ๊ทธ ๋ฐ๋๋ํ ๋ง์ฐฌ๊ฐ์ง ๊ตฌ์. ๊ทธ๋ฌ๋ฏ๋ก REST API๋ ๊นจ๋ํ URI๋ฅผ ์์ฑํ๊ณ ์ํตํด์ผ ํ๋ฉฐ resource๋ฅผ ๋ชจํธํ๊ฒ ์๋ณํ๋ ค๋ client์ ์๋๋ฅผ ํ์ฉํ์ง ์์์ผ ํฉ๋๋ค.
๋ ๋๊ทธ๋ฌ์ด API ๋ค์ ํํ ์ฌ๋์ ์์ด client๋ค์ URI๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํฌ ๊ฒ์ ๋๋ค.(301์ ๋ฐํํ ์๋ ์๋ค -"์์ํ ์ด๋" ์์๋ค์ ์ฌ์์น ์ํค๊ธฐ ์ํด ์ฌ์ฉ๋์ด์ง๊ณค ํ๋ค.)
์ฌ๋์(/) ๋ฌธ์๋ URI์ ๊ฒฝ๋ก ๋ถ๋ถ์์ resource๋ค ๊ฐ์ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
For example:ย **[http://api.canvas.com/shapes/polygons/quadrilaterals/squares](http://api.canvas.com/shapes/polygons/quadrilaterals/squares)**
URI๋ฅผ ์ฌ๋์๊ฒ ์ฝ๊ฒ ์ธ์๋๊ณ ํด์๋๊ฒ ํ๊ณ , ๊ธด ๊ฒฝ๋ก ์์ ์ด๋ฆ์ ๊ฐ๋ ์ฑ์ ์ฆ๊ฐ ์ํค๊ธฐ ์ํด ํ์ดํ(-)์ ์ฌ์ฉํ์ธ์. ์์ด๋ก ๊ณต๋ฐฑ์ด๋ ํ์ดํ์ ์ฌ์ฉํ ๊ฒฝ์ฐ URI์ ํ์ดํ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
For example:ย **[http://api.example.com/blogs/guy-levin/posts/this-is-my-first-post](http://api.example.com/blogs/guy-levin/posts/this-is-my-first-post)**
ํ ์คํธ viewer ์ดํ๋ฆฌ์ผ์ด์ ๋ค(๋ธ๋ผ์ฐ์ , ์๋ํฐ, ๋ฑ๋ฑ)์ ์ข ์ข URI์ ํด๋ฆญํ ์ ์๋ค๋ ์๊ฐ์ ํํธ๋ฅผ ์ฃผ๊ธฐ์ํด ๋ฐ์ค์ ์ฌ์ฉํฉ๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ ํฐํธ์ ๋ฐ๋ผ ์ธ๋๋ฐ(_) ๋ฌธ์๋ ๋ฐ์ค๋ก ์ธํด ๋ถ๋ถ์ ์ผ๋ก ๋ณด์ด์ง ์๊ฑฐ๋ ์์ ํ ๊ฐ๋ ค์ง ์ ์์ต๋๋ค.
์ด๋ฌํ ํผ๋์ ํผํ๊ธฐ ์ํด ์ธ๋๋ฐ(_) ๋์ ํ์ดํ(-)์ ์ฌ์ฉํ์ธ์
๋๋ฌธ์๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก URI ๊ฒฝ๋ก์์๋ ์๋ฌธ์๋ฅผ ์ ํธํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
RFC 3986์ URI๋ฅผ scheme ํน์ host component๋ฅผ ์ ์ธํ๊ณ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์ผ๋ก ์ ์ํ์์ต๋๋ค.
For example:
1)ย **http://api.example.com/my-folder/my-doc**
2)ย **[HTTP://API.EXAMPLE.COM/my-folder/my-doc](http://api.example.com/my-folder/my-doc)**
์์ uri๋ ๊ด์ฐฎ์ต๋๋ค. RFC 3986์์๋ 1๋ฒ URI์ ๊ฐ์ ๊ฒ์ผ๋ก ์ธ์ํฉ๋๋ค.
3)ย **http://api.example.com/My-Folder/my-doc**
์ด URI๋ 1๋ฒ, 2๋ฒ๊ณผ ๊ฐ์ง ์์ต๋๋ค. ๋ถํ์ํ ํผ๋์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์น์์์ ๋ง์นจํ(.) ๋ฌธ์๋ URI์์ ํ์ผ์ ์ด๋ฆ๊ณผ ํ์ฅ์๋ฅผ ๊ตฌ๋ถํ๋๋ฐ ํํ ์ฌ์ฉ๋ฉ๋๋ค. REST API๋ ๋ฉ์์ง๋ค์ ๊ฐ์ฒด body๋ฅผ ๋ํ๋ด๋ ์ํด URI์ ์์์ ํ์ผ ํ์ฅ์๋ฅผ ํฌํจํ์ง ์์์ผ ํฉ๋๋ค. ๋์ body์ ๋ด์ฉ์ด ์ด๋ป๊ฒ ํ๋ฅด๋์ง ๊ฒฐ์ ํ๋ Content-Type header๋ฅผ ํตํด ์ ๋ฌ๋๋ media-type์ ์์กดํ์ฌ์ผ ํฉ๋๋ค.
**http://api.college.com/students/3248234/courses/2005/fall.json**
**http://api.college.com/students/3248234/courses/2005/fall**
ํ์ผ ํ์ฅ์๋ format ์ ํธ๋ฅผ ๋ํ๋ด๊ธฐ์ํด ์ฌ์ฉ๋๋ฉด ์๋ฉ๋๋ค.
REST API client๋ค์ HTTP๊ฐ ์ ๊ณตํ๋ ํ์ ์ ํ ๋ฉ์ปค๋์ฆ์ธ Accpet request ํค๋๋ฅผ ์ฌ์ฉํ๋๋ก ํด์ผ ํฉ๋๋ค.
๊ฐ๋จํ link๋ค๊ณผ ์ฌ์ด ๋๋ฒ๊น ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด REST API๋ query parameter๋ฅผ ํตํด ๋ฏธ๋์ด ํ์ ์ ํ์ ์ง์ํ ์ ์์ต๋๋ค.
๊ฐ๋จํ๊ฒ ์ ์งํ๋ผ๋ ๊ท์น์ ์ด๊ณณ์๋ ์ ์ฉ๋ฉ๋๋ค. ๋น๋ก ๊ฐ์ ๋ด์ฌํ๋ ๋ฌธ๋ฒ๊ท์น์ด single instance๋ resource๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ๋ณต์ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ ธ๋ค๊ณ ํ ์ง๋ผ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ต์ URI ํ์์์ ํญ์ ๋ณต์ํ์ ์ฌ์ฉํ๋ผ๋ ๊ฒ์ ๋๋ค.
๋ถ๊ท์น ๋ณต์ํ(person/people, goose/geese)๋ค์ ๋ค๋ฃจ์ง ์๋๊ฒ์ด API ์ฌ์ฉ์๋ค์ ์ํ์ ๋ ์ข๊ณ API ์ ๊ณต์๋ค์ด ๋ ์ฝ๊ฒ ์ํํ ์ ์๋๋ก ๋ง๋ค์ด ์ค๋๋ค.(๋๋ถ๋ถ์ ํ๋ ํ๋ ์์ํฌ๋ค์ /students์ /students/3248234๋ฅผ ๊ฐ์ ์ปจํธ๋กค๋ฌ์์ ๋ค๋ฃน๋๋ค.)
๊ทธ๋ฐ๋ฐ ๊ด๊ณ๋ค์ ์ด๋ป๊ฒ ๋ค๋ฃจ์ด์ผ ํ ๊น์? ๊ด๊ณ๊ฐ ๋ค๋ฅธ ์์ ๋ด์์๋ง ์กด์ฌํ ์ ์๋ ๊ฒฝ์ฐ RESTful ์์น์ ์ ์ฉํ ์์น์ ์ ๊ณตํฉ๋๋ค.
์์๋ฅผ ํ๋ฒ ์ดํด๋ณผ๊ฒ์. ํ ํ์์ด ๋ณต์๊ฐ์ ๊ณผ๋ชฉ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ๊ณผ๋ชฉ๋ค์ /studensts์ ๋ ๋ถ๋ถ์ ์์นํ๊ฒ ๋ฉ๋๋ค.
**[http://api.college.com/students/3248234/courses](http://api.college.com/students/3248234/courses)**
id 3248234๋ฅผ ๊ฐ์ง ํ์์ด ๋ฐฐ์ด ๋ชจ๋ ๊ณผ๋ชฉ๋ค์ ๋ฐํํฉ๋๋ค.
**[http://api.college.com/students/3248234/courses/physics](http://api.college.com/students/3248234/courses/physics)**ย
id 3248234๋ฅผ ๊ฐ์ง ํ์์ด ๋ฐฐ์ด ๋ฌผ๋ฆฌํ ๊ณผ๋ชฉ๋ค์ ๋ฐํํฉ๋๋ค.
โConclusion โ
REST API ์๋น์ค๋ฅผ ์ค๊ณํ ๋ URI์ ๋ํ๋ด์ด์ง๋ resource๋ค์ ์ง์ค์ ํด์ผํฉ๋๋ค.
์๋น์ค ๋ด์ ๊ฐ๊ฐ์ resource๋ค์ ํ๋ ์ด์์ URI ์๋ณ์๋ฅผ ๊ฐ์ง๊ฒ ๋ ๊ฒ์ ๋๋ค. URI๊ฐ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์ ํ resource๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. URI๋ ์์ธก๊ฐ๋ฅํด์ผ ํ๋ฉฐ ์ดํด๋ ฅ์ ๋์ด๊ธฐ ์ํด ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ ์ฌ์ฉ์ฑ์ ๋ฐ์ดํฐ๊ฐ ๊ตฌ์กฐ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์์ ์ผ๊ด๋๊ณ ๊ณ์ธต์ ์ด๋ผ๋ ์ ์์ ์์ธก ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
RESTful API๋ค์ ์ฌ์ฉ์๋ฅผ ์ํด ์์ฑ๋์ด์ ธ์ผ ํฉ๋๋ค. URI์ ์ด๋ฆ๊ณผ ๊ตฌ์กฐ๋ ์ฌ์ฉ์๋ค์๊ฒ ์๋ฏธ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ์์ ๊ท์น๋ค์ ๋ฐ๋ฆ์ผ๋ก์จ client๋ฅผ ์ข ๋ ํ๋ณตํ๊ฒ ํ๋ ํจ์ฌ ๊น๋ํ REST API๋ค์ ๋ง๋ค์ ์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ท์น์ด๋ ์ ์ฝ์กฐ๊ฑด์ด ๋๋์ง๋ง API๋ฅผ ํฅ์ ์ํฌ ๊ฒ์ ๋๋ค.
- RESTful์ ์ผ๋ฐ์ ์ผ๋ก REST๋ผ๋ ์ํคํ
์ณ๋ฅผ ๊ตฌํํ๋ ์น ์๋น์ค๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ฉ์ด์ด๋ค.
- REST API๋ฅผ ์ ๊ณตํ๋ ์น ์๋น์ค๋ฅผ RESTfulํ๋ค๊ณ ํ ์ ์๋ค.
- RESTful์ REST๋ฅผ REST ๋ต๊ฒ ์ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก, ๋๊ตฐ๊ฐ๊ฐ ๊ณต์์ ์ผ๋ก ๋ฐํํ ๊ฒ์ด ์๋๋ค.
- ์ฆ, REST ์๋ฆฌ๋ฅผ ์ ๋ฐ๋ฅด๋ ์์คํ ์ RESTful ์ฉ์ด๋ก ์ง์นญ๋๋ค.
- ์ดํดํ๊ธฐ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด REST API๋ฅผ ๋ง๋๋ ๊ฒ
- RESTfulํ API๋ฅผ ๊ตฌํํ๋ ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด ์ฑ๋ฅ ํฅ์์ ์๋ ๊ฒ์ด ์๋๋ผ ์ผ๊ด์ ์ธ ์ปจ๋ฒค์ ์ ํตํ API์ ์ดํด๋ ๋ฐ ํธํ์ฑ์ ๋์ด๋ ๊ฒ์ด ์ฃผ ๋๊ธฐ์ด๋, ์ฑ๋ฅ์ด ์ค์ํ ์ํฉ์์๋ ๊ตณ์ด RESTfulํ API๋ฅผ ๊ตฌํํ ํ์๋ ์๋ค.
- CRUD ๊ธฐ๋ฅ์ ๋ชจ๋ POST ๋ก๋ง ์ฒ๋ฆฌํ๋ API
- route์ resource, id ์ธ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ
references
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html