REST
REpresentational State Transfer
์น ์๋น์ค ๊ตฌ์ถ ๋ฐ ๊ด๋ฆฌ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋์์ธ ์คํ์ผ๋ก, ์ฃผ์ ๋ชฉํ๋ ์๋ก ๋ค๋ฅธ ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ํ์ฑํํ์ฌ ํตํฉ ๋ฐ ์์
์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค.
REST API์ ์๋ ๋ฐฉ์
REST API๋ HTTP ํ๋กํ ์ฝ์ ํ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ค.
๊ฐ HTTP ์์ฒญ์ ๋ฉ์๋, URI(Uniform Resource Identifier), ํค๋ ๋ฐ ๋ฉ์์ง ๋ณธ๋ฌธ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์๋ฒ๋ ๋ฉ์๋์ URI๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ํ ์ฝ๋, ํค๋ ๋ฐ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ํฌํจ๋ HTTP ์๋ต์ ๋ฐํํ๋ค.
REST๋ GET, POST, PUT, DELETE ๋ฉ์๋๋ก ๊ฐ๊ฐ CRUD๋ฅผ ์ฒ๋ฆฌํ๋ค.
REST ๊ธฐ๋ณธ ์์น
1.
ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ: ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ฑ
์์ ๋ถ๋ฆฌํ์ฌ ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์คํ๊ณ , ์๋ฒ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ์ ๊ด๋ฆฌํ๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ ๋ชจ๋ํํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค.
2.
๋ฌด์ํ์ฑ (Stateless): ๊ฐ ์์ฒญ์ ์์ฒด์ ์ผ๋ก ์์ ํด์ผ ํ๋ฉฐ, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ๋ชจ๋ ์ ๋ณด๋ ์์ฒญ์ ํฌํจ๋์ด์ผ ํ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ๊ฐ ์์ฒญ์์ ํ์ํ ์ํ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค. ์ด๋ฅผ ํตํด ์๋ฒ ํ์ฅ์ฑ์ด ํฅ์๋๋ค.
3.
์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ์ฑ: ์๋ต ๋ฐ์ดํฐ๋ ์บ์๋ ์ ์์ด์ผ ํ๋ค. ํด๋ผ์ด์ธํธ๋ ์บ์ ๊ฐ๋ฅํ ์๋ต์ ์ ์ฅํ๊ณ , ๊ฐ์ ์์ฒญ์ ๋ํด ์๋ฒ์ ๋ค์ ์์ฒญํ์ง ์๋๋ก ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ํจ์จ์ฑ๊ณผ ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ค.
4.
๊ณ์ธตํ ์์คํ
(Layered System): ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ค๊ฐ์(์: ํ๋ก์, ๊ฒ์ดํธ์จ์ด)๋ฅผ ๋์ด ์์คํ
์ ๋ณด์์ฑ ๋ฐ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์๋ค. ํด๋ผ์ด์ธํธ๋ ์ค๊ฐ ๋ ์ด์ด์ ์กด์ฌ๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ค.
5.
์ธํฐํ์ด์ค ์ผ๊ด์ฑ (Uniform Interface): REST๋ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ํธ ์์ฉํ ์ ์๋ค.
์ผ๊ด๋ ์ธํฐํ์ด์ค์ ์ฃผ์ ๊ตฌ์ฑ ์์:
โข
๋ฆฌ์์ค ์๋ณ: ๋ชจ๋ ๋ฆฌ์์ค๋ ๊ณ ์ ํ URI๋ฅผ ํตํด ์๋ณ๋๋ค.
โข
๋ฆฌ์์ค ํํ: ๋ฆฌ์์ค๋ XML, JSON ๋ฑ์ ํ์์ผ๋ก ํํ๋๋ค.
โข
ํํ์ ํตํ ์ํ ์ ๋ฌ: ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ํตํด ์๋ฒ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋, ์๋ฒ๋ก๋ถํฐ ๋ฆฌ์์ค ์ํ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
REST API ํ์ฉ ์ ๊ณผ์
โข
๋ฒ์ ๊ด๋ฆฌ:ย API๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์๋ค.
โข
์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ:ย REST API๋ฅผ ๋ณดํธํ๋ ค๋ฉด ์ ์ ํ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํด์ผ ํ๋ค. ๊ธฐ๋ณธ ์ธ์ฆ, OAuth ๋๋ JWT(JSON ์น ํ ํฐ)์ ๊ฐ์ ์ฌ๋ฌ ํ์ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ง๋ง API ๋ณด์์ ์ํด์๋ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๊ณ ์ ์ ํ ๊ตฌํ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์ํ๋ค.
โข
๋น์จ ์ ํ ๋ฐ ํ ๋น๋:ย ๋น์จ ์ ํ ๋ฐ ํ ๋น๋์ ์ ์ฉํ๋ฉด API์ ๊ณผ๋ํ ์ฌ์ฉ์ด๋ ๋จ์ฉ์ ๋ฐฉ์งํ๊ณ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ๊ณต์ ํ ์ก์ธ์ค๋ฅผ ๋ณด์ฅํ ์ ์๋ค. ์ด๋ฌํ ์ ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์๋ ์ ๋ฒํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์ฉํ ์ ์๋ ์ ์ฐ์ฑ๊ณผ ์๊ฒฉํจ์ ๊ท ํ์ ์ ์งํ๋๋ก ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค.
โข
ํธํ์ฑ:ย ๊ธฐ์ , ํ๋ซํผ ๋ฐ ์๊ตฌ ์ฌํญ์ด ์๋ก ๋ค๋ฅธ ๋ค์ํ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ ์๋ REST API๋ฅผ ์ค๊ณํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์๋ค. ๋๋ฆฌ ์ธ์ ๋๋ ํ์ค๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ฉด ํธํ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋๋ค.
โข
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ฌธ์ํ:ย ์ฑ๊ณต์ ์ธ REST API๋ฅผ ์ํด์๋ ๋ช
ํํ ์ค๋ฅ ๋ฉ์์ง์ ํฌ๊ด์ ์ธ ๋ฌธ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ํ์์ ์ด๋ค. ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ํผ๋์ ๋ฐฉ์งํ๊ณ ๋ฌธ์ ๋๋ฒ๊น
๋ฐ ํด๊ฒฐ์ ํ์ํ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
URI, URL, URN
URL ๊ตฌ์ฑ ์ดํดํ๊ธฐ
โข
ํ๋กํ ์ฝ : https
โข
ํธ์คํธ๋ช
: www.google.com
โข
ํฌํธ๋ฒํธ : 443
โข
ํจ์ค : /search
โข
์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ : q=hello&hl=ko
Scheme
โข
์ฃผ๋ก ํ๋กํ ์ฝ(์ด๋ค ๋ฐฉ์์ผ๋ก ์์์ ์ ๊ทผํ ๊ฒ์ธ๊ฐ ํ๋ ์ฝ์ ๊ท์น)์ฌ์ฉ
โข
์) http, https, ftp ๋ฑ๋ฑ
โข
http๋ 80 ํฌํธ, https๋ 443 ํฌํธ๋ฅผ ์ฃผ๋ก ์ฌ์ฉ, ํฌํธ๋ ์๋ต ๊ฐ๋ฅ
host
โข
ํธ์คํธ๋ช
(www.google.com)
โข
๋๋ฉ์ธ๋ช
๋๋ IP ์ฃผ์๋ฅผ ์ง์ ์ฌ์ฉ ๊ฐ๋ฅ
port
โข
์ ์ ํฌํธ
โข
์ผ๋ฐ์ ์ผ๋ก ์๋ต ๊ฐ๋ฅ
โข
์๋ต ์ http๋ 80, https๋ 443 ํฌํธ ๋ฒํธ๋ก ์ค์ ๋๋ค.
โข
ํฐ์บฃ์ 8080 ํฌํธ๋ฅผ ์ฌ์ฉ
path
โข
๋ฆฌ์์ค ๊ฒฝ๋ก(path)
โข
๊ณ์ธต์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋จ
โฆ
/home/file1.jpg
โฆ
/members
โฆ
/members/100
โฆ
/items/iphone12
query
โข
query parameter, query string ๋ฑ์ผ๋ก ๋ถ๋ฆผ, ์น์๋ฒ์ ์ ๊ณตํ๋ ํ๋ผ๋ฏธํฐ, ๋ฌธ์ ํํ
โข
key=value ํํ
โข
?๋ก ์์๋๋ฉฐ, &๋ก ์ฌ๋ฌ๊ฐ ์ถ๊ฐ ๊ฐ๋ฅ
โข
ex) ?keyA=valueA&keyB=valueB
fragment
โข
html ๋ด๋ถ ๋ถ๋งํฌ ๋ฑ์ ์ฌ์ฉ
โข
์น๋ฌธ์ ํด์ํํฌ๋ผ๊ณ ๋ ๋ถ๋ฆผ
โข
์๋ฒ์ ์ ์กํ๋ ์ ๋ณด ์๋