ํด๋น ๊ธ์ CS ์คํฐ๋์์ ๊ณต๋ถํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
์ด๋ฒ์ CS์คํฐ๋์์ REST ์ฃผ์ ๋ฅผ ๋ฐํํ๊ธฐ๋ก ๊ฒฐ์ ๋์๋ค.
๋ฌด์์ด ์ง์ง REST์ธ๊ฐ์ ๋ํด์๋ ๋ง์ ๋ ผ์์ด ์๊ณ , ์ฐ๋ฆฌ๊ฐ ํํ ์๊ธฐํ๋ REST์ ์กฐ๊ฑด์ธ CRUD, URL(URI) ๊ฐ์ด๋๋ผ์ธ์ ๋ํด์๋ ๋ง์ด ๋ง๋ค.
๋ณด๋ค ๊ตฌ์ฒด์ ์ผ๋ก ์๊ณ ์ถ์ด ๋ฌด์์ด REST์ธ์ง, ์ง์ง REST๋ฅผ ์งํค๊ธฐ ์ํด ์ด๋ค ๊ณผ์ ์ด ํ์ํ์ง ์ฐพ์๋ดค๋ค.
REST๋ Representational State Transfer(REST)์ ์ฝ์๋ก, API ์๋ ๋ฐฉ์์ ๋ํ ์กฐ๊ฑด์ ๋ถ๊ณผํ๋ ์ํํธ์จ์ด ์ํคํ ์ฒ์ด๋ค.
๋ก์ด ํ๋ฉ์ด ์ฐฝ์ํ๋ค. ์ธํฐ๋ท๊ณผ ๊ฐ์ ๋ณต์กํ ๋คํธ์ํฌ์์ ํต์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ง์นจ์ผ๋ก ๋ง๋ค์ด์ก๋ค.
API ๊ฐ๋ฐ์๋ ์ฌ๋ฌ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ์ค๊ณํ ์ ์๋ค.
REST ์ํคํ ์ฒ ์คํ์ผ์ ๋ฐ๋ฅด๋ API๋ฅผ REST API๋ผ๊ณ ํ๋ค.
REST ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ ์น ์๋น์ค๋ฅผ RESTful ์น ์๋น์ค๋ผ๊ณ ํ๋ค.
Client์ Server๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํํ์ด๋ค.
JSON, XML, TEXT, RSS ๋ฑ์ด ์๋ค.
์์ ๋๋ค์ API๋ 4๋ฒ ๋นผ๊ณ ์ ์ง์ผ์ง๋ค.
์์์ด ์๋ ์ชฝ์ด Server, ์์์ ์์ฒญํ๋ ์ชฝ์ด Client์ด๋ค. ๋์ ๋ ๋ฆฝ์ ์ด๋ค.
์๋ฒ๋ ์ด์ ์ ๋ชจ๋ ์์ฒญ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์๋ฃํ๋ค.
ํด๋ผ์ด์ธํธ๋ ์์์ ์์๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ์์ฒญ์ ๋ฌด์ํ์ด๊ฑฐ๋ ๋ค๋ฅธ ์์ฒญ๊ณผ ๋ถ๋ฆฌ๋๋ค.
RESTful ์น ์๋น์ค๋ ์๋ฒ ์๋ต ์๊ฐ์ ๊ฐ์ ํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ๋๋ ์ค๊ฐ์์ ์ผ๋ถ ์๋ต์ ์ ์ฅํ๋ ํ๋ก์ธ์ค์ธ ์บ์ฑ์ ์ง์ํ๋ค.
URI๋ก ์ง์ ํ Resource์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ค.
HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข
์๋์ง ์๋๋ค.
๊ณ์ธตํ๋ ์์คํ ์ํคํ ์ฒ์์ ํด๋ผ์ด์ธํธ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ๋ค๋ฅธ ์น์ธ๋ ์ค๊ฐ์(๋ณด์, ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง ๋ฑ)์๊ฒ ์ฐ๊ฒฐํ ์ ์๋ค.
REST ์ํคํ ์ฒ ์คํ์ผ์์ ์๋ฒ๋ ์ํํธ์จ์ด ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์กํ์ฌ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ ์ผ์์ ์ผ๋ก ํ์ฅํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ํ ์ ์๋ค. โ ์๋ฐ์คํฌ๋ฆฝํธ
๋ฆฌ์์ค๋ uri๋ฅผ ํตํด ์๋ณ๋๋ค.
representation(ํํ) ์ ์ก์ ํตํด ๋ฆฌ์์ค๋ฅผ ์กฐ์ํด์ผ ํ๋ค.
์ฆ ๋ฆฌ์์ค CRUD ์ ๋ฉ์ธ์ง์ ํํ์ ๋ด์์ผ ํ๋ค.
๋ฉ์ธ์ง๋ ์ค์ค๋ก๋ฅผ ์ค๋ช ํด์ผ ํ๋ค.
Host
๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ค.Content-Type
์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.application/json
๊น์ง๋ง ์ ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์)HTML์ ๊ฒฝ์ฐ self-descriptive ๋ฅผ ๋ง์กฑํ์ง๋ง, JSON์ ๋ง์กฑํ์ง ์๋๋ค.
HATEOAS : hypermedia as the engine of application state ์ ์ค์๋ง
์ดํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ Hyperlink๋ฅผ ์ด์ฉํด ์ ์ด๋์ด์ผ ํ๋ค. ๋งํฌ๋ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
HTML์ ๊ฒฝ์ฐ HATEOAS๋ฅผ ๋ง์กฑํ์ง๋ง, JSON์ ๋ง์กฑํ์ง ์๋๋ค!
REST API๋ฅผ ๊ตฌํํ๋ ์์คํ ์
์ด๋ฌํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฑ๋ฅ์ ์ ํ์ํค๋ ํต์ ๋ณ๋ชฉ ํ์์ ์ผ์ผํค์ง ์์ผ๋ฉด์ ํ์ฅ์ฑ์ ์ง์ํฉ๋๋ค.
RESTful ์น ์๋น์ค๋
REST API๋ ์ฌ์ฉ๋๋ ๊ธฐ์ ๊ณผ ๋ ๋ฆฝ์ ์ ๋๋ค.
API ์ค๊ณ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์์ฑํ ์ ์๋ค.
๋ํ ํต์ ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์์ชฝ(์๋ฒ, ํด๋ผ์ด์ธํธ)์ ๊ธฐ๋ณธ ๊ธฐ์ ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ฆ, ์๋ฒ์ ๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋์ด๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ค. ์ด๊ฒ์ด ๋ก์ดํ๋ฉ์ด REST๋ฅผ ๋ง๋ค๊ฒ ๋ ๊ณ๊ธฐ์ด๋ค.
์์คํ ์ ์ฒด๋ฅผ ํต์ ํ ์ ์๋ค๊ณ ์๊ฐํ๊ฑฐ๋, ์งํ์ ๊ด์ฌ์ด ์๋ค๋ฉด, REST์ ๋ํด ๋ฐ์ง๋๋ผ ์๊ฐ์ ๋ญ๋นํ์ง ๋ง๋ผ - ๋ก์ด ํ๋ฉ
์ด ๊ฒฝ์ฐ ๋ฐ๋ฅด์ง ์์๋ ๋๋ค.
๋ง์ฝ ์ค๋ ์๊ฐ๋์ ์งํํ๋(๋ณ๊ฒฝ ์์ด ๊ฐ ์ ์๋) ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, RESTful API
๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ ์ข๋ค.
Media type ์ ์
GET /todos HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Content-Type: application/vnd.todos+json
[
{"id": 1, "title": "ํ์ฌ ๊ฐ๊ธฐ"},
{"id": 2, "title": "์ง์ ๊ฐ๊ธฐ"}
]
๋จ์ : ๋งค๋ฒ media type ์ ์
Profile ์ด์ฉ
GET /todos HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://exmaple.org/docs/todos>; rel="profile"
[
{"id": 1, "title": "ํ์ฌ ๊ฐ๊ธฐ"},
{"id": 2, "title": "์ง์ ๊ฐ๊ธฐ"}
]
๋จ์
data์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ํ์ดํผ๋งํฌ ํํ
GET /todos HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://exmaple.org/docs/todos>; rel="profile"
[
{
"link": "https://exmplae.org/todos/1,
"title": "ํ์ฌ ๊ฐ๊ธฐ"
},
{
"link": "https://exmplae.org/todos/2,
"title": "ํ์ฌ ๊ฐ๊ธฐ"
},
]
GET /todos HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://exmaple.org/docs/todos>; rel="profile"
{
"links" : {
"todo" : "https://example.org/todos/{id}"
},
"data": [{
"id": 1,
"title": "ํ์ฌ ๊ฐ๊ธฐ"
}, {
"id": 2,
"title": "์ง์ ๊ฐ๊ธฐ"
}]
}
๋จ์ : ๋งํฌ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ์ง์ ์ ์
JSON์ผ๋ก ํ์ดํผ๋งํฌ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ ๋ช ์ธ๋ค์ ํ์ฉ
GET /todos HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json
Link: <https://exmaple.org/docs/todos>; rel="profile"
{
"data": [{
"type": "todo",
"id": 1,
"attributes": {"title": "ํ์ฌ ๊ฐ๊ธฐ"},
"links" : { "self": "https://example.org/todos/1"
},{
"type": "todo",
"id": 2,
"attributes": {"title": "์ง์ ๊ฐ๊ธฐ"},
"links" : { "self": "https://example.org/todos/2"
}]
}
๋จ์ : ๊ธฐ์กด API๋ฅผ ๋ง์ด ๊ณ ์ณ์ผํ๋ค. (์นจํฌ์ )
HTTP ํค๋๋ก โ Link, Location ๋ฑ
POST /todos HTTP/1.1
Content-Type: application/json
{
"title": "์ ์ฌ ์ฝ์"
}
HTTP/1.1 204 No Content
Location: /todos/1
Link: </todos/>, rel="collection"
data, ํค๋ ๋ชจ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
์ฌ๊ธฐ์๋ถํด ๋ก์ด ํ๋ฉ์ RESTful API๊ฐ ์๋,
์ด๋ฅผ ํด์ํ ์ฌ๋๋ค(์ ํํ๋, ๋ง์ดํฌ๋ก์ํํธ docs)์RESTful API
์ด๋ค!
RESTful API์๋ ๋ค์ ๋ ๊ตฌ์ฑ์์๋ฅผ ํฌํจํ๋ ์์ฒญ์ด ํ์ํ๋ค.
REST ์๋น์ค์ ๊ฒฝ์ฐ ์๋ฒ๋ ์ผ๋ฐ์ ์ผ๋ก URL์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์๋ณ์ ์ํํ๋ค. URL์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
HTTP ๋ฉ์๋๋ ๋ฆฌ์์ค์ ์ํํด์ผ ํ๋ ์์ ์ ์๋ฒ์ ์๋ ค์ค๋ค.
GET(Read)
์๋ฒ์ ์ง์ ๋ URL์ ์๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ค.
์ด๋ API ์์ฒญ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ์ด ์ ์กํ์ฌ ์ ์ก ์ ์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ ์ ์๋ค.
POST(Create)
์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
์ฌ๊ธฐ์๋ ์์ฒญ๊ณผ ํจ๊ป ๋ฐ์ดํฐ ํํ์ด ํฌํจ๋๋ค.
PUT(Update)
์๋ฒ์ ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ ์ฒด ์ ๋ฐ์ดํธํ๋ค.
PATCH(Update)
์๋ฒ์ ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ผ๋ถ ์ ๋ฐ์ดํธํ๋ค.
DELETE(Delete)
๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ๋ค.
์์ฒญ ํค๋๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๊ตํ๋๋ ๋ฉํ๋ฐ์ดํฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ฒญ ํค๋๋ ์์ฒญ ๋ฐ ์๋ต์ ํ์์ ๋ํ๋ด๊ณ ์์ฒญ ์ํ ๋ฑ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ์ดํฐ
REST API ์์ฒญ์๋ POST, PUT ๋ฐ ๊ธฐํ HTTP ๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ํ๊ธฐ ์ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
ํ๋ผ๋ฏธํฐ
RESTful API ์์ฒญ์๋ ์ํํด์ผ ํ ์์ ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ๊ณตํ๋ ํ๋ผ๋ฏธํฐ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ํ๋ผ๋ฏธํฐ ์ ํ์ ๋๋ค.
๐BAD
http://api.test.com/users/1/
๐GOOD
http://api.test.com/users/1
๐BAD
http://api.test.com/users/post_commnets
๐GOOD
http://api.test.com/users/post-commnets
๐BAD
http://api.test.com/users/postCommnets
๐GOOD
http://api.test.com/users/post-commnets
๐BAD
POST http://api.test.com/users/1/delete-post/1
๐GOOD
DELETE http://api.test.com/users/1/posts/1
๐BAD
http://api.test.com/posts/duplicating
๐GOOD
http://api.test.com/posts/duplicate
๐BAD
http://api.test.com/posts/1/photo.jpg
๐GOOD
http://api.test.com/posts/1/photo
Day1, 2-2. ๊ทธ๋ฐ REST API๋ก ๊ด์ฐฎ์๊ฐ
RESTful API๋ ๋ฌด์์ธ๊ฐ? - RESTful API ์ด๋ณด์ ๊ฐ์ด๋ - AWS
[10๋ถ ํ ์ฝํก] ์ ์ REST API
[Network] REST๋? REST API๋? RESTful์ด๋? - Heee's Development Blog
์น API ๋์์ธ ๋ชจ๋ฒ ์ฌ๋ก - Azure Architecture Center
api-guidelines/Guidelines.md at master ยท microsoft/api-guidelines