์์ฆ API ๋ฅผ ๋ณด๋ฉด ํํ REST
ํ๊ฒ API ๋ฅผ ์์ฑํ๋ค๊ณ ๋ค ํฉ๋๋ค. ์ค์ ๋ณด๋ฉด ๋๋ถ๋ถ url ์ ๋ช
์ฌ๋ก ์ฐ๊ณ , HTTP Method ๋ฅผ ์ ๋ฐฐ๋ถํ๋ค๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. ์ค์ ๋ก ์ด๋ ๊ฒ ์ค๋ช
ํ๋ ๊ณณ๋ ๋ง๊ณ , ์ ๋ํ ๋ญ ๋์์ธ๊ฐ
์ถ์ ๋๋์ผ๋ก ์ ์ ๋๋ง ์๊ณ ์์์ต๋๋ค. ์ต๊ทผ ์ฑ
์ ๋ณด๋ค๊ฐ REST ์ ๋ํ ๋ด์ฉ์ด ๋์ ์ด๋ฅผ ํ ๋๋ก ์๊ณ ์๋ ๋ถ๋ถ์ ๋ํด์๋ ๊ฒฌ๊ณ ํ๊ฒ, ๋ชฐ๋๋ ๋ถ๋ถ์ ํ๋ฌ์ค(+) ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
1. REST ๋?
REST (REpresentational State Transfer - ํํ์ ์ธ ์ํ ์ ์ก) ๋ ์ฝ๊ฒ ๋งํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค(๋ฐ์ดํฐ) ๋ฅผ ํํํ๋ URI ์์์ ๋๋ค.
REST ๋ผ๋ ๋จ์ด ์์ฒด๋ 2000๋ ๋ก์ด ํ๋ฉ(Roy Fielding) ์ ๋ ผ๋ฌธ์์ ์ฒ์ ๋์จ ๋จ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ก์ด ํ๋ฉ์ REST๋ฅผ ์ํธ ์ง์ฐ์ ์ค์ด๊ณ ๋ณด์์ ๊ฐํํ์ฌ ๋ ๊ฑฐ์ ์์คํ ์ ์บก์ํํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ์ํธ์์ฉ, ์ธํฐํ์ด์ค์ ์ผ๋ฐ์ฑ, ์ปดํฌ๋ํธ ๋ ๋ฆฝ ๋ฐฐํฌ, ์ค๊ฐ ์ปดํฌ๋ํธ์ ํ์ฅ์ฑ์ ๊ฐ์กฐํ๋ค๊ณ ํ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ด ์๊ณ ์๋ ๊ฒ์ผ๋ก, ๋ช
์ฌ + HTTP ๋ฉ์๋
ํํ๋ก ๋ํ๋ด๋ ๊ฒ์
๋๋ค. ๊ฐ๋ น ๊ณ์ ์ ๋ณด๋ค์ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด, /accounts ์ HTTP GET ๋ฉ์๋๋ฅผ ์ฐ๋ ๊ฒ์ด์ฃ . ๊ฒฐ๊ตญ URI ๋ ์๊ฒฉ ์๋ฒ์ ์๋ ๋ฆฌ์์ค์ ์ด ๋ฆฌ์์ค์ ์ด๋ค ์ผ์ ์์ฒญํ ๊ฒ์ธ์ง๋ฅผ ๋ช
์ํ๋ ๊ฒ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์ด๋ฌ๋ฉด HTTP ๋ฉ์๋๋ฅผ ์์ฑ, ์กฐํ, ์์ , ์ญ์ (CRUD) ์์ ๊ณผ ์ฐ๊ด์ง์ด ์๊ฐํ๊ธฐ ์ฌ์ด๋ฐ (GET - ์กฐํ, POST - ์์ฑ) ์ด๋ REST ์ทจ์ง์ ๋ง์ง ์์ ๋ฟ๋๋ฌ, ๋ฆฌ์์ค ํํํ์ ์ดํดํ๋๋ฐ์๋ ๋์์ด ๋์ง ์์ต๋๋ค. ์คํ๋ ค ์ด๋ฐ ๋ฐ์์ ๋ฆฌ์ฒ๋์จ ์ฑ์๋ ๋ชจ๋ธ์ ๋ ๋ฒจ 0 (์๊ฒฉ ํ๋ก์์ ํธ์ถ - Remote Procedure Call, RPC) ๊ณผ ๊ฐ๊น์ต๋๋ค.
REST ํ API ๋ ๋์์ด ์๋ ๋ช ์ฌ๋ฅผ ๋์์ผ๋ก ํ๋ฉฐ, ๋ช ์ฌ๋ ๋ฆฌ์์ค๋ฅผ ๋ํ๋ ๋๋ค.
๋ฆฌ์์ค๋ URI๋ก ์๋ณํ๋ฉฐ, ๋ฆฌ์์ค๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋๋ถํฐ ์์ํ๋๋ผ๋ ๊ฐ์ ๋ฆฌ์์ค์ ์ ๊ทผํด์ผ ํฉ๋๋ค. ๊ฐ๋ น ์ฌ์ฉ์ ๋ฆฌ์์ค์ ๊ฒฝ์ฐ GET /users/:id ๋ฅผ ํตํด ํน์ ์ฌ์ฉ์์ ๋ฆฌ์์ค๋ฅผ ์ป๊ฑฐ๋, ์ด ์ฌ์ฉ์๋ฅผ ํ๋ก์ฐ ํ๋ ๋ค๋ฅธ ์ฌ์ฉ์ ๋ชฉ๋ก์ GET /users/:id/followers/:id ํ์ฌ ์กฐํํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค ํํํ์ ๋ฆฌ์์ค ๊ทธ ์์ฒด๊ฐ ์๋ ๋ฆฌ์์ค๋ฅผ ํํํ๋ ์๋จ์ด๋ฏ๋ก ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ํํ๋ก ๋ํ๋ด๋ ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ-์๋ฒ๋ ๋ฆฌ์์ค ํํํ์ ๋์์์ด ์๋ก ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ๊ทธ ๊ณผ์ ์์ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ ๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค์ด ๋ณด๋ ๋๋ค.
๋ฆฌ์์ค ํํํ์ ์ฃผ๋ก JSON, XML ์ ํฌ๋ฉง์ ์ฌ์ฉํ์ง๋ง, ์ด๋ค ํ์์ด๋ ์์ ํํ๋ ๊ฐ๋ฅํฉ๋๋ค.
2. REST ์ 6๋ ์ ์ฝ
๋ก์ด ํ๋ฉ์ ์ํคํ ์ณ์ ์ธ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด REST ์์ 6๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด์ ๋งํ๋๋ฐ์. ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ์ ์งํจ๋ค๋ฉด RESTful ํ ์์คํ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
1. ํด๋ผ์ด์ธํธ - ์๋ฒ
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ ๊ตฌ๋ถํ๋ ๊ฒ์ ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ์ ์กํ๊ณ , ์๋ฒ๋ ์๋ต์ ํฉ๋๋ค.
2. ์ผ๊ด๋ ์ธํฐํ์ด์ค
- ๋ฆฌ์์ค๋ฅผ ์ด๋ค ๋ช ์ฌ๋ก ๊ด๋ฆฌํ๋์ง ๋ฑ, ์ธํฐํ์ด์ค๋ฅผ ์ผ๊ดํ๊ฒ ๊ฐ์ ธ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ ๋๋ค.
- HTTP ํ๋กํ ์ฝ์ ์จ์ ๊ตฌํํ๋ผ๋ ๊ท์ ์ ์์ง๋ง, ์ฌ์ค์ HTTP ๊ฐ ๋๋ถ๋ถ์ด๋ฉฐ, HTTP ๋ช
์ธ์ ๋ฐ๋ฅด๋ฉด,
URI = ๋ฆฌ์์ค ๋ช ์ฌ + HTTP ๋์ฌ
์ ๋๋ค.
3. ๋ฌด์ํ
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ์์ฒญ์๋ ๊ทธ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ, ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ด์ผ ํฉ๋๋ค. (์๋ฒ์์๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ํ์๊ฐ ์์) ๋ง์ฝ, ์ํ๊ฐ ํ์ํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค.
- ํ์ฅ์ฑ, ๊ฐ์์ฑ, ์ ๋ขฐ์ฑ์ ํ๋ณดํ ์ ์์ง๋ง, ์์ฒญ์ด ์ปค์ง๋ ๋จ์ ์ด ์์ ์ ์์ต๋๋ค.
4. ์บ์ ๊ธฐ๋ฅ
- ์๋ฒ์ ์๋ต์ ์บ์์ ๋ณด๊ดํด์ผ ํฉ๋๋ค.
- ์์ฒญ ๋ณ๋ก ์บ์ ๊ฐ๋ฅ/๋ถ๊ฐ๋ฅผ ๋ช ์ํด์ผ ํ๋ฉฐ, ์บ์ํ ์ ์๋ค๋ฉด, ๋์ผ ์์ฒญ์ด ์์ ๊ฒฝ์ฐ ์๋ต๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์์ด์ผ ํฉ๋๋ค.
5. ๊ณ์ธตํ ์์คํ
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์ง์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ-์๋ฒ ์ฌ์ด์ ๊ฐ๊ฐ์ง ์ํํธ์จ์ด/ํ๋์จ์ด๊ฐ ์ฌ ์ ์์ผ๋ฏ๋ก ๊ณ์ธต์ ํตํด ์ ๊ทผ์ ๋ชปํ๊ฒ ํด์ผ ํ์ฅ์ฑ์ด ์ข์์ง๋๋ค.
6. ์ฝ๋ ์จ ๋๋งจ๋ (Optional)
- ๊ณ์ธต์ ๊ตฌ์กฐ๋ก ์์ ๊ณผ ์ธ์ ํ ๋ ์ด์ดํ๊ณ ๋ง ์ํตํด์ผ ์ปดํฌ๋ํธ๋ค์ ์ญ์ /๋์ฒด ํ๊ธฐ๊ฐ ์์ํด์ ธ ํ์ฅ์ฑ์ด ๋์์ง๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ์ ์ ์ธ ๋ฐ์ดํฐ(json, xml)๋ฅผ ๋ฐ์์ ๊ฐ๊ณตํ๋ ๊ฒ์ด ์๋, ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋๊ฒจ๋ฐ์ ํด๋ผ์ด์ธํธ์์ ์คํํ๋ ๊ฒ์ ๋๋ค.
์์ 6๊ฐ์ง ์ค 6. ์ฝ๋ ์จ ๋๋ฉ๋๋ ์ ํ ์ฌํญ์ ๋๋ค.
3. REST API ์ ๋ฆฌ์ฒ๋์จ ์ฑ์๋
์์์ REST ๋ฅผ ์ค๋ช ํ๋ฉด์ ๋ฆฌ์ฒ๋์จ ์ฑ์๋์ ๋ํด์ ์ ๊น ์ธ๊ธ ํ์๋๋ฐ์.
๋ฆฌ์ฒ๋์จ ์ฑ์๋๋ ๋ ์ค๋๋ฅด๋ ๋ฆฌ์ฒ๋์จ(Leonard Richardson) ์ด ๊ฐ๋ฐํ ๊ฒ์ผ๋ก REST ์ ์ฝ์ ๋ถํฉํ๋ ์ ๋๋ฅผ API ๋ฑ๊ธ์ผ๋ก ๋ฉ๊ธด ๊ฒ์ ๋๋ค.
0๋ ๋ฒจ๋ถํฐ 3๋ ๋ฒจ๊น์ง ์์ผ๋ฉฐ, ๋ ๋ฒจ์ด ๋์ ์๋ก REST ๋ฅผ ์ ์ค์ํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
1. ๋ ๋ฒจ 0 : POX (Plain Old XML) ๋ฒ๋ฒ
- HTTP ๋ฅผ ์๊ฒฉ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ ์ก ํ๋กํ ์ฝ๋ก ์ฌ์ฉํ ๋ฟ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๋ํ๋ด๋ ์ฉ๋๋ก ์ฌ์ฉํ์ง ์์ต๋๋ค.
- HTTP ๋ฉ์๋ ํ ๊ฐ๋ก /getUser ๊ฐ์ ๋จ์ผ URI ์ ์์ฒญ/์๋ต์ ์ค์ด ๋๋ฆ ๋๋ค.
- REST ๋ณด๋ค๋ RPC ๋ชจ๋ธ์ ์ ํ์ ์ธ ์๋ผ๊ณ ํ ์ ์์ต๋๋ค.
2. ๋ ๋ฒจ 1 : ๋ฆฌ์์ค
- ์๋ก ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ๋ถ๊ฐํ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ธฐ ์์ํ ๋จ๊ณ
- POST user/1234/posts ๊ฐ์ด ๋ฆฌ์์ค ๊ธฐ๋ฐ์ผ๋ก ํต์ ์ ํ์ง๋ง, HTTP ๋ฉ์๋๋ ํ๋๋ง ์๋๋ค.
3. ๋ ๋ฒจ 2 : HTTP ๋์ฌ
- HTTP ๋์ฌ๋ฅผ ๋ฆฌ์์ค ๋ช ์ฌ์ ๊ณ ๋ฃจ ๊ฒฐํฉํด์ ์ฌ์ฉํ๋ ๋จ๊ณ
- HTTP ์ฌ์ฉ๋ฒ์ ์ต๋ํ ๊ฐ๊น์ HTTP ๋ฉ์๋ (GET, POST, PUT, DELETE ๋ฑ) ๋ฅผ ์ฌ์ฉํ๋ค.
4. ๋ ๋ฒจ 3 : ํ์ดํผ๋ฏธ๋์ด ์ ์ด
- HATEOAS(Hypertext As The Engine Of Application State) ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋จ๊ณ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ค์์ ํ ์ ์๋ ์ผ์ด ๋ฌด์์ธ์ง ์๋ ค์ฃผ๊ณ , ๊ทธ ์ผ์ ํ๋ ๋ฐ ํ์ํ URI ๋ฅผ ๊ฑด๋ค์ฃผ๋ ๋จ๊ณ์ ๋๋ค.
4. ์ ๋ฆฌ
REST ์ ๋ํด์ ๋ง์ฐํ ์๊ณ ์๋ ๊ฑธ ์ข ํ์ด๋ดค์ต๋๋ค.
์๊ฐ๊ณผ๋ ๋ค๋ฅด๊ฒ, ๋ด์ฉ๋ ๋ง๊ณ ํด์ ์ดํดํ๋๋ฐ ์ค๋ ๊ฑธ๋ ธ๋ค์.
REST ๋ฅผ ์ฌ์ฉํจ์ ์์ด ์ ์ฝ์ด ์๋์ง๋ ๋ชฐ๋๊ณ , ์ด๋ฒ์ ์ ๋ฆฌํ๋ฉด์ ํ์ REST ๋ผ๊ณ ๋ง๋ ๊ฒ๋ค์ด ์ด๋ค ์ ์ฝ์ ์งํค๊ณ ์๋๊ฐ ์๊ฐํด๋ณด๋ ์๊ฐ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. (๋๋ต 6๊ฐ ์ค์ 3,4๊ฐ๋ ์๊ฒ๋ชจ๋ฅด๊ฒ ์งํค๋ ๊ฒ ๊ฐ๋ค์.)