REST API
Web์ ๊ด๋ จ๋ ์๋ฃ๋ฅผ ๋ณด๊ฒ ๋๊ฑฐ๋ ํน์ API๋ฅผ ๋ณด๊ฒ ๋์์ ๋ ๊ฐ์ฅ ๋ง์ด ๋ณด์ด๋ ๋จ์ด๊ฐ REST๋ ๋จ์ด์๋ค. ํ์ง๋ง REST๋ ๋จ์ด๋ง ์๊ณ ๋ง ์์ ๋ฟ ์์ธํ ์๋ฏธ๋ ์์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธฐํ์ RESTful API์ ๋ํด ์ ๋ฆฌ๋ฅผ ์์ํด๋ณด๋ ค๊ณ ํ๋ค.
RESTful์ด๋?
- REST๋ Representational State Transfer๋ผ๋ ์ฉ์ด์ ์ฝ์๋ก์ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ ์ฒ
- ์ต๊ทผ์ ์๋ฒ ํ๋ก๊ทธ๋จ์ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์๋๋ก์ดํฐ, ์์ดํฐ๊ณผ ๊ฐ์ ๋ชจ๋ฐ์ผ ๋๋ฐ์ด์ค์์๋ ํต์ ์ ํ ์ ์์ด์ผ ํ๋ค.
- REST ์ํคํ ์ฒ๋ Hypermedia API์ ๊ธฐ๋ณธ์ ์ถฉ์คํ ์งํค๋ฉด์ ๋ฒ์ฉ์ฑ์ ๋ณด์ฅํ๋ค.
REST์ ํน์ง
1. Uniform (์ ๋ํผ ์ธํฐํ์ด์ค)
- Uniform Interface๋ URI๋ก ์ง์ ํ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ ์ํคํ ์ฒ ์คํ์ผ
2. Stateless (๋ฌด์ํ์ฑ)
- ์ํ๊ฐ ์๋ค ์๋ค๋ ์๋ฏธ๋ ์ฌ์ฉ์๋ ํด๋ผ์ด์ธํธ์ ์ปจํ์คํธ๋ฅผ ์๋ฒ์ชฝ์ ์ ์ง ํ์ง ์๋๋ค๋ ์๋ฏธํ๋ค.
- ์ธ์ ์ด๋ ์ฟ ํค๋ฑ์ ๋ณ๋๋ก ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ API์๋ฒ๋ ์์ฒญ๋ง์ ๋ค์ด์ค๋ ๋ฉ์์ง๋ก๋ง ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ๋จ์ํ๋ค.
3. Cacheable (์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ)
- REST์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ HTTP๋ผ๋ ๊ธฐ์กด ์นํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ด ์ ์ฉ ๊ฐ๋ฅํ๋ค. HTTP ํ๋กํ ์ฝ ํ์ค์์ ์ฌ์ฉํ๋ Last-Modifiedํ๊ทธ๋ E-Tag๋ฅผ ์ด์ฉํ๋ฉด ์บ์ฑ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
4. Self-descriptiveness (์์ฒด ํํ ๊ตฌ์กฐ)
- REST์ ๋ ๋ค๋ฅธ ํฐ ํน์ง ์ค ํ๋๋ REST API ๋ฉ์์ง๋ง ๋ณด๊ณ ๋ ์ด๋ฅผ ์ฝ๊ฒ ์ดํด ํ ์ ์๋ ์์ฒด ํํ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค๋ ๊ฒ
5. Client - Server Architecture (ํด๋ผ์ด์ธํธ - ์๋ฒ ๊ตฌ์กฐ)
- REST ์๋ฒ๋ API๋ฅผ ์ ๊ณตํ๊ณ , ์ ๊ณต๋ API๋ฅผ ์ด์ฉํด์ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ์ ์ฑ ์์ง๋ค.
- ํด๋ผ์ด์ธํธ์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ ์ปจํ์คํธ(์ธ์ ,๋ก๊ทธ์ธ ์ ๋ณด)๋ฑ์ ์ง์ ๊ด๋ฆฌํ๊ณ ์ฑ ์์ง๋ค.
- ์๋ก๊ฐ์ ์์กด์ฑ์ด ์ค์ด๋ค๊ฒ ๋๋ค.
6. ๊ณ์ธตํ ๊ตฌ์กฐ
- ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ REST ApI ์๋ฒ๋ง ํธ์ถํ๋ค.
- REST ์๋ฒ๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ณด์, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ, ์ฌ์ฉ์ ์ธ์ฆ๋ฑ๋ฑ ์ถ๊ฐํ์ฌ ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ์ค ์ ์๋ค.
REST ๊ตฌ์ฑ
- ์์(Resource) - URI
- ํ์(Verb) - HTTP Method (GET, PUT, POST, DELETE๋ฑ๋ฑ)
- ํํ(Representations)
REST API ๋์์ธ ๊ฐ์ด๋
- URI๋ Resource๋ฅผ ํํํด์ผ ํ๋ค.
- Resource์ ๋ํ ํ์๋ HTTP Method (GET, PUT, POST, DELETE๋ฑ๋ฑ)๋ก ํํํ๋ค.
1. REST API ์ค์ฌ ๊ท์น
1.1 URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค.
GET /course/insert/inform -- X
GET /course/inform -- O
- HTTP Method (GET, PUT, POST, DELETE๋ฑ๋ฑ)์ ํ์๊ฐ URI ํํ์ผ๋ก ๋ค์ด๊ฐ์๋ ์๋๋ค.
1.2 ์์์ ๋ํ ํ์๋ HTTP Method (GET, PUT, POST, DELETE๋ฑ๋ฑ)๋ก ํํ
DELETE /members/1
- HTTP Method(GET, PUT, POST, DELETE๋ฑ๋ฑ)๋ก ํ์๋ก CRUD๋ฅผ ํ ์ ์๋ค.
์ฐธ๊ณ ๋ด์ฉ
CRUD : ์ํํธ์จ์ด(Software)๊ฐ ๊ฐ์ง๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ฌถ์ด์ ์ผ์ปซ๋ ๋ง
- ์์ฑ(Create)
- ์ฝ๊ธฐ(Read)
- ๊ฐฑ์ (Update)
- ์ญ์ (Delete)
์ด๋ฆ | ์กฐ์ | SQL --------------- | ---------------- Create | ์์ฑ | INSERT Read(๋๋ Retrieve) | ์ฝ๊ธฐ(๋๋ ์ธ์ถ) | SELECT Update | ๊ฐฑ์ | UPDATE Delete(๋๋ Destroy) | ์ญ์ (๋๋ ํ๊ดด) | DELETE
2. URI ์ค๊ณ ์ ์ฃผ์ํ ์
2.1 ์๋ฌธ์๋ฅผ ๋๋๋ก์ด๋ฉด ์ฌ์ฉํ์
-
์๋ฅผ ๋ค์ด test.com์ ์์(Resource) Test์ test๊ฐ ์์ง๋ง ๋์๋ฌธ์์ ๋ฐ๋ผ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์์(Resource)์ผ๋ก ์ธ์ํ๊ฒ ๋๋ค.
-
RFC 3986(URI ๋ฌธ๋ฒ ํ์)์ URI ์คํค๋ง์ ํธ์คํธ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ๋๋ก ๊ท์ ํ๊ณ ์๋ค.
http://test.com/Test -- ์๋ก ๋ค๋ฅธ Resource : Test
http://test.com/test -- ์๋ก ๋ค๋ฅธ Resource : test
2.2 ํ์ดํ(-)์ URI ๊ฐ๋ ์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉํ์
-
๊ฒฝ๋ก(Path)์ ๋์ด์ฐ๊ธฐ๊ฐ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ %20์ด ๋ค์ด๊ฐ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๋ค.
-
ํ์ดํ(-)์ ์ฌ์ฉํ์ฌ ๋์ด์ฐ๊ธฐ๋ฅผ ๋์ฒดํ๊ณ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
2.3 ํ์ฅ์๋ฅผ ์ฌ์ฉํ์ง ๋ง์
- REST API์์๋ ํ์ฅ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด์ ์์(Resource)์ ๋ค๋ฃจ๋ ๋ฐ ๋ ์ ์ฐํด ์ง๋ค.
- ํ์ฅ์ ๋์ ์ Accept Header๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
http://test.com/test.jpg -- X
http://test.com/test -- O
GET /test HTTP/1.1
Host: test.com
Accept: image/jpg
3. ์์์ ํํํ๋ Collection๊ณผ Document
- ๋ํ๋จผํธ(Document)๋ ๋จ์ํ ๋ฌธ์์ ๊ฐ์ ์กด์ฌ
- ์ปฌ๋ ์ (Collection) ๋ฌธ์๋ค์ ์งํฉ, ๊ฐ์ฒด๋ค์ ์งํฉ๊ฐ์ ์กด์ฌ
http://test.com/citys/seoul/gangnam
- ์์ ์์ ์ค citys๊ฐ ์ปฌ๋ ์ (Collection)์ ํด๋น๋๋ฉฐ ๋ณต์๋ก ํํ์ ํ๊ณ ์๋ ์ ์ด ์ค์ํ๋ค.
4. HTTP ์๋ต ์ฝ๋
4.1 ์ฑ๊ณต(Success)
์ํ์ฝ๋ | ๋ด์ฉ |
---|---|
200 | ์ ์์ ์ผ๋ก ์ํ |
201 | ์์(Resource) ์์ฑ ์์ฒญ. ์ฑ๊ณต์ ์ผ๋ก ์ํ๋จ |
4.2 ํด๋ผ์ด์ธํธ ์๋ฌ(Client Error)
์ํ์ฝ๋ | ๋ด์ฉ |
---|---|
400 | ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ถ์ ์ ํ ๊ฒฝ์ฐ ์๋ต ์ฝ๋ |
401 | ํด๋ผ์ด์ธํธ๊ฐ ๊ถํ์ด ์๋ ์์(Resource)๋ฅผ ์์ฒญํ์์ ๋ ์๋ต ์ฝ๋ |
403 | ๋ณดํธ๋๋ ์์(Resource)๋ฅผ ์์ฒญํ์์ ๋ ์๋ต ์ฝ๋ |
405 | ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฆฌ์์ค์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ Method๋ฅผ ์ด์ฉํ์ ๋ ์๋ต ์ฝ๋ |
4.3 ๊ธฐํ
์ํ์ฝ๋ | ๋ด์ฉ |
---|---|
301 | ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฆฌ์์ค์ ๋ํ URI๊ฐ ๋ณ๊ฒฝ ๋์์ ๋ ์๋ต ์ฝ๋ |
500 | ์๋ฒ์ ๋ญ๊ฐ ๋ฌธ์ ๊ฐ ์์๋ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋ |
๊ทธ๋ฐ REST API๋ก ๊ด์ฐฎ์๊ฐ? - EungJun Yi๋
Reference
- http://meetup.toast.com/posts/92
- https://ko.wikipedia.org/wiki/REST
- http://blog.remotty.com/blog/2014/01/28/lets-study-rest/#prologue
- http://www.slideshare.net/SangBaekLee3/restful-api-67239776?qid=e125f342-ebf9-4472-8ade-1c5041cdc0b1&v=&b=&from_search=2
- https://spoqa.github.io/2012/02/27/rest-introduction.html
- https://ko.wikipedia.org/wiki/CRUD