GraphQL์ด๋
GraphQL? ๐
GQL์ฆ, API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์ด๋ฉฐ, ํ์ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ์๋ฒ์ฌ์ด๋ ๋ฐํ์์ด๋ค.
GraphQL์ ํน์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์คํ ๋ฆฌ์ง์ ๊ท์๋์ด ์์ง ์์ผ๋ฉฐ, ๊ธฐ์กด ์ฝ๋์ ๋ฐ์ดํฐ์ ์ํด ๋์ฒด๋๋ค.
(์ผ๋ฐ์ ์ผ๋ก GQL์ ์ธํฐํ์ด์ค๊ฐ ์ก์์ ์ ๋คํธ์ํฌ ๋ ์ด์ด L7์ HTTP POST ๋ฉ์๋์ ์น์์ผ ํ๋กํ ์ฝ์ ํ์ฉํ๋ค. ํ์์ ๋ฐ๋ผ์๋ ์ผ๋ง๋ ์ง L4์ TCP/UDP๋ฅผ ํ์ฉํ๊ฑฐ๋ ์ฌ์ง์ด L2 ํ์์ ์ด๋๋ท ํ๋ ์์ ํ์ฉ ํ ์๋ ์๋ค.)
GQL, SQL์ ์ฐจ์ด
SQL์ ๋ฌธ์ฅ(statement)์ ์ฃผ๋ก ๋ฐฑ์๋ ์์คํ ์์ ์์ฑํ๊ณ ํธ์ถํ๋ ๋ฐ๋ฉด, GQL์ ๋ฌธ์ฅ์ ์ฃผ๋ก ํด๋ผ์ด์ธํธ ์์คํ ์์ ์์ฑํ๊ณ ํธ์ถํ๋ค.
REST API์ ํ๊ณ
REST API์ ๊ฐ๋ ์ ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ๋ชจ๋ Resource๋ค์ ํ๋์ Endpoint์ ์ฐ๊ฒฐํ๊ณ ์ฐ๊ฒฐ๋ Endpoint๋ Resource์ ๊ด๋ จ๋ ๋ด์ฉ๋ง ๊ด๋ฆฌํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ด๋ ๋จ์ํ ์๋น์ค์์๋ ์์ฃผ ์ข์ง๋ง ๋ณต์กํ ์๋น์ค๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ฌํญ์ ๋ฐ๋ผ Over-Fetching๊ณผ Under-Fetching์ด ๋ฐ์ํ๋ค.
๋ํ REST API๋ก ์ฌ๋ฌ ํ๊ฒฝ์์ ํ์ํ ์ ๋ณด๋ค์ Resource ๋ณ๋ก Endpoint๋ฅผ ๊ฐ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ์ด๋ ต๋ค.
ํ๋ง๋๋ก ๋น์ทํ์ง๋ง Endpoint๊ฐ ๋ค๋ฅธ API๊ฐ ๋ง์ด ํ์๋๋ค.
- Over-Fetching
GET /user/1/
response body
{
"user_no":1,
"user_name": "test",
"user_grade": "VVIP",
"zip": "11053",
"last_login_timetamp": "2019-08-08 12:11:44",
...
}
์ฌ๊ธฐ์์ ํด๋ผ์ด์ธํธ๋ 1๋ฒ์ ํด๋นํ๋ ์ ์ ์ ์ด๋ฆ๋ง์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๊ณ ํด๋ ์ ์ ์ด๋ฆ๋ง ๋ฐํํ๋ API๊ฐ ์๋ค๋ฉด ์์ ๊ฐ์ /user/1/API๋ฅผ ํธ์ถํ ๋ค์, user_name์ ๊ฐ์ ธ์ ์ฌ์ฉํด์ผํ๋ค. ์ด ๋, user_grade, zip ๋ฑ๋ฑ์ ๋ฐ์ดํฐ๋ ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๋ ๊ฐ์ด ๋ฐํ๋ฐ๋๋ค. ์ด๋ ๊ณง ๋ฆฌ์์ค์ ๋ญ๋น๋ผ๊ณ ๋ณผ ์ ์๊ณ ์ด์ ๊ฐ์ ๋ญ๋น๋ฅผ Over-Fetching์ด๋ผ ๋ช ํ๋ค.
- Under-Fetching
/user/1/
/cart/
/notification/
/wish/
...
์์ฒญ์ ๋ง๊ฒ ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฌ๋ฌ API๋ฅผ ํธ์ถํ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ Under-Fetching์ด๋ผ ํ๋ค.
Example
์์ฒญ์ฟผ๋ฆฌ
query{
user(user_no:1){
user_name
}
}
๋ฐํ๋ฐ์ดํฐ
{
"data": {
"user": {
"user_name": "jim",
}
}
}
-
์ฅ์
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐํํ ์ ์๋ค.
- 1๋ฒ์ ํธ์ถ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- REST API์ N+1 Problem์ ํด๊ฒฐ ํ ์ ์๋ค.
- ํ์ฅ์ด ์ฉ์ด
-
๋จ์
- ๋ฐฑ์๋, ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์ ์์ชฝ ๋ค ๋ฌ๋์ปค๋ธ๊ฐ ์๋ค.
- ๋จ์ํ ์๋น์ค์์๋ ์ฌ์ฉํ๊ธฐ๊ฐ ๋ณต์กํ๋ค.
- ๋๋ถ๋ถ์ ์ธ์ด์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ๊ณตํ๋ค.
- ์บ์ฑ ๊ธฐ๋ฅ์ ๊ตฌํ์ด ๋ณต์กํ๋ค.
- ์์ฒญ์ด text๋ก ๋ ์๊ฐ๊ธฐ ๋๋ฌธ์ File ์ ์ก ๋ฑ์ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต๋ค.