์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- JavaScript
- ํ ์คํธ ์์
- Cmarket
- git
- BFS์ DFS
- Effect Hook
- ๋ฒ๋ค๋ง
- props drilling
- wai-aria
- WEB
- css
- prototype
- React
- Lifting state
- ํ๋ก๊ทธ๋๋จธ์ค
- Study
- ํผํฐ ๋ชจ๋น์ ๋ฒ์ง ๋ชจํ
- ์๋งจํฑ์์
- State
- css animation
- ๋ฒ์ง ๋ชจํ
- ๊ณ ์ฐจํจ์
- ์คํ ์ด์ธ ์ฝ๋
- html
- ํผํฐ ๋ชจ๋น
- fetch api
- ์ ์ด์ฝฅ ๋์จ
- jsx
- ์คํ ์ด์ธ ์ฝ๋42๊ธฐ
- ์ปดํจํฐ ๊ณตํ
- Today
- Total
roqkf
[API] GraphQL ๋ณธ๋ฌธ
๐ GraphQL
- Facebook์์ ์ฒ์์ผ๋ก ๊ฐ๋ฐ, ์คํ ์์ค๋ก ์ ๊ณต๋ ์ฟผ๋ฆฌ ์ธ์ด
- Graph + Query Language์ ์ค์๋ง๋ก Query Language ์ค์์๋ Server API ๋ฅผ ํตํด ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ Query Language
- API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด
๐ค ์ Graph๋ฅผ ์ฌ์ฉํ๋์?
GraphQL์ ์์ด๋์ด๋ ๊ทธ๋ํ๋ก ์๊ฐํ๊ธฐ์์๋ถํฐ ์ถ๋ฐํ๋ค. ๊ทธ๋ํ๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ ์ธ๊ฐ์ ๋ ๊ตฌ์กฐ ๋ฐ ์ธ์ด์ ์ธ ์ค๋ช ๊ณผ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ์ค์ ํ์ค ์ธ๊ณ์ ๋ง์ ํ์๋ค์ ๋ชจ๋ธ๋งํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ํน์ ๊ฐ๋ ์ ํ์ตํ๊ณ ์ด๋ฅผ ๋ค๋ฅธ ๊ฐ๋ ๊ณผ ์ฐ๊ด์ํฌ ๋ ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉํ๋ ๋ง์ธ๋๋งต๊ณผ ์ ์ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
[๊ทธ๋ฆผ] ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ
๊ทธ๋ํ๋ ์ฌ๋ฌ ๊ฐ์ ์ ๋ค์ด ์๋ก ๋ณต์กํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ ๊ด๊ณ๋ฅผ ํํํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ปํ๋ค. ํ๋์ ์ ์ ๊ทธ๋ํ์์๋ Node ๋๋ ์ ์ (vertex)์ด๋ผ๊ณ ํํํ๊ณ , ํ๋์ ์ ์ ๊ฐ์ (edge) ์ด๋ผ๊ณ ํ๋ค. ์ง์ ์ ์ธ ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ ์ ์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ์ ์ด ์์ผ๋ฉฐ ๊ฐ์ ์ ์ธ ๊ด๊ณ๋ผ๋ฉด ๋ช ๊ฐ์ ์ ๊ณผ ์ ์ ๊ฑธ์ณ ์ด์ด์ง๋ค. ๋ํ ๊ฐ ๋ ธ๋๊ฐ์ ๊ฐ์ ์ ํตํด ํน์ ํ ์์์ ๋ฐ๋ผ ๊ทธ๋ํ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ํ ์ ์๋ค.
[๊ทธ๋ฆผ] ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ์ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ์ ์ฐจ์ด
GraphQL์์๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋ํ ํํ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ์ ์ ํ๋ค. ์ผ๋์ผ๋ก ์ฐ๊ฒฐ๋ ๊ด๊ณ๋, ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ์ด๋ฃจ์ด์ง ๊ด๊ณ๋ ๋ชจ๋ ๊ทธ๋ํ์ด๋ค. ํธ๋ฆฌ๋ ๊ทธ๋ํ๋ ๋ ธ๋์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋จ์ง ๊ทธ ๊ทธ๋ํ๋ฅผ ๋๊ตฌ์ ์ ์ฅ์์ ์ ๋ ฌํ๋๋(ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋๋)์ ๋ฐ๋ผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃฐ ์ ์๋ค.
[๊ทธ๋ฆผ] ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ๋ ฌ๋ ๊ทธ๋ํ์ GraphQL
์ด๋ฅผ ํตํด GraphQL์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ํธ๋ฆฌ ๊ตฌ์กฐ์ JSON ๋ฐ์ดํฐ๋ฅผ ์๋ต์ผ๋ก ์ ์กํ ์ ์๋ค. ๋ค์ ๋งํด GraphQL์ REST API ๋ฐฉ์์ ๊ณ ์ ๋ ์์์ด ์๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์์์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ ์์ ์์ฒญ๋ ์ด์ ์ ๊ฐ๋๋ค.
โจ GraphQL๋ก ๊ทธ๋ํ ์ํ
GraphQL๋ก ๊ทธ๋ํ๋ฅผ ์ํํ๊ธฐ ์ํด ๋์๊ด์ ๋์ ๋ชฉ๋ก ์์คํ ์ ๊ตฌ์ถํ๋ค๊ณ ๊ฐ์ ํด์. ํ๋์ ๋์ ๋ชฉ๋ก์๋ ๋ง์ ์ฑ ๊ณผ ์ ์๊ฐ ์์ ๊ฒ์ด๋ฉฐ, ๊ฐ ์ฑ ์๋ ์ต์ํ ํ ๋ช ์ ์ ์๊ฐ ์๋ค. ๋ํ ์ต์ํ ํ ๊ถ์ ์ฑ ์ ๊ฐ์ด ์ด ๊ณต๋์ ์ ๋ํ ์์ ๊ฒ์ด๋ค.
[๊ทธ๋ฆผ] ๋์ ๋ชฉ๋ก ์์คํ
๊ตฌ์ถ์ ์ํ ๊ทธ๋ํ
์์ ๊ทธ๋ํ๋ ์์์์ ์ค๋ช ํ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ ํํ๋ก ์๊ฐํํ ๊ฒ์ด๋ค. ์ด๋ฐ ์์ผ๋ก ๊ทธ๋ํ๋ก ํํํ๊ฒ ๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ์ ์กฐ๊ฐ๋ค์ด๋ ๋ํ๋ด๊ณ ์ ํ๋ ์ํฐํฐ(์ฑ , ํน์ ์ ์) ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ผ ์ ์๋ค.
์ํฐํฐ ๋ ์ฌ๋ฌผ์ ๊ตฌ์กฐ๋ ์ํ, ๋์ ๋ฑ์ ๋ชจ๋ธ๋ก ํํํ๋ ๊ฒฝ์ฐ, ๊ทธ ๋ชจ๋ธ์ ๊ตฌ์ฑ์์๋ฅผ ๋งํ๋ค. ์๋ฅผ ๋ค์ด ํ์์ด๋ผ๋ ๊ฐ์ฒด๋ “ํ๋ฒ”, “์ด๋ฆ”, “ํ๊ณผ”๋ผ๋ 3๊ฐ์ ์์ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ ๊ฒ์ฒ๋ผ, ์์ ์ํฐํฐ๋ ์ฑ
์ด๋ผ๋ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ค๋ฉด “์ฑ
์ด๋ฆ"์ด๋ผ๋ 1๊ฐ์ ์์ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ ์
์ด๋ค.
์ ๋ณด์ ์ธก๋ฉด์์ ๋ณผ ๋ ์ด ์์ฑ์ ๊ทธ ์์ฒด๋ง์ผ๋ก๋ ์ค์ํ ์๋ฏธ๋ฅผ ํํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋จ๋
์ผ๋ก ์กด์ฌํ์ง๋ ๋ชปํ๋ค. ์์ ์์์ ๊ฐ ์์ฑ๋ค ์ฆ “ํ๋ฒ”, “์ด๋ฆ”, “ํ๊ณผ”๋ ๊ฐ๋ณ์ ์ผ๋ก๋ ์ฐ๋ฆฌ์๊ฒ ์ด๋ค ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์ง ๋ชปํ์ง๋ง ์ด๊ฒ๋ค์ด ๋ชจ์ฌ “ํ์”์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํด์ ํํํ ๋๋ ํฐ ์๋ฏธ๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์๊ฒ ๋๋ค๋ฉด, GraphQL์ ์ฌ์ฉํด ํธ๋ฆฌ๋ฅผ ์ถ์ถํ ์ ์๊ฒ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋ฆฌ๋ ๋ฐฉํฅ์ฑ์ ์กด์ฌํ๋ ์ฌ์ดํด์ ์กด์ฌํ์ง ์๋ ๋น์ํ ๊ทธ๋ํ์ด๋ค. ๋ฃจํธ์ ๋ชจ์๋ฆฌ๋ฅผ ํตํด ๋ ธ๋๋ฅผ ๋ฐ๋ผ ์ํํ ์ ์์ผ๋ ๋์ผํ ๋ ธ๋๋ก ๋์์ฌ ์ ์๋ ์์ฑ์ ๊ฐ๊ณ ์๋ ํน๋ณํ ๊ทธ๋ํ์์ ๋ปํ๋ค.
โจ ๊ทธ๋ํ์์ ํธ๋ฆฌ ์ถ์ถํ๋ ๋ฐฉ๋ฒ
GraphQL ์ฟผ๋ฆฌ์ ์์ ๊ทธ๋ํ์์ ํธ๋ฆฌ๋ฅผ ์ถ์ถํด๋ณด๋๋ก ํ์. ์์ ๊ทธ๋ํ์์ ์คํํ ์ ์๋ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
query {
์ฑ
(ISBN์ด "9780674430006") {
์ฑ
์ด๋ฆ
์ ์ {
์ด๋ฆ
}
}
}
์์ ๊ทธ๋ํ๋ ๊ฐ๋จํ๊ฒ ํํํ์ง๋ง ์ฌ์ค ์ฑ ์ด๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ์์ฑ์ ์ฑ ์ด๋ฆ ์ธ์๋ ๋ง์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํ ๊ถ์ ์ฑ ๋ง ๊ฒ์ํ๊ธฐ ์ํด, ISBN์ด "9780674430006์ธ ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ์. ์ด ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๊ฐ ํด๋น ์์ฒญ์ ํด๊ฒฐํ๋ค๋ฉด, ๋์์จ ์ฟผ๋ฆฌ๋ ์ด๋ด ๊ฒ์ด๋ค.
{
์ฑ
: {
์ฑ
์ด๋ฆ : "GraphQL์ ์ด๋ ต์ง ์๋ค",
์ ์ : [
{ ์ด๋ฆ : "๊น์ฝ๋ฉ"},
{ ์ด๋ฆ : "๋ฐํด์ปค"},
]
}
}
๊ทธ๋ผ ์ด๊ฒ์ ๊ทธ๋ํ์ ๊ด์ ์์ ๋ณธ๋ค๋ฉด ์ด๋จ๊น?
[๊ทธ๋ฆผ] GraphQL๋ก ์ฟผ๋ฆฌํ ๊ฒ์ ๊ทธ๋ํ์ ๊ด์ ์ผ๋ก ๋์ํ
์ด ์์์๋ ISBN ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ “์ฑ " ๋ ธ๋์์ ์์ํ๋ค. ๊ทธ ๋ค์ GraphQL์ ์ค์ฒฉ๋ ๊ฐ ํ๋๋ก ํ์๋ ๊ฐ์ ์ ๋ฐ๋ผ ๊ทธ๋ํ๋ฅผ ํ์ํ๊ธฐ ์์ํ๋ค. ์ฆ ์ฟผ๋ฆฌ ๋ด ์ค์ฒฉ๋ “์ฑ ์ด๋ฆ” ํ๋๋ฅผ ํตํด ์ฑ ์ ์ ๋ชฉ์ด ์๋ ๋ ธ๋๋ก ์ด๋ํ๋ค. ๊ทธ๋ฌ๋ฉด์ “์ ์”๋ก ๋ ์ด๋ธ์ด ์ง์ ๋ “์ฑ ”์ ๊ฐ์ ์ ๋ฐ๋ผ๊ฐ “์ ์” ๋ ธ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ฐ ์ ์์ “์ด๋ฆ"์ ์ป์ด์ค๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋ณด์ธ๋ค.
[๊ทธ๋ฆผ] GraphQL๋ก ์ฟผ๋ฆฌํ ๊ฒ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋์ํ
์ด๋ ๊ฒ GraphQL์ ์ค์ฒฉ๋ ํ๋๋ฅผ ๊ทธ๋ํ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก๋ ํํํ ์ ์๊ฒ ๋๋ค. ์ฆ, GraphQL์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํด ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
โจ GraphQL์ ํน์ง
- GraphQL์ HTTP๋ฅผ ํตํด API ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๋๋ค.
- ์๋ต์ ๋ฐ์ ์, ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ฅผ JSON ํ์์ผ๋ก ๋ฐ๋๋ค.
- GraphQL์ ์๋ฒ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๊ฐ ํ๋์ ๋์ํ๋ resolver ํจ์๋ก ๊ฐ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
- GraphQL์ GraphQL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กฐํ ๋์ schema๊ฐ ์ ํจํ์ง ๊ฒ์ฌํ๋ค.
๐ GraphQL VS REST API
โจ REST API์ ํ๊ณ
์์ ๋ค๋ฃฌ REST API๋ผ๋ ๋ฐฉ๋ฒ๋ก ์ด ์์์๋ ์ GraphQL์ด ํ์ํ์๊น? ์์ ๋ฅผ ํตํด REST API์ ํ๊ณ์ ๋ํด ์์๋ณด์.
๊ฐ์์ ๋ธ๋ก๊ทธ ์ฑ์ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํ์. ์์ ๊ฐ์ ํ๋ฉด์ ๊ตฌํํ๊ธฐ ์ํด์ ๋ค์์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค.
- ์ฌ์ฉ์์ ์ด๋ฆ
- ์ฌ์ฉ์์ ํฌ์คํ ๋ชฉ๋ก
- ์ฌ์ฉ์์ ํ๋ก์ ๋ชฉ๋ก
โจ REST API๋ก Blog ์ฑ์ ๊ตฌํํ ๋
- Overfetch: ํ์ ์๋ ๋ฐ์ดํฐ๊น์ง ์ ๊ณตํจ
๋ธ๋ก๊ทธ ์ฑ ์์ ์ฒ๋ผ ์ ์ ์ ์ด๋ฆ๋ง ํ์ํ ์ํฉ์์ REST API๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์๋ต ๋ฐ์ดํฐ์๋ ์ ์ ์ ์ฃผ์, ์์ผ ๋ฑ๊ณผ ๊ฐ์ด ์ค์ ๋ก๋ ํด๋ผ์ด์ธํธ์๊ฒ ํ์์๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ ์๋ ์๋ค.
- Underfetch: endpoint ๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ถฉ๋ถํ ์ ๊ณตํ์ง ๋ชปํจ
- Underfetch์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ํ์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ํ๋ณดํ๊ธฐ ์ํ์ฌ ์ถ๊ฐ์ ์ธ ์์ฒญ์ ๋ณด๋ด์ผ๋ง ํ๋ค. ๋ธ๋ก๊ทธ ์ฑ ์์ ํ๋ฉด์ ๊ตฌํํ๊ธฐ ์ํด์ ์ ์ ์ ๋ณด ๋ฟ๋ง ์๋๋ผ ์ ์ ์ ํฌ์คํ ๋ชฉ๋ก ๋ฐ ์ ์ ๊ฐ ๋ณด์ ํ ํ๋ก์๊น์ง ํ์ํ๋ค. ์ด๋ ํ์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ค๋ ค๋ฉด REST API์์๋ ๊ฐ๊ฐ์ ์์์ ๋ฐ๋ผ ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ 3๊ฐ์ง ์๋ํฌ์ธํธ์ ์์ฒญ์ ๋ณด๋ด์ผํ๋ค.
- ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ์๋ํฌ์ธํธ ๋ณ๊ฒฝ ๋๋ ๋ฐ์ดํฐ ์์ ์ด ํ์ํจ
- REST API์์๋ ์์์ ํฌ๊ธฐ์ ํํ๋ฅผ ์๋ฒ์์ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ฐ์ดํฐ์ ํํ๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค. ์ด๋ก ์ธํด ๋ง์ฝ ํด๋ผ์ด์ธํธ์์ ํ์ํ ๋ฐ์ดํฐ์ ๋ด์ฉ์ด ๋ณํ ๊ฒฝ์ฐ ๋ค๋ฅธ endpoint๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์์ ์ ํด์ผํ๋ค.
โจ REST API์ GraphQL์ ๋ค๋ฅธ์
๊ทธ๋ฌ๋ฏ๋ก REST API์ GraphQL์ ์ด๋ฐ ๋ถ๋ถ์์ ๋ค๋ฅด๋ค๊ณ ๋ณผ ์ ์๋ค.
- REST API๋ Resource์ ๋ํ ํํ ์ ์์ ๋ฐ์ดํฐ ์์ฒญ ๋ฐฉ๋ฒ์ด ์ฐ๊ฒฐ๋์ด ์์ง๋ง, GraphQL์์๋ Resource์ ๋ํ ํํ ์ ์์ ๋ฐ์ดํฐ ์์ฒญ์ด ์์ ํ ๋ถ๋ฆฌ๋์ด ์๋ค.
- REST API๋ Resource์ ํฌ๊ธฐ์ ํํ๋ฅผ ์๋ฒ์์ ๊ฒฐ์ ํ์ง๋ง, GraphQL์์๋ Resource์ ๋ํ ์ ๋ณด๋ง ์ ์ํ๊ณ , ํ์ํ ํฌ๊ธฐ์ ํํ๋ ํด๋ผ์ด์ธํธ ๋จ์์ ์์ฒญ ์ ๊ฒฐ์ ํ๋ค.
- REST API ๋ URI๊ฐ Resource๋ฅผ ๋ํ๋ด๊ณ Method๊ฐ ์์ ์ ์ ํ์ ๋ํ๋ด์ง๋ง, GraphQL ์์๋ GraphQL Schema๊ฐ Resource๋ฅผ ๋ํ๋ด๊ณ Query, Mutation ํ์ ์ด ์์ ์ ์ ํ์ ๋ํ๋ธ๋ค.
- REST API๋ ์ฌ๋ฌ Resource์ ์ ๊ทผํ๊ณ ์ ํ ๋ ์ฌ๋ฌ ๋ฒ์ ์์ฒญ์ด ํ์ํ์ง๋ง, GraphQL์์๋ ํ๋ฒ์ ์์ฒญ์์ ์ฌ๋ฌ Resource์ ์ ๊ทผํ ์ ์๋ค.
- REST API์์ ๊ฐ ์์ฒญ์ ํด๋น ์๋ํฌ์ธํธ์ ์ ์๋ ํธ๋ค๋ง ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ ์ ์ฒ๋ฆฌํ์ง๋ง, GraphQL์์๋ ์์ฒญ ๋ฐ์ ๊ฐ ํ๋์ ๋ํ resolver๋ฅผ ํธ์ถํ์ฌ ์์ ์ ์ฒ๋ฆฌํ๋ค.
๐ GraphQL์ ์ฅ๋จ์
์์ ๊ฐ์ REST API์ ํ๊ณ๋๋ฌธ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ์ธก์์ ์ํ๋ ๋๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ณ , ๋ณด๋ค ํธํ๊ฒ ์ ๋ณด๋ฅผ ์์ ํ ์ ์๋๋ก ํ๋ ํ์คํ๋ Query language ๋ฅผ ๋ง๋ค๊ฒ ๋์๊ณ ์ด๊ฒ์ด GraphQL์ด๋ค. ๋์ผํ ์์ ๋ฅผ ํตํด GraphQL์ ์ฅ์ ์ ์์๋ณด์.
โจ GraphQL๋ก Blog ์ฑ์ ๊ตฌํํ ๋
โจ ์ฅ์
- ํ๋์ endpoint ์์ฒญ
/graphql์ด๋ผ๋ ํ๋์ endpoint ๋ก ์์ฒญ์ ๋ฐ๊ณ ๊ทธ ์์ฒญ์ ๋ฐ๋ผ query , mutation์ resolver ํจ์๋ก ์ ๋ฌํด์ ์์ฒญ์ ์๋ตํ๋ค. ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ POST ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. - No! under & overfetching
์ฌ๋ฌ ๊ฐ์ endpoint ์์ฒญ์ ํ ํ์์์ด ํ๋์ endpoint์์ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ API์ ์์ฒญํ๊ณ ์๋ต์ผ๋ก ๋ฐ์ ์ ์๋ค. - ๊ฐ๋ ฅํ playground
graphql ์๋ฒ๋ฅผ ์คํํ๋ฉด playground๋ผ๋ GUI๋ฅผ ์ด์ฉํด resolver ์ schema ๋ฅผ ํ ๋์ ๋ณด๊ณ ํ ์คํธ ํด ๋ณผ ์ ์๋ค. (POSTMAN ๊ณผ ๋น์ท) - ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์๋ ์ง์ฅ์ด ์์
ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ๊ฐ ๋ฐ๋์ด๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐ์ ํ๊ณ ๋ฐ๋ ์ฃผ์ฒด๊ฐ ํด๋ผ์ด์ธํธ์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์ง์ฅ์ด ์๋ค. ํด๋ผ์ด์ธํธ์์๋ ๋ฌด์จ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ง์ ๋ํด์๋ง ์๊ตฌ์ฌํญ์ ์ฟผ๋ฆฌ๋ก ์์ฑํ๋ฉด ๋๋ค.
โจ GraphQL์ ๋จ์
์์ ์์ ๋ง ๋ณด๋ฉด GraphQL์ด ๊ธฐ์กด REST API ๋ฐฉ์์ด ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ง๋ฅํค๋ก ๋ณด์ด์ง๋ง GraphQL์๋ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์กด์ฌํ๋ค.
- REST API์ ์น์ํ ๊ฐ๋ฐ์์ ๊ฒฝ์ฐ GraphQL๋ฅผ ํ์ตํ๋ ๋ฐ ์๊ฐ์ด ํ์ํ๋ค.
- ์บ์ฑ์ด REST๋ณด๋ค ํจ์ฌ ๋ณต์กํ๋ค.
HTTP์์ ๊ฐ ๋ฉ์๋์ ๋ฐ๋ผ ์บ์ฑ์ด ๊ตฌํ๋์ด ์๋ค. ํ์ง๋ง GraphQL์์ POST ๋ฉ์๋๋ง์ ์ด์ฉํด ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ฉ์๋์ ๋ฐ๋ฅธ ์บ์ฑ์ ์ง์๋ฐ์ ์ ์๋ค. ๊ทธ๋์ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด Apollo ์์ง์ ์บ์ฑ๊ณผ ์์ ์ฟผ๋ฆฌ ๋ฑ์ด ๋ฑ์ฅํ๊ฒ ๋์๋ค. - ๊ณ ์ ๋ ์์ฒญ๊ณผ ์๋ต๋ง ํ์ํ ๊ฒฝ์ฐ์๋ Query ๋ก ์ธํด ์์ฒญ์ ํฌ๊ธฐ๊ฐ RESTful API ์ ๊ฒฝ์ฐ๋ณด๋ค ๋ ์ปค์ง๋ค.
๐ GraphQL ๊ตฌ์กฐ
โจ GraphQL Keywords
์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํ(Read)ํ๋ ๊ฒฝ์ฐ, REST API์์ GET ์์ฒญ์ด ์์๋ค๋ฉด GraphQL์์๋ Query๋ฅผ ์ด์ฉํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์ ์๋ค. ๋ํ Create, Delete์ ๊ฐ์ด ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ์๋ Mutation์ ์ด์ฉํด ์ด๋ฅผ ์ํํ ์ ์๋ค.
๋ ๋์๊ฐ GraphQL์์๋ ๊ตฌ๋ (Subscription)์ด๋ผ๋ ๊ฐ๋ ์ ์ ๊ณตํ๋ฉฐ ์ด๋ฅผ ์ด์ฉํด ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ ์ ์๋ค.
Subscription๋ ์ ํต์ ์ธ Client(์์ฒญ)-Server(์๋ต) ๋ชจ๋ธ์ ๋ฐ๋ฅด๋ Query ๋๋ Mutation๊ณผ ๋ฌ๋ฆฌ, ๋ฐํ/๊ตฌ๋ (pub/sub) ๋ชจ๋ธ์ ๋ฐ๋ฅธ๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ฉด, ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ WebSocket์ ๊ธฐ๋ฐ์ผ๋ก ์ง์์ ์ธ ์ฐ๊ฒฐ์ ํ์ฑํ๊ณ ์ ์งํ๊ฒ ๋๋ค. ๊ทธ ํ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ์๋ฒ๋ ๋์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ํธ์ํด์ค๋ค.
- Query: ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (REST์ GET๊ณผ ๋น์ท)
- Mutation: ์ ์ฅ๋ ๋ฐ์ดํฐ ์์ ํ๊ธฐ
- Create: ์๋ก์ด ๋ฐ์ดํฐ ์์ฑ
- Update: ๊ธฐ์กด์ ๋ฐ์ดํฐ ์์
- Delete: ๊ธฐ์กด์ ๋ฐ์ดํฐ ์ญ์ - Subscription: ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์ ์๋ฒ๊ฐ ๋์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก
๐ ์ฟผ๋ฆฌ(query, ๋ฐ์ดํฐ ์กฐํ)
โจ ํ๋(field)
๋งค์ฐ ๊ฐ๋จํ query(๋ฐ์ดํฐ ์กฐํ, ์ดํ ์ฟผ๋ฆฌ)์ ์คํ ํ์ ๋ ์ป์ ๊ฒฐ๊ณผ๋ถํฐ ์ดํด๋ณด์.
{
hero {
name
}
}
[์ฝ๋] hero์ name์ ์ฟผ๋ฆฌ
{
"data": {
"hero": {
"name": "R2-D2"
}
}
}
[์ฝ๋] ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋์ ๊ฒฐ๊ณผ
ํ๋์ name์ String ํ์ ์ ๋ฐํํ๋ค. ์์ ๊ฒฝ์ฐ hero์ name์ด “R2-D2”์์ ์ ์ ์๋ค. ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ ํํ๊ฒ ๊ฐ์ ๋ชจ์์ ํ๊ณ ์์์ ํ์ธํ ์ ์๋๋ฐ, ์ด ๋ถ๋ถ์ GraphQL์ ์์ด์ ํ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. GraphQL์ ์๋ฒ์ ์์ฒญํ์ ๋ ์์ํ๋ ๋๋ก ๋๋ ค๋ฐ๊ณ , ์๋ฒ๋ GraphQL์ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์๊ตฌํ๋ ํ๋๋ฅผ ์ ํํ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฒ์๋ ๋ค๋ฅธ ์์๋ฅผ ์ดํด๋ณด์.
{
hero {
name
# ์ด๋ฐ ์์ผ๋ก GraphQL ๋ด์์ ์ฃผ์๋ ์์ฑํ ์ ์๋ค.
friends {
name
}
}
}
[์ฝ๋] ํ์ด๋ก์ ์ด๋ฆ๊ณผ ํ์ด๋ก์ ์น๊ตฌ ์ด๋ฆ์ ๊ฐ์ด ์ฟผ๋ฆฌ
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
[์ฝ๋] ํ์ด๋ก์ ์ด๋ฆ๊ณผ ํ์ด๋ก์ ์น๊ตฌ์ ์ด๋ฆ์ด ์กฐํ๋์ด ๋์จ๋ค.
์ด๋ฐ ์์ผ๋ก ์ํ๋ ํ๋๋ฅผ ์ค์ฒฉํ์ฌ ์ฟผ๋ฆฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์์ ์์์ freinds ํ๋๋ ๋ฐฐ์ด์ ๋ฐํํ๋ค. GraphQL ์ฟผ๋ฆฌ๋ ๊ด๋ จ ๊ฐ์ฒด ๋ฐ ํ๋๋ฅผ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณ ์ ์ ์ธ REST API์์ ๊ทธ๋ฌํ๋ฏ ๋ค์ํ endpoint๋ฅผ ๋ง๋ค์ด ๊ฐ๊ธฐ ์์ฒญ์ ๋ณด๋ด๋ ๋์ ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ์์ฒญ์ ๋ณด๋์ผ๋ก์จ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
โจ ์ ๋ฌ์ธ์(Arguments)
ํ๋์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ถ์ ์ถ๊ฐํ๊ฒ ๋๋ฉด ์ฟผ๋ฆฌ์ ํ๋ ๋ฐ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ค์ ์ ๋ฌํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ง ๋ฐ์์ฌ ์ ์๋ค.
{
human(id: "1000") {
name
height
}
}
[์ฝ๋] id๊ฐ 1000์ธ human์ name๊ณผ height๋ฅผ ์ฟผ๋ฆฌ
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 1.72
}
}
}
[์ฝ๋] ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ
์ด๋ฐ ์์ผ๋ก id๊ฐ 1000์ธ human์ ์ด๋ฆ๊ณผ ํค๋ฅผ ์ฟผ๋ฆฌํด ์ฌ ์ ์๋ค. REST์ ๊ฐ์ ์์คํ ์์๋ ๋จ์ผ ์ธ์ ์งํฉ(์์ฒญ์ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ ๋ฐ URL ์ธ๊ทธ๋จผํธ)๋ง ์ ๋ฌํ ์ ์๋ค.
์๋ฅผ ๋ค์ด REST API๋ฅผ ์ด์ฉํ๋ค๋ฉด ?id=1000 ์ด๊ฑฐ๋ /1000(/:id)์ผ ๋์ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฟผ๋ฆฌํ ์ ์๋ค.
โจ ๋ณ๋ช (Aliases)
ํ๋ ์ด๋ฆ์ ์ค๋ณตํด์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ํ๋ ์ด๋ฆ์ ์ค๋ณต์ผ๋ก ์ฌ์ฉํด์ ์ฟผ๋ฆฌ๋ฅผ ํด์ผ ํ ๋๋ ๋ณ๋ช ์ ๋ถ์ฌ์ ์ฟผ๋ฆฌ๋ฅผ ํ๋ค.
{
hero(episode: EMPIRE) {
name
}
hero(episode: JEDI) {
name
}
}
[์ฝ๋] ์ด๋ฐ ์์ผ๋ก ์ค๋ณตํด ์ฟผ๋ฆฌํ ์ ์๋ค.
{
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}
[์ฝ๋] ์์ ์์๋ณผ ์ ์๋ ๋ณ๋ช ์ ๋ถ์ฌ์ฃผ๋ฉด ์ฟผ๋ฆฌํ ์ ์๋ค.
{
"data": {
"empireHero": {
"name": "Luke Skywalker"
},
"jediHero": {
"name": "R2-D2"
}
}
}
[์ฝ๋] ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ณผ ์ ์๋ค.
์์ ๊ฐ์ด ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ณ๋ช ์ ์ง์ ํ๋ฉด ํ ๋ฒ์ ์์ฒญ์ผ๋ก ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ์ป์ด๋ผ ์ ์๋ค.
โจ ์คํผ๋ ์ด์ ๋ค์(Operation name)
์ฌํ๊ป ์ฟผ๋ฆฌ์ ์ฟผ๋ฆฌ ๋ค์์ ๋ชจ๋ ์๋ตํ๋ ์ถ์ฝํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ต๋๋ค๋ง, ์ค์ ์ฑ์์๋ ์ฝ๋๋ฅผ ๋ชจํธํ์ง ์๊ฒ ์์ฑํ๋ ๊ฒ์ด ์ค์ํ๋ค.
query HeroNameAndFriends {
hero {
name
friends {
name
}
}
}
[์ฝ๋] ์ด๋ฐ ์์ผ๋ก query keyword์ query name์ ์์ฑํ๋ค.
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
์์ query๋ ์คํผ๋ ์ด์ ํ์ ์ด๋ค. ์คํผ๋ ์ด์ ํ์ ์๋ query ๋ฟ๋ง ์๋๋ผ mutation, subscription, describes ๋ฑ์ด ์๋ค. ์ฟผ๋ฆฌ๋ฅผ ์ฝ์์ผ๋ก ์์ฑํ์ง ์๋ ํ ์ด๋ฐ ์คํผ๋ ์ด์ ํ์ ์ ๋ฐ๋์ ํ์ํ๋ค. ์คํผ๋ ์ด์ ๋ค์์ ์์ฑํ ๋๋ ์คํผ๋ ์ด์ ํ์ ์ ๋ง๋ ์ด๋ฆ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์ด ์ข๋ค.
โจ ๋ณ์(Variables)
์ฌํ๊ป ๊ณ ์ ๋ ์ธ์๋ฅผ ๋ฐ์ ์ฟผ๋ฆฌํ์ง๋ง, ์ค์ ์ฑ์ ์ฌ์ฉํ ๋๋ ๊ณ ์ ๋ ์ธ์๋ฅผ ๋ฐ๋ ๊ฒ๋ณด๋ค๋ ๋์ ์ผ๋ก ์ธ์๋ฅผ ๋ฐ์ ์ฟผ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์์ด๋ค. ๋ณ์๋ ๊ทธ๋ฐ ์ธ์๋ค์ ๋์ ์ผ๋ก ๋ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}
[์ฝ๋] ๋ณ์๋ฅผ ์จ์ ์์ฑ๋ ์ฟผ๋ฆฌ
์คํผ๋ ์ด์ ๋ค์ ์์ ๋ณ์๋ฅผ $๋ณ์ ์ด๋ฆ: ํ์ ํํ ๋ก ์ ์ํ๋ค. ์์ ์์์ฒ๋ผ $episode: Episode ์ผ ๋, ๋ค์ !๊ฐ ๋ถ๋๋ค๋ฉด episode๋ ๋ฐ๋์ Episode์ฌ์ผ ํ๋ค๋ ๋ป์ด๋ค. !๋ ์ต์ ๋ํ ์ฌํญ์ด๋ค.
โจ ๋ฎคํ ์ด์ (mutation, ๋ฐ์ดํฐ ์์ )
GraphQL์ ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ์ ์ค์ ์ ๋๊ณ ์์ง๋ง ์๋ฒ์ธก ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ธฐ๋ ํ๋ค.
REST API์์ GET ์์ฒญ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์๊ณ , POST ํน์ PUT ์์ฒญ์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ GraphQL๋ ์ ์ฌํ๋ค. GraphQL์ mutation์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ์ธก ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค.
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
โจ ์คํค๋ง/ํ์ (Schema/Type)
GraphQL ์คํค๋ง์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์๋ ์๋น์ค์์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฐ์ฒด์ ์ข ๋ฅ, ๊ทธ๋ฆฌ๊ณ ํฌํจํ๋ ํ๋๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด ์ ํ์ด๋ค.
type Character {
name: String!
appearsIn: [Episode!]!
}
- Character๋ GraphQL ๊ฐ์ฒด ํ์ ์ด๋ฉฐ, ์ฆ ํ๋๊ฐ ์๋ ํ์ ์์ ์๋ฏธํ๋ค. ์คํค๋ง์ ์๋ ๋๋ถ๋ถ์ ํ์ ์ ๊ฐ์ฒด ํ์ ์ด๋ค.
- name ๊ณผ appearIn ์ Character ํ์ ์ ํ๋ ์ด๋ค. ์ฆ name ๊ณผ appearIn ์ GraphQL ์ฟผ๋ฆฌ์ Character ํ์ ์ด๋์๋ ์ฌ์ฉํ ์ ์๋ ํ๋์ด๋ค.
- String์ ๋ด์ฅ๋ ์ค์นผ๋ผ ํ์ ์ค ํ๋์ด๋ค. ์ด๋ ๋จ์ผ ์ค์นผ๋ผ ๊ฐ์ฒด๋ก ํ์ธ๋๋ ์ ํ์ด๋ฉฐ ์ฟผ๋ฆฌ์์ ํ์ ์ ํ์ ๊ฐ์ง ์ ์๋ค. ์ค์นผ๋ผ ํ์ ์๋ ID, Int๋ ์๋ค.
- !๊ฐ ๋ถ๋๋ค๋ฉด ์ด ํ๋๋ nullableํ์ง ์๊ณ ๋ฐ๋์ ๊ฐ์ด ๋ค์ด์จ๋ค๋ ์๋ฏธ์ด๋ค. ์ด๊ฒ์ ๋ถ์ฌ ์ฟผ๋ฆฌํ๋ค๋ฉด ๋ฐ๋์ ๊ฐ์ ๋ฐ์ ์ ์์ ๊ฒ์ด๋ ์์์ ํ ์ ์๋ค.
- [ ]๋ ๋ฐฐ์ด์ ์๋ฏธํ๋ค. ๋ฐฐ์ด์๋ !๊ฐ ๋ถ์ ์ ์๋ค. ์ฌ๊ธฐ์๋ ! ์ด ๋ค์ ๋ถ์ด ์์ด null ๊ฐ์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ํญ์ 0๊ฐ ์ด์์ ์์๋ฅผ ํฌํจํ ๋ฐฐ์ด์ ๊ธฐ๋ํ ์ ์๊ฒ ๋๋ค.
โจ ๋ฆฌ์กธ๋ฒ(Resolver)
์์ฒญ์ ๋ํ ์๋ต์ ๊ฒฐ์ ํด์ฃผ๋ ํจ์๋ก์จ GraphQL์ ์ฌ๋ฌ ๊ฐ์ง ํ์ ์ค Query, Mutation, Subscription๊ณผ ๊ฐ์ ํ์ ์ ์ค์ ์ผํ๋ ๋ฐฉ์ ์ฆ ๋ก์ง์ ์์ฑํ๋ค. ๋ค์ ๋งํด ์์ ๊ฐ์ด ์คํค๋ง๋ฅผ ์ ์ํ๋ฉด ๊ทธ ์คํค๋ง ํ๋์ ์ฌ์ฉ๋๋ ํจ์์ ์ค์ ํ๋์ Resolver์์ ์ ์ํ๋ค. ๋ํ ์ด๋ฌํ ํจ์๋ค์ด ๋ชจ์ฌ ์๊ธฐ ๋๋ฌธ์ ๋ณดํต Resolvers๋ผ ๋ถ๋ฅธ๋ค.
const db = require("./../db")
const resolvers = {
Query: { // **Query :** ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (REST ์ GET ๊ณผ ๋น์ท)
getUser: async (_, { email, pw }) => {
db.findOne({
where: { email, pw }
}) ... // ์ค์ ๋๋น์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ์์ฑ.
...
}
},
Mutation: { // **Mutation :** ์ ์ฅ๋ ๋ฐ์ดํฐ ์์ ํ๊ธฐ ( Create , Update , Delete )
createUser: async (_, { email, pw, name }) => {
...
}
}
Subscription: { // **Subscription :** ์ค์๊ฐ ์
๋ฐ์ดํธ
newUser: async () => {
...
}
}
};
GraphQL์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ ์ง์ ๊ตฌํํด์ผ ํ๋๋ฐ ์ด์ ๊ฐ์ ์์ (e.g. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ, ์๊ฒฉ API ์์ฒญ)์ Resolver๊ฐ ๋ด๋นํ๊ฒ ๋๋ค.
'๐ป Development > ๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ต์ ํ] Optimization (0) | 2023.03.01 |
---|---|
[Testing] TDD (0) | 2023.03.01 |
[์ปดํจํฐ ๊ณตํ] ๊ฐ๋น์ง ์ปฌ๋ ์ (0) | 2023.03.01 |
[์ปดํจํฐ ๊ณตํ] ๋ฌธ์์ด๊ณผ ๊ทธ๋ํฝ (0) | 2023.03.01 |
[์ปดํจํฐ ๊ณตํ] ์ด์์ฒด์ (OS) (0) | 2023.03.01 |