์ด ๊ธ์ ๊ทธ๋ฐ REST API ๋ก ๊ด์ฐฎ์๊ฐ? ์ ์ด์์ค ๊ฐ๋ฐ์๋์ ๋ฐํ ์๋ฃ์ ์ฌ๋ฌ ๋ถ๋ถ์ ์ฐจ์ฉํ์์ต๋๋ค.
REST API๋ ๋ฌด์์ผ๊น
๋ ์ง๊ธ๊น์ง REST API์ ๋ํด์ ์๋น ๋ถ๋ถ์ ์คํดํ๊ณ ์์๋ค.
REST API๋ผ๊ณ ํจ์ GET, POST, PUT, PATCH, DELETE๋ฑ๊ณผ ๊ฐ์ HTTP ๋ฉ์๋๋ฅผ URI๋ฅผ ํตํด์ ์ ์ด์ฉํ๋ ๊ฒ, ์ด๋ฅผํ ๋ฉด ์ ๋ณด ์กฐํ๋ ์์ ์ /user ์ด๋ผ๋ ํ๋์ URI์ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ด์ฉ, ์ด๋ผ๊ณ ์๊ณ ์์๋ค.
ํ์ง๋ง ๊ทธ๊ฑด REST API์ ์์ฃผ ์์ ์ผ๋ถ๋ถ ์ค ํ๋์๋ค.
๋์ฑ ์ ๊ธฐํ๊ฑด ์ค๋ ฅ ์ข์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฐธ์ฌํ ๊ธ์ต ๊ฒฐ์ ์์ ์คํ ๋ฑ ํน API์์๋ REST API๋ฅผ ์ ๋๋ก ์ฌ์ฉํ์ง ์๊ณ ์๋ค.
์ฌ์ค REST API๋ผ๊ณ ํ๋ฉด ์๋์ง๋ง REST API๋ผ๊ณ ํ๋ฉฐ ์ฌ์ฉํ๊ณ ์๋ค.
ํด๋น API๋ ์ ๊ธ ์ด์ฒด๋ฅผ ์์ฒญํ๋ Open API ์ธ๋ฐ, ์๋ต ๋ฉ์์ง๋ฅผ ํ์ธํด๋ณด์.
์ด๊ฑด REST API๊ฐ ์๋๋ค.
์ REST API๊ฐ ์๋์ง๋ ์๋์์ ์ด์ผ๊ธฐ๋ฅผ ํ๊ฒ ์ง๋ง, REST API๋ฅผ ๋ง๋ ๋ก์ด ํ๋ฉ์ ์ด๋ฐ ๋ฐฉ์์ผ๋ก API๋ฅผ ์ฌ์ฉํ๋ฉฐ REST ๋ผ๊ณ ํ ๊ฒ์ด๋ผ๋ฉด REST API๋ผ๊ณ ํ์ง ๋ง๋๊ฐ HTTP API๋ผ๊ณ ๋ช ๋ช ํด์ค ๊ฒ์ ๋น๋ถํ์๋ค๊ณ ํ๋ค.
์ฌ๋ฌ๋ถ์ ์ด Response Message๊ฐ ์ REST API๊ฐ ์๋์ง ๊ธ์ ์ฝ๊ธฐ ์ ๊น์ง๋ ํ๋จํ ์ ์์๋ค.
(๋ด๊ฐ ๊ทธ๋ฐ REST API ๋ก ๊ด์ฐฎ์๊ฐ? ๋ฅผ ๋ณด์ง ์์์ ๋ ์ฒ๋ผ)
์ง์ ํ REST API๊ฐ ๋ฌด์์ธ์ง ๋ณผ ์ ์๋ ์๊ฒฌ์ ์ฌ๋ฌ๋ถ๋ค์๊ฒ ๋๋ํ ๋ ๊ธ์ ๋ค ์ฝ๊ณ ์ง์ ํ REST API๊ฐ ๋ฌด์์ธ์ง ํ์ธํ ์ ์๋ ๊ธฐํ๊ฐ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
REST API
์ ์๋ค ์ถ์ด API๋ Application Programming Interface ๋ ๋ป์ผ๋ก, ํ๋ก๊ทธ๋๋ฐ ๋ด๋ถ์ ๋ํด์ ๋ชฐ๋ผ๋ API ์ ์ ๋ง ์๊ณ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ํด๋น ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ฒ ๋๋ค.
์ด์ ๋น์ทํ๊ฒ REST API๋
REpresentational State Transfer
๋ผ๋ ๋ป์ผ๋ก, ์ธํฐ๋ท ์์ ์์คํ ๊ฐ ์ํธ ์ด์ฉ์ฑ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
์ด๋ฒ ๊ธ์์๋ REST API์ ๋ํ ๊ธฐ๋ณธ์ ์ด์ผ๊ธฐํ์ง ์์ผ๋ ค ํ๋ค. HeeJeongKwon ๋์ REST API ์์ ์์ธํ ํ์ธํ ์ ์๋ค. ์ฐธ๊ณ ํ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
์ธํฐ๋ท ์์ ์์คํ ์ด๋ผ๊ณ ํจ์
- client to client
- client to server
- server to server
๋ก ํด์ํ ์ ์๋ค.
์ด๋ฐ ์ํธ ์์คํ ์ด์ฉ์ฑ์ ์ ๊ณตํจ์ผ๋ก ์ฐ๋ฆฌ๋ ์์คํ ๊ฐ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์งํ๋ฅผ ๋ฌ์ฑํ๋ค.
์ด๋ฐ ๋ ๋ฆฝ์ ์ธ ์งํ๋ ์น ์ํ๊ณ์์ Client ๋ง ๊ฐ๋ฐํ๋ ํ๋ก ํธ ์๋๋ผ๋ ๋ถ์ผ๋ฅผ ์๋กญ๊ฒ ๋ง๋ค์๊ณ , ๋ํ ์๋ฒ๋ง ๋ด๋นํ๋ ๋ฐฑ์๋ ๋ผ๋ ๋ถ์ผ๋ก ๊ณ ๋ํ ๋์๋ค๊ณ ์๊ฐํ๋ค.
์ด๋ฐ REST API๊ฐ ๋๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด๋ค์ด ํ์ํ๋ค.
REST API์ ์ ์ฝ ์กฐ๊ฑด๋ค
์๋์ ๋์ค๋ ๊ฒ๋ค์ REST API์ ํ์ ์ ์ฝ ์กฐ๊ฑด์ด๋ค.
๋ง์ฝ ์ด๋ค ์ค ํ๋๋ผ๋ ์ง์ผ์ง์ง ์๋๋ค๋ฉด ์ด๋ REST API๋ผ๊ณ ํ ์ ์๋ค.
- Clinet-Server
- client๋ server ์์ ์ด๋ค ์ผ์ ์ํํ๋๋ผ๋ ๋ด๋ถ ์์ ์ ์์ง ์์๋ ๋๋ค.
- ์ด๋ ํ๋ซํผ์ ์ด์์ฑ์ ํฅ์์ํจ๋ค.
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ด๋ผ ๋ณ๋์ ์งํ๊ฐ ๊ฐ๋ฅํ๋ค.
- Stateless
- ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๊ฐ ์์ฒญ์๋ ๊ทธ ์์ฒญ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํ๋ค.
- Cache
- ์์ฒญ์ ๋ํ ์๋ต ๋ด์ ๋ฐ์ดํฐ์ ํด๋น ์์ฒญ์ ์บ์๊ฐ ๊ฐ๋ฅํ์ง ๋ถ๊ฐ๋ฅ ํ์ง ๋ช ์ํด์ผ ํ๋ค.
- ๋ณดํต HTTP Header์
cache-control
ํค๋๋ฅผ ์ด์ฉํ๋ค.
- Uniform Interface
- ์๋์์ ๋ ์์ธํ ์ค๋ช ์ ํ๊ฒ ๋ค.
- ๋ณดํต ๋ง์ REST API๋ผ๋ ๊ฒ๋ค์์ ์ง์ผ์ง์ง ์๋๋ค.
- ๋ฑ๋ฑ 2๊ฐ์ง๊ฐ ๋ ์์ผ๋ ์๋ตํ๋ค.
์ฌ๋ฌ ์ ์ฝ ์กฐ๊ฑด๋ค์ด ์๋๋ฐ, ์ฌ์ค HTTP API๋ง ์ฌ์ฉํ๋๋ผ๋ ๋ค๋ฅธ ์ ์ฝ ์กฐ๊ฑด๋ค์ ์ ์ง์ผ์ง๋ค๊ณ ํ ์ ์๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ ๋ฐ๋ก Uniform Interface์์ ๋ฐ์ํ๋ค.
Uniform Interface
Uniform Interface์ URL๋ก ์ง์ ๋ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ ํต์ผํ๊ณ ํ์ ๋ ์ธํฐํ์ด์ค๋ก ์ํํ๋ ์ํคํ ์ณ ์คํ์ผ์ด๋ค.
์ด๋ฐ Uniform Interface๊ฐ REST API๋ฅผ ๊ตฌ๋ถ ์ง๋ ๊ฐ์ฅ ํฐ ํต์ฌ์ด๋ผ๊ณ ์๊ฐํ๋ค.
Uniform Interface ์๋ 4๊ฐ์ง ์ ์ฝ์กฐ๊ฑด๋ค์ด ์กด์ฌํ๋๋ฐ ํ๋์ฉ ์์๋ณด์.
Uniform Interface์ 4๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด
- Resource-Based
- Manipluation Of Resources Through Representations
- Self-Descriptive Message
- Hypermedia As The Engine of Application State
๋๋ 1๋ฒ๊ณผ 2๋ฒ์๋ง ๊ด์ฌ์ ๊ฐ์ก์๋ค.
1๋ฒ๊ณผ 2๋ฒ์ ํฉ์ณ์ ํ ๋ฌธ์ฅ์ผ๋ก ํ์๋ฉด
URI๋ก ์ง์ ํ ๋ฆฌ์์ค๋ฅผ Http Method๋ฅผ ํตํด์ ํํํ๊ณ ๊ตฌ๋ถํ๋ค!
์ด๋ค.
์๋ URL์ ๋ด๋ณด์.
https://my-server.com/page?user=guest/menu=login
์ด ๊ฒ์ ์์ ์ HTML์ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด์๋ค.
page์ ํ๋ผ๋ฏธํฐ๋ก guest ์ธ์ง user์ธ์ง admin ์ธ์ง ๊ตฌ๋ถํ๊ณ menu ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด์ ์ด๋ค ๋ฉ๋ด์ธ์ง ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด๋ค.
ํ์ง๋ง REST API๋ฅผ ์ ์ฉํ๋ค๋ฉด
HTTP Method : get
https://my-server.com/user/login
๋ฅผ ํตํด์ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์๋ค.
์ด๋ ๊ฒ ๋๋ค๋ฉด ์งง์ URI๋ฅผ ํตํด์ ์ฌ๋ฌ ํํ์ ํํ์ด ๊ฐ๋ฅํด์ง๊ฒ ๋๋ค.
์๋์ URL์ login ์ด๋ผ๋ URI๋ก POST ์์ฒญ์ ๋ณด๋ธ๋ค๋ ๋ป์ด ๋๋๋ฐ, ์ด ๊ฒ์ ๋ฏธ๋ฃจ์ด ๋ณด์์ ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ POST ์์ฒญ์ด ๋๋ ๊ฒ์ด๋ ๋ก๊ทธ์ธ์ ํ ๊ฒ์ด๋ผ๊ณ ์ง์ ๊ฐ๋ฅํด์ง๋ ๊ฒ ์ฒ๋ผ ๋ง์ด๋ค.
HTTP Method : POST
https://my-server.com/user/login
์ง์ง ๋ฌธ์ ์ธ 3๋ฒ๊ณผ 4๋ฒ์ ์์๋ณด์.
์ด์ ์ ์ ์ผ ์์์ ๋์จ ๊ธ์ต๊ฒฐ์ ์์ ์คํ API๊ฐ REST API๊ฐ ์๋์ง ์ ์ฐจ๋ก์ด๋ค.
Self-Descriptive Message
๋ง ๊ทธ๋๋ก ๋ฉ์์ง ์ค์ค๋ก๊ฐ ์์ ์ ๋ํ ์ค๋ช ์ ํ ์ ์์ด์ผ ํ๋ค.
์ฆ, API ๋ฌธ์๊ฐ REST API ์๋ต ๋ณธ๋ฌธ์ ์กด์ฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก API ๋ฌธ์ ์ ์ฒด๋ฅผ ์๋ต์ ๋ฃ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ ํ๋ค.
์ ์ด๋ API ๋ฌธ์๊ฐ ์ด๋ ์๋์ง๋ ์๋ ค์ค์ผ ํ๋ค.
์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์๋์์ ์์๋ณด๋๋ก ํ์.
์ด๋ ๊ฒ ๋๋ฉด ๋ญ๊ฐ ์ข์๊น?
์ด๋ ๊ฒ ๋๋ค๋ฉด ์๋ฒ๊ฐ ๋ณํด์ Response Data๊ฐ ๋ณ๊ฒฝ๋์๋ค๊ณ ๊ฐ์ ํ์.
๊ทธ๋ผ ํด๋ผ์ด์ธํธ์์๋ ํด๋น API ๋ฌธ์๋ฅผ ํตํด์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์๋์ง ์ ์ ์๊ฒ ๋๋ค.
Hypermedia As The Engine of Application State
์ดํ ์ด๊ฒ์ HATEOAS ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
HATEOAS๊ฐ ๋ง ํ๊ณ ์ ํ๋ ๊ฒ์ ํ ์ค๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Hypermedia (๋งํฌ)๋ฅผ ํตํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ์ด๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค.
๋ํ Hypermedia (๋งํฌ)์ ์๊ธฐ ์์ ์ ๋ํดํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์ผ ํ๋ค.
์ํ ์ ์ด? ๋ฌด์จ ๋ง์ผ๊น?
์๋ฅผ ๋ค์ด์ ๊ฒ์ ๊ธ์ ์กฐํํ๋ URI๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
GET https://my-server.com/article
๊ทธ๋ผ ์ฌ๊ธฐ์ ํด๋น ๊ธ์ ์กฐํํ ์ฌ์ฉ์๋ ๋ค์ ํ๋์ผ๋ก ์ด๋ค ํ๋์ ํ ๊น?
- ๋ค์ ๊ฒ์๋ฌผ ์กฐํ
- ๊ฒ์๋ฌผ์ ๋ด ํผ๋์ ์ ์ฅ
- ๋๊ธ ๋ฌ๊ธฐ
์ด๋ฐ ํ๋๋ค์ด ๋ฐ๋ก ์ํ ์ ์ด๊ฐ ๊ฐ๋ฅํ ๊ฒ๋ค์ธ๋ฐ, ์ด ๊ฒ๋ค์ ์๋ต ๋ณธ๋ฌธ์ ๋ฃ์ด์ค์ผ ํ๋ค๋ ์๋ฆฌ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ป๊ฒ ๋ฃ์๊น?
๋ฐ๋ก Hypermedia (๋งํฌ)๋ฅผ ํตํด์ ๋ฃ๋๋ค.
๊ทธ๋ผ ๊ธฐ์กด์ ์๋ต ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๋ณ๊ฒฝ๋๋ค.
{
"data": {
"id": 1000,
"name": "๊ฒ์๊ธ 1",
"content": "HAL JSON์ ์ด์ฉํ ์์ JSON",
"self": "http://localhost:8080/api/article/1000", // ํ์ฌ api ์ฃผ์
"profile": "http://localhost:8080/docs#query-article", // ํด๋น api์ ๋ฌธ์
"next": "http://localhost:8080/api/article/1001", // ๋ค์ article์ ์กฐํํ๋ URI
"comment": "http://localhost:8080/api/article/comment", // article์ ๋๊ธ ๋ฌ๊ธฐ
"save": "http://localhost:8080/api/feed/article/1000", // article์ ๋ด ํผ๋๋ก ์ ์ฅ
},
}
์ด๊ฒ ๋ฐ๋ก Uniform Interface ์ ์ฝ ์กฐ๊ฑด์ ๋ง์กฑ ์ํค๋ REST API๋ผ๊ณ ํ ์ ์๋ค.
ํ์ง๋ง!!! ์์ง ์๋ฒฝํ์ง๋ ์๋ค. HAL JSON์ ์ด์ฉํ๊ธฐ ์ ๊น์ง
์ฐ์ ์ด๋ ๊ฒ ํ๋ฉด ๋ญ๊ฐ ์ข์์ง๋ฅผ ์๊ฐํด๋ณด์.
์ด๋ ๊ฒ ๋๋ฉด ๋ญ๊ฐ ์ข์๊น?
- API ๋ฒ์ ์ ๋ช ์ธํ์ง ์์๋ ๋๋ค.
- ๋งํฌ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
- ๋งํฌ๋ฅผ ํตํด์ ์ํ ์ ์ด๊ฐ ์ฝ๊ฒ ๊ฐ๋ฅํ๋ค.
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ธ๋ค๋ฉด ํด๋ผ์ด์ธํธ๋ ํด๋น ๋งํฌ๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ผ๋ก, JPA์์ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ ํ๋ ๊ฒ ์ฒ๋ผ API ๊ทธ๋ํ ํ์์ด ๊ฐ๋ฅํด์ง๋ค.
๊ทธ๋ผ ๋งํฌ์ ๋ํ ์ ๋ณด๊ฐ ๋ฐ๋๋๋ผ๋ ํด๋ผ์ด์ธํธ์์ ์ผ์ผ์ด ๋์ํ์ง ์์๋ ๋๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ์ด๊ฑธ ์๋ฒฝํ๊ฒ ํ ๊น?
๋ฐ๋ก HAL JSON์ ์ด์ฉํ๋ค.
HAL
Hypertext Application Language ์ผ๋ก JSON, XMl ์ฝ๋ ๋ด์ ์ธ๋ถ ๋ฆฌ์์ค์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ํน๋ณํ ๋ฐ์ดํฐ ํ์ ์ด๋ค.
HAL์ ๋ ๊ฐ์ ํ์ ์ ๊ฐ๋๋ค.
application/hal+json
application/hal+xml
์ด HAL ํ์ ์ ์ด์ฉํ๋ค๋ฉด ์ฝ๊ฒ HATEOAS๋ฅผ ๋ฌ์ฑํ ์ ์๋ค.
HAL ํ์ ์์๋ ๋ ๊ฐ์ง์ ํน์ง๋ง ์ด์ฉํ๋ฉด ๋๋ค.
๋ฆฌ์์ค์ ๋งํฌ
- ๋ฆฌ์์ค : ์ผ๋ฐ์ ์ธ data ํ๋์ ํด๋นํ๋ค.
- ๋งํฌ : ํ์ดํผ๋ฏธ๋์ด๋ก ๋ณดํต
_self
ํ๋๊ฐ ๋งํฌ ํ๋๊ฐ ๋๋ค.
๊ทธ๋ฅ JSON ์๋ต ๋ณธ๋ฌธ์ ํ ๋ฒ ๋ณด๋๊ฒ ๋น ๋ฅผ ๊ฒ ๊ฐ๋ค.
{
"data": { // HAL JSON์ ๋ฆฌ์์ค ํ๋
"id": 1000,
"name": "๊ฒ์๊ธ 1",
"content": "HAL JSON์ ์ด์ฉํ ์์ JSON"
},
"_links": { // HAL JSON์ ๋งํฌ ํ๋
"self": {
"href": "http://localhost:8080/api/article/1000" // ํ์ฌ api ์ฃผ์
},
"profile": {
"href": "http://localhost:8080/docs#query-article" // ํด๋น api์ ๋ฌธ์
},
"next": {
"href": "http://localhost:8080/api/article/1001" // article ์ ๋ค์ api ์ฃผ์
},
"prev": {
"href": "http://localhost:8080/api/article/999" // article์ ์ด์ api ์ฃผ์
}
}
}
๊ทธ๋ผ ์ด์ ์ง์ ํ REST API๋ฅผ ๋ง์กฑ์์ผฐ๋ค๊ณ ํ ์ ์๋ค.
๋ค์ ์์ผ๋ก ๋์๊ฐ์ ์ ๊ธ์ต๊ฒฐ์ ์์ API๋ REST API๊ฐ ์๋๊น?
์ค์ค๋ก ๋ตํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
'๐ป Computer Science > - Network' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Network] OSI 7 Layers์ TCP / IP ๊ตฌ์กฐ ๋น๊ต (0) | 2021.04.24 |
---|---|
[Network] IP Address, IPv4 ์ IPv6 ๊ทธ๋ฆฌ๊ณ DNS (0) | 2021.04.23 |
[HTTP-Header] HTTP Response Header :: ์๋ต ํค๋ (0) | 2020.10.09 |
[HTTP-Header] HTTP Request Header :: ์์ฒญ ํค๋ (0) | 2020.10.09 |
[HTTP-Header] HTTP General Header & Entity Header:: ๊ณตํต ํค๋์ ์ํฐํฐ ํค๋ (0) | 2020.10.09 |
๋๊ธ