[API]GraphQL
๐ GraphQL
GraphQL๐
: ํ์ด์ค๋ถ์์ ๊ฐ๋ฐํด ์คํ ์์ค๋ก ์ ๊ณต๋ ์ฟผ๋ฆฌ ์ธ์ด
- Server API๋ฅผ ํตํด ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ Query Language
โ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด
- ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํด ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์ธ์ด
- GraphQL์ ์ ์
- ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋ํ ํํ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค
- ์ผ๋์ผ๋ก ์ฐ๊ฒฐ๋ ๊ด๊ณ๋ ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ ๊ด๊ณ๋ ๋ชจ๋ ํฌํจ
(ํธ๋ฆฌ์ ๊ทธ๋ํ ๋ชจ๋ ๋
ธ๋์ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ!)
โ GraphQL์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ํธ๋ฆฌ ๊ตฌ์กฐ์ JSON ๋ฐ์ดํฐ๋ฅผ ์๋ต์ผ๋ก ์ ์ก
- GraphQL์ ํน์ง
- HTTP๋ฅผ ํตํด API ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์
- ์๋ต์ ๋ฐ์ ์, ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ฅผ JSON ํ์์ผ๋ก ๋ฐ์
- ์๋ฒ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๊ฐ ํ๋์ ๋์ํ๋ resolver ํจ์๋ก ๊ฐ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์
- GraphQL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กฐํ ๋์ schema๊ฐ ์ ํจํ์ง ๊ฒ์ฌ
๐ก GraphQL vs REST API
Rest API์ ํ๊ณ๐ง
- Overmatch: ํ์ ์๋ ๋ฐ์ดํฐ๊น์ง ์ ๊ณต
- ์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ์ ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ๋ฐ์์ผ ๋จ
- Underfetch: endpoint๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ถฉ๋ถํ ์ ๊ณตํ์ง ๋ชปํจ
- ์ฌ๋ฌ resource์ ์ ๊ทผ ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์๋ํฌ์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ณด๋ด์ผ ํจ
- ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ์ํธํฌ์ธํธ ๋ณ๊ฒฝ ๋๋ ๋ฐ์ดํฐ ์์ ์ด ํ์
- ์์์ ํฌ๊ธฐ์ ํํ๋ฅผ ์๋ฒ์์ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ฐ์ดํฐ์ ํํ ๊ฒฐ์ ๋ถ๊ฐ
Rest API์ GraphQL์ ์ฐจ์ด์
| Rest API | GraphQL |
---|
Resource์ ๋ํ ํํ ์ ์์ ๋ฐ์ดํฐ ์์ฒญ ๋ฐฉ๋ฒ ์ฐ๊ฒฐ ์ฌ๋ถ | ์ฐ๊ฒฐ | ๋ถ๋ฆฌ |
Resource์ ํฌ๊ธฐ์ ํํ ๊ฒฐ์ | ์๋ฒ | ์๋ฒ: Resource์ ๋ํ ์ ๋ณด ์ ์ ํด๋ผ์ด์ธํธ: ์์ฒญ ์ ํ์ํ ํฌ๊ธฐ์ ํํ ๊ฒฐ์ |
Resource์ ์์
์ ํ ๊ฒฐ์ ๋ฐฉ๋ฒ | Resource: URI ์์
์ ์ ํ: Method | Resource: GraphQL Schema ์์
์ ์ ํ: Query, Mutation ํ์
|
์ฌ๋ฌ Resource์ ์ ๊ทผ ์ ์์ฒญ ํ์ | ์ฌ๋ฌ ๋ฒ์ ์์ฒญ ํ์ | ํ ๋ฒ์ ์์ฒญ ํ์ |
์์
์ฒ๋ฆฌ ๋ฐฉ์ | ํด๋น endpoint์ ์ ์๋ ํธ๋ค๋ง ํจ์๋ฅผ ํธ์ถ | ์์ฒญ ๋ฐ์ ๊ฐ ํ๋์ ๋ํ resolver๋ฅผ ํธ์ถ |
GraphQL์ ์ฅ๋จ์
- GraphQL์ ์ฅ์ ๐
- ํ๋์ endpoint ์์ฒญ
/graphql
์ด๋ผ๋ ํ๋์ endpoint๋ก ์์ฒญ์ ๋ฐ๊ณ ์์ฒญ์ ๋ฐ๋ผ query, mutation์ resolverํจ์๋ก ์ ๋ฌํ์ฌ ์์ฒญ์ ์๋ต
- ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์
POST
๋ฉ์๋ ์ฌ์ฉ
- under&overfetchingโ
- ํ๋์ endpoint์์ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ API์ ์์ฒญ&์๋ต ๊ฐ๋ฅ
- ๊ฐ๋ ฅํ playground
- graphql ์๋ฒ ์คํ ์, playground๋ผ๋ GUI๋ฅผ ์ด์ฉํด resolver์ schema๋ฅผ ํ ๋์ ๋ณด๊ณ ํ
์คํธ ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์๋ ์๋ฒ์ ์ง์ฅ ์์
- GraphQL์ ๋จ์ ๐
- REST API์ ์น์ํ ๊ฐ๋ฐ์๋ ํ์ตํ๋ ๋ฐ ์๊ฐ์ด ํ์
- ์บ์ฑ์ด REST๋ณด๋ค ํจ์ฌ ๋ณต์ก
- ๊ฐ ๋ฉ์๋์ ๋ฐ๋ฅธ ์บ์ฑ์ ์ง์๋ฐ์ ์ ์์
โ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด Apollo ์์ง์ ์บ์ฑ๊ณผ ์์ ์ฟผ๋ฆฌ ๋ฑ์ด ๋ฑ์ฅ
- ๊ณ ์ ๋ ์๋ต๋ง ํ์ํ ๊ฒฝ์ฐ Query๋ก ์ธํด ์์ฒญ์ ํฌ๊ธฐ๊ฐ ์ปค์ง
๐ GraphQL
GraphQL Keywords
- Query
: ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(REST API์ GET๊ณผ ์ ์ฌ)
- Mutation
: ์ ์ฅ๋ ๋ฐ์ดํฐ ์์ ํ๊ธฐ
- Create: ์๋ก์ด ๋ฐ์ดํฐ ์์ฑ
- Update: ์๋ก์ด ๋ฐ์ดํฐ ์์
- Delete: ๊ธฐ์กด์ ๋ฐ์ดํฐ ์ญ์
- Subscription
: ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ฒ๊ฐ ๋์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก
- ๋ฐํ/๊ตฌ๋
๋ชจ๋ธ์ ๋ฐ๋ฆ
- ์ด๋ฒคํธ ๊ตฌ๋
์, ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ WebSocket์ ๊ธฐ๋ฐ์ผ๋ก ์ง์์ ์ธ ์ฐ๊ฒฐ์ ํ์ฑํ๊ณ ์ ์ง
โ ๊ทธ ํ ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ฒ๋ ๋์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ํธ์
์ฟผ๋ฆฌ(query, ๋ฐ์ดํฐ ์กฐํ)
- ํ๋(Riled): ๊ฐ์ ธ์ค๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ์คํค๋ง์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ
- ์ ๋ฌ์ธ์(Arguments): ํ๋์ ์ธ์ ์ ๋ฌ ์, ์ฟผ๋ฆฌ์ ํ๋ ๋ฐ ์ค์ฒฉ ๊ฐ์ฒด์ ์ ๋ฌํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ง ๋ฐ์์ฌ ์ ์์
- ๋ณ๋ช
(Aliases): ํ๋ ์ด๋ฆ ์ค๋ณต ์ฌ์ฉ ์, ๋ณ๋ช
์ ๋ถ์ฌ ์ฟผ๋ฆฌ
- ์คํผ๋ ์ด์
๋ค์(Operation name): ์คํผ๋ ์ด์
ํ์
์ ๋ง๋ ์ด๋ฆ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ ํฉ
- ์คํผ๋ ์ด์
ํ์
:
query
, mutation
, subscription
, describes
๋ฑ
- ๋ณ์(Varibles): ์ธ์๋ค์ ๋์ ์ผ๋ก ๋ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉ
- ์คํผ๋ ์ด์
๋ค์ ์์
$๋ณ์ ์ด๋ฆ: ํ์
ํํ
๋ก ์ ์
!
์ optionalํ ์ฌํญ์ผ๋ก ๋ณ์ ์ด๋ฆ
์ ๋ฐ๋์ ํ์
ํํ
์ฌ์ผ ํ๋ค๋ ์๋ฏธ
๋ฎคํ
์ด์
(mutation, ๋ฐ์ดํฐ ์์ )
- ์๋ฒ ์ธก ๋ฐ์ดํฐ ์์ ์ ์ฌ์ฉ
mutation
์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์
์คํค๋ง/ํ์
(Schema/Type)
- ์ค์นด๋ง์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์
- ์๋น์ค์์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฐ์ฒด์ ์ข
๋ฅ
- ํฌํจํ๋ ํ๋๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด ์ ํ
๋ฆฌ์กธ๋ฒ(Resolver)
- ์์ฒญ์ ๋ํ ์๋ต์ ๊ฒฐ์ ํด ์ฃผ๋ ํจ์
- Query, Mutation, Subscription๊ณผ ๊ฐ์ ํ์
์ ์ค์ ์ผํ๋ ๋ฐฉ์(๋ก์ง)์ ์์ฑ
- ์คํค๋ง ์ ์ ์ ์คํค๋ง ํ๋์์ ์ฌ์ฉ๋๋ ํจ์์ ์ค์ ํ๋์ Resolver์์ ์ ์
<์ค๋์ ์ผ๊ธฐ>
๋ชจ๋ ์ผ์ด ๊ทธ๋ ์ง๋ง(...ใ
) ์๋ฒ ์ธก์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์์
์ ํนํ ๊ธด์ฅ๋๋ ์ผ์ธ ๊ฒ ๊ฐ๋ค,,, ์ด๋ฒ ์ ๋ ์ญ์ ์ฌ๋ฌ ์ํ์ฐฉ์ค ๋์ GraphQL๋ก github ์๋ฒ์์ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์
์ ์ํํ๋๋ฐ ๊ฐ์ ธ์ค๋ ๊ฒ์๋ ์ฑ๊ณตํ์ง๋ง ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด๋ณด๋ ๊ฒ์ ์คํจํ๋ค. ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง์ ๋ํ ์ฐ์ต์ ์ฌ๋ฌ ๋ฐฉ๋ฉด์ผ๋ก ์๋ํด๋ณด๋ ๊ฒ์ด ํ์ํ ๊ฒ ๊ฐ๋ค!