๋ต๋ณ์ ํฌํจํด์ผํ ํค์๋
โญ RESTful API๋ REST์ ์์น์ ๋ฐ๋ฅด๋ API๋ฅผ ์๋ฏธํ๋ค. ์์์ URL(์๋ํฌ์ธํธ)๋ก ํํํ๊ณ HTTP ๋ฉ์๋๋ฅผ ํ์ฉํด ์์์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ์์ด๋ค.
โญ SOAP ์ํ(Simple Object Access Protocol)์ XML ๊ธฐ๋ฐ์ ๋ฉ์์ง ํ๋กํ ์ฝ๋ก, ๋คํธ์ํฌ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์ค ๋ฐฉ์ ์ค ํ๋๋ก ๋ณด์, ํธ๋์ญ์ , ๋ฉ์์ง ์ ๋ขฐ์ฑ์ ์ค์ํ๊ฒ ์ฌ๊ธฐ๋ ํ๊ฒฝ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
โญ GraphQL์ Facebook์์ ๊ฐ๋ฐํ API ์ฟผ๋ฆฌ ์ธ์ด๋ก, ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ง ์ ํํ๊ฒ ์์ฒญํ๊ณ ๋ฐ์ ์ ์๋๋ก ์ค๊ณ๋ ๋ฐฉ์์ด๋ค. REST API์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ์๋ํฌ์ธํธ๋ฅผ ๋๋ ๊ฒ์ด ์๋๋ผ, ๋จ์ผ ์๋ํฌ์ธํธ์์ ์์ฒญ(Query)๋ง๋ค ํ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ ์๋ค.
RESTful API์ ์ค๊ณ ์์น์ ๋ฆฌ์์ค ๊ธฐ๋ฐ ์ค๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์ฃผ์ ์์น์
ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ : ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌ
๋ฌด์ํ์ฑ(Stateless) : ์์ฒญ ๊ฐ์ ์ํ ์ ๋ณด๋ฅผ ์ ์งํ์ง ์์
์บ์ ๊ฐ๋ฅ : ์๋ต์ ์บ์ฑํ์ฌ ์ฑ๋ฅ ์ต์ ํ
๊ณ์ธตํ๋ ์์คํ : ์ฌ๋ฌ ๊ณ์ธต์ ํตํด ๊ตฌ์กฐํ ๊ฐ๋ฅ
์ผ๊ด๋ ์ธํฐํ์ด์ค : HTTP ๋ฉ์๋๋ฅผ ํ์ฉํ ๋ฆฌ์์ค ์กฐ์
RESTful API๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ๊ณ HTTP ๋ฉ์๋(GET,POST,PUT,DELETE)๋ฅผ ํ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์กฐ์ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์ฃผ์ ์์น์ผ๋ก๋ ๋ฌด์ํ์ฑ, ์บ์ฑ, ๊ณ์ธตํ, ์ผ๊ด๋ ์ธํฐํ์ด์ค, ์์ฒด ํํ ๋ฑ์ด ์์ต๋๋ค. ํนํ ๋ฌด์ํ์ฑ์ ์ ์งํ๋ฉด ์๋ฒ ํ์ฅ์ฑ์ด ์ข์์ง๊ณ , ์บ์ฑ์ ํตํด ๋คํธ์ํฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
ํ๋กํ ์ฝ : REST๋ HTTP ๊ธฐ๋ฐ, SOAP๋ XML ๊ธฐ๋ฐ์ ํ๋กํ ์ฝ
๋ฐ์ดํฐ ํ์ : REST๋ JSON, XML ๋ฑ ๋ค์ํ ํ์ ์ง์, SOAP๋ XML๋ง ์ฌ์ฉ
์๋ ๋ฐ ํ์ฅ์ฑ : REST๊ฐ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ฉฐ ํ์ ์ฑ์ด ๋์, SOAP๋ ๋ณด์๊ณผ ํธ๋์ญ์ ๊ด๋ฆฌ์ ๊ฐ์
์ฌ์ฉ ์ฌ๋ก : REST๋ ์น ์๋น์ค ๋ฐ ๋ชจ๋ฐ์ผ ์ฑ API, SOAP๋ ๊ธ์ต-๊ธฐ์ ์์คํ
REST๋ ๊ฒฝ๋ํ๋ ๊ตฌ์กฐ๋ก JSON, XML ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ํ์์ ์ง์ํ๋ฉฐ, HTTP ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. ๋ฐ๋ฉด SOAP๋ XML ๊ธฐ๋ฐ์ ํ๋กํ ์ฝ๋ก ๋ณด์๊ณผ ํธ๋์ญ์ ์ด ์ค์ํ ํ๊ฒฝ์์ ์ฌ์ฉ๋ฉ๋๋ค. REST๋ ์น ๋ฐ ๋ชจ๋ฐ์ผ ์๋น์ค ๊ฐ๋ฐ์ ์ ํฉํ๊ณ SOAP๋ ๊ธ์ต, ์ํฐํ๋ผ์ด์ฆ ์์คํ ๋ฑ ์ ๋ขฐ์ฑ์ด ์๊ตฌ๋๋ ํ๊ฒฝ์์ ์ฃผ๋ก ํ์ฉ๋ฉ๋๋ค.
API๋ ํ ๋ฒ ๋ฐฐํฌ ๋๋ฉด ์ฌ๋ฌ ํด๋ผ์ด์ดํผ๊ฐ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์๋ ๊ธฐ์กด ์ฌ์ฉ์์ ์ํฅ์ ์ต์ํํด์ผํฉ๋๋ค. ์ด๋ฅผ ์ํด URL ๋ฒ์ ๋ง, ํค๋ ๊ธฐ๋ฐ ๋ฒ์ ๊ด๋ฆฌ, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฐฉ์ ๋ฑ์ ํ์ฉํ ์ ์์ต๋๋ค. ์ฃผ์ ์ ๋ต์ผ๋ก๋ ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์ ์ง์ ์ผ๋ก ๊ฐ์ ํ๋ ๋ฐฉ์์ด ํ์ํฉ๋๋ค.
๊ธฐ๋ฅ์ถ๊ฐ, ๊ธฐ์กด ๊ธฐ๋ฅ ๋ณ๊ฒฝ, ๋ณด์ ๊ฐ์
ํํ ํธํ์ฑ์ ๋ณด์กดํ๋ฉด์ ๊ฐ์ ๋ฐฉ์
URL ๋ฒ์ ๋ง (url์ v1, v2๋ฅผ ๋ฃ์ด์ฃผ๋๋ฒ)
ํค๋ ๊ด๋ฆฌ -> GrahQL์ ์ฌ์ฉํ ๋ ์ด๋ค.
REST๋ ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ํตํด ์ ํด์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐฉํํ๋ ๋ฐฉ์์ด๋ฉฐ, GraphQL์ ๋จ์ผ ์๋ํฌ์ธํธ์์ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ ์ ์์ต๋๋ค. REST๋ ์บ์ฑ์ด ์ฉ์ดํ๊ณ ๋จ์ํ CRUD API์ ์ ํฉํ๋ฉฐ, GraphQL์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์์ฒญ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ ๊ฐ์ ์ด ์์ต๋๋ค. ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ด ์์ฃผ ๋ณ๊ฒฝ๋๋ ํ๋ก์ ํธ๋ผ๋ฉด GraphQL, ํ์ค์ ์ธ API ์ค๊ณ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ REST๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.
๋ฐ์ดํฐ ์์ฒญ ๋ฐฉ์์์ ์ฒ๋ฆฌ,
REST๋ ๋ถํ์ํ ๋ฐ์ดํฐ(์ค๋ฒํจ์นญ)๊น์ง ๋๊ณ ์ค๋๋ฐ GraphQL์ ์ํ๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ ์ฅ์
(์ธ๋ํจ์นญ) : 5๊ฐ๋ฅผ ๊ฐ์ ธ์์ผ๋๋๋ฐ 2๊ฐ๋ง ๊ฐ์ ธ์์ ๋, ์ถ๊ฐ๋ก 3๊ฐ๋ฅผ ๊ฐ์ ธ์์ผ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ธ๋ํจ์นญ
OAuth 2.0์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ์์ด ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ก ํ์ฉํ๋ ๊ฒ
์ธ๊ฐ๋ฐฉ์ 4๊ฐ์ง๊ฐ ์์ ์ธ๊ฐ์ฝ๋, ์์์ ์ธ์ฆ ๋ฐฉ์
OAuth 2.0์ ์ธ์ฆ๊ณผ ๊ถํ ์์์ ์ํ ํ๋กํ ์ฝ๋ก, ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ๋ ธ์ถํ์ง ์๊ณ ์์ธ์ค ํ ํฐ์ ์ด์ฉํ์ฌ ์ธ์ฆ์ ์ํํฉ๋๋ค. ๋ํ์ ์ธ ๋ฐฉ์์ผ๋ก Authorization Code, Implicit, Client Credentials, Resource Owner Password Credentials๊ฐ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๋ณด์์ฑ ๋์ Authorzation COde ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
200 OK : ์์ฒญ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋จ, 404 Not Found : ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์, 500 Internal Server Error : ์๋ฒ ๋ด๋ถ์์ ์๊ธฐ์น ์์ ์ค๋ฅ ๋ฐ์
๋ฉฑ๋ฑ์ฑ : ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ๋ณด๋ด๋ ๊ฒฐ๊ณผ๊ฐ ๋ณํ์ง ์๋ ์์ฑ
๋ฉฑ๋ฑ์ฑ์ด๋ ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ์ํํด๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ์ฑ์ง์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด GET/user/1์ ํญ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ผ ํ๋ฉฐ, PUT/user/1{name:"John"}๋ ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ๋ณด๋ด๋ ๊ฒฐ๊ณผ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํฉ๋๋ค. ๋ฐ๋ฉด, POST ์์ฒญ์ ์๋ก์ด ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ฏ๋ก ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
API ๋ฌธ์๋ ๊ฐ๋ฐ์ ๊ฐ์ ์ํํ ํ์ ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ํด ํ์์ ์ด๋ฉฐ, ์ด๋ฅผ ์๋ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Swagger, Spring REST Docs, Redoc๋ฑ์ด ์์ต๋๋ค.
์ค์จ๊ฑฐ : UI ๊ธฐ๋ฐ์ API ํ ์คํธ ๋ฐ ๋ฌธ์ํ ์ ๊ณต
Spring REST Docs : ์ฝ๋ ๊ธฐ๋ฐ ๋ฌธ์ํ, ๋งํฌ๋ค์ด ์ง์
Redos : ์คํAPI ๋ฌธ์๋ฅผ ์ ๋ฆฌํ์ฌ ๊ฐ๋ ์ฑ์๋์ ๋ฌธ์ ์ ๊ณต
HATEOAS๋ ์ฝ๊ฒ ๋งํ๋ฉด API ์๋ต์ "๋ค์์ ๋ญ ํ๋ฉด ์ข์์ง"๋ฅผ ์๋ ค์ฃผ๋ ๋งํฌ๋ฅผ ๊ฐ์ด ํฌํจํ๋ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ๋ค์ด ์ํ ์ ๋ณด๋ฅผ ์์ฒญํ๋ฉด ์ํ ๋ฐ์ดํฐ์ ํจ๊ณ ๊ด๋ จ๋ ์นดํ ๊ณ ๋ฆฌ๋ ๋ฆฌ๋ทฐ ํ์ด์ง๋ก ์ด๋ํ ์์๋ ๋งํฌ๋ ํฌํจํด์ ๋ณด๋ด์ฃผ๋ ๊ฒ์ด์ฃ . ์ด๋ ๊ฒ ํ๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ณ๋ ๋ก API ๋ฌธ์๋ฅผ ์ฐพ์๋ณผ ํ์ ์์ด ์๋ต์ ๋ณด๊ณ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ์ ์ง๋ณด์๋ ์ฌ์ด์ง๊ณ API ํ์ฅ์๋ ์ ๋ฆฌํ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค.
RESTful API ์ ์กํ ๋ HATEOAS ๋ฐฉ์์ผ๋ก GET,POST ๋ฑ URL ์ ๋ณด๋ฅผ ์๋ฒ์์ ์ ์กํ๋ค.
์๋ฒ๊ฐ ์ ๊ณตํ๋ ํ์ดํผ๋ฏธ๋์ด ๋งํธ๋ฅผ ํตํด ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ์
ํด๋ผ๋ฆฌ์ธํธ๋ API๊ฐ ์ ๊ณตํ๋ ๋งํฌ์ ํค์๋ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํ์ํ๊ณ ์ํ ์ ํ
URL ๋ณ๊ฒฝ ์์กด๋ โฌ๏ธ
๋ฉํฐ ํ๋ ์ฑ : HTTP/2๋ ํ๋์ TCP ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
ํค๋ ์์ถ : HPACK์ ์ฌ์ฉํ์ฌ ํค๋ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ๋คํธ์ํฌ ํจ์จ ๊ฐ์
์๋ฒ ํธ์ : ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๊ธฐ ์ ์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๋ฏธ๋ฆฌ ์ ์ก ๊ฐ๋ฅ
์๋ ๊ฐ์ : HTTP/1.1 ๋๋น ์ง์ฐ ์๊ฐ์ด ์ค์ด๋ค๊ณ ์ฑ๋ฅ์ด ํฅ์๋จ
์ค๋ฌด์์๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด HTTP/2๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํ๊ฒฝ์์ ๋์ฑ ์ ์ฉํฉ๋๋ค.
HTTP/1.1์์๋ ์์ฒญ์ ํ ๊ฐ์ฉ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํด์ ์๋๊ฐ ๋๋ฆด ์ ์๋๋ฐ, HTTP/2๋ ํ๋์ ์ฐ๊ฒฐ๋ก ์ฌ๋ฌ ๊ฐ์ ์์ฒญ์ ๋์์ ๋ณด๋ผ ์ ์์ต๋๋ค.(๋ฉํฐํ๋ ์ฑ). ๋, ํค๋๋ฅผ ์์ถํด์ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ค์ด๊ณ , ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ ์ ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๋ด์ค ์๋ ์๋ค.(์๋ฒํธ์), ๊ทธ๋์ HTTP/2๋ฅผ ์ ์ฉํ๋ฉด ์น์ฌ์ดํธ ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ ์ฑ๋ฅ์ด ํ์คํ ์ข์์ง๋ค.
1.1์ ํ๋์ ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ HOLB๊ฐ ๋ฐ์
์ดํ ๋ฌธ์ ๋ฐ์์, ํ์ ์์ฒญ๋ค์ด ์ ์ก๋์ง ๋ชปํ๊ณ ์ง์ฐ๋๋ ๋ฌธ์ ๋ฐ์
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณ๋ ฌ์ฒ๋ฆฌ ๋์ ์ ์ํ 2๊ฐ ๋์ด
ํ๋์ ์ฐ๊ฒฐ๋ก ์ฌ๋ฌ ์คํธ๋ฆผ์ ๋ฉ์์ง๋ฅผ ๋ด์ ์ ๋ฌ (๋ฐ์ด๋๋ฆฌ ์ธ์ฝ๋ฉ)