GraphQL ์ด๋?
GraphQL ์ Facebook ์์ ๊ฐ๋ฐ๋ ์คํ์์ค ๋ฐ์ดํฐ ์ฟผ๋ฆฌ์
API๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฌ์ฉํ ์ ์์
GraphQL ์ ์ฌ์ฉํ ๊น?
๊ธฐ์กด REST API ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด์ ์ฌ์ฉํจ
GraphQL ์์ฒญ๋ฐฉ์
- REST API : ํน์ ์๋ํฌ์ธํธ(URL)์ ์์ฒญ์ ๋ณด๋ธ๋ค.
- GraphQL : ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ๋ก ์์ฒญ (ํ๋ฒ์ ์์ฒญ ๊ฐ๋ฅ)
GraphQL ๋ฐ์ดํฐ ๋ฐํ ๋ฐฉ์
- REST API : ๋ถํ์ํ ๋ฐ์ดํฐ๊น์ง ๊ณผ๋ค์์ฒญ(Over-fetching) , ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํด์ผ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ์ ์๋ ๋ถ์กฑํ ์์ฒญ(Under-fetching)
- GraphQL : ์ ํํ๊ฒ ๋ฐ์ดํฐ ์์ฒญ ๊ฐ๋ฅ, ํ๋ฒ์ ์์ฒญ์ผ๋ก ์ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ ํฌํจ ๊ฐ๋ฅ
GraphQL ์๋ํฌ์ธํธ ๊ตฌ์กฐ
- REST API : ๊ฐ๊ฐ ์์๋ง๋ค ๋ณ๋์ ์๋ํฌ์ธํธ ์ ๊ณต
- GraphQL : ๋จ์ผ ์๋ํฌ์ธํธ๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ (์๋ํฌ์ธํธ ๋จ์ผํ)
์คํค๋ง, ๋ฐ์ดํฐ ๊ด๋ฆฌ
- REST API : ์คํค๋ง ์ ์์์ด ์๋ํฌ์ธํธ๋ณ๋ก ๋ฐ์ดํฐ ์ค๊ณ (๋ฐ์ดํฐ๊ฐ ๊ด๊ณ ํํ ์ด๋ ค์, ์๋ฒ๊ฐ ๋ฐํํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํจ)
- GraphQL : ๋ช ํํ ์คํค๋ง๋ฅผ ํตํด ๋ฐ์ดํฐ๊ตฌ์กฐ๋ฅผ ์ ์ธ์ ์ผ๋ก ์ ์ํจ (ํ์ ๊ฐ ๊ด๊ณ๋ฅผ ๋ช ํํ ๋ชจ๋ธ๋ง ๊ฐ๋ฅ, ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ง์ ์ ์ํ ์ ์์)
์คํค๋ง
- ๋ฐ์ดํฐ ๊ตฌ์กฐ, ๊ด๊ณ ์ค๋ช
ํ๋ ์ฒญ์ฌ์ง
`type Creator { id : ID!, name: String }`
์ํฐํฐ
- ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ฒด
`{ "id" : "1", "name" : "anna"}`
ํด๋ผ์ด์ธํธ
GraphQL ์ฟผ๋ฆฌ(Query)๋ฅผ ์์ฑํ๊ณ ์๋ฒ๋ก ๋ณด๋
POST /graphql HTTP/1.1
Host: example.com
Content-Type: application/json
{
"query": "query getCreator($id: String!) { creator(id: $id) { id name videos { url } } }",
"variables": {
"id": "1"
}
}
์ด๋ฐ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ํฌํจํด์ POST ๋ก ๋๊ธด๋ค.
์๋ฒ
1. ํด๋ผ์ด์ธํธ ์์ฒญ์ ์์ ํจ :
2. ์ฟผ๋ฆฌ ํ์ฑ or ๊ฒ์ฆ : ์ฟผ๋ฆฌ ํ๋ ํ์ธ or ์๋ชป๋ ์์ฒญ(์คํค๋ง์ ์๋ ํ๋ ์์ฒญ) ๊ฒ์ฆ
3. ์คํค๋ง, ๋ฐ์ดํฐ ๋งคํ : ์คํค๋ง์ ์ ์๋ ํ์ , ์์ฒญ ํ๋๋ฅผ ๋งคํํ๊ณ
4. ๋ฆฌ์กธ๋ฒ ์คํ : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ์ํด resolver ๋ฅผ ์คํํจ
5. ๋ฐ์ดํฐ ๋ฐํ(JSON) : ๋ฐ์ดํฐ ์กฐํ ํ ์์ฒญํ ํ๋์๋ง๊ฒ JSON ํ์ ์ผ๋ก ๋ฐํํจ
Type Definition : `type`
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์
Query: `type Query`
๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉํ๋ ์๋ํฌ์ธํธ ์ ์
Mutation: `type Mutation`
๋ฐ์ดํฐ๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ ๋ ์ฌ์ฉํ๋ ์๋ํฌ์ธํธ ์ ์
Scalar Types
๊ธฐ๋ณธ ์ค์นผ๋ผ ํ์ ์ ๊ณต
- Int: ์ ์
- Float: ๋ถ๋์์์ ์ซ์
- String: ๋ฌธ์์ด
- Boolean: ์ฐธ/๊ฑฐ์ง ๊ฐ
- ID: ๊ณ ์ ์๋ณ์ (๋ณดํต ๋ฌธ์์ด ํํ๋ก ์ฌ์ฉ)
Non-Null : `!`
ํ์ ๋ค์ ! ๋ฅผ ๋ถ์ด๋ฉด ํ๋ ๊ฐ์ด ํ์
Relationships : ๊ด๊ณ
ํ์ ๊ฐ ๊ด๊ณ ์ง์ ๊ฐ๋ฅ
์ฃผ์ : `#`
ํ ์ค ์ฃผ์๋ง ๊ฐ๋ฅํจ
๋ฑ๋ฑ ์ด์ธ์๋ ๋ฌธ๋ฒ์ ๋ง์.
์์
type Creator {
id: ID!
name: String
subcribers: Int
videos: [Video]
}
type Video {
url: String!
creator: Creator
}
type Query {
videos: [Video] # ๋ชจ๋ Video ๊ฐ์ฒด ๋ฐฐ์ด ๋ฐํ
creator(id String!): Creator # ํน์ Creator ๋ฐํ , id ํ์๋ก ์ ๋ฌ
}
type Mutation {
createVideo(url: String): Video
deleteVideo(url: String): String
}
๋ชจ๋ Video ์กฐํ (๋ฐ์ดํฐ ์์ฒญ)
query getVideos {
videos {
url
creator {
id
name
}
}
}
Mutation ์์ (๋ฐ์ดํฐ ๋ณ๊ฒฝ)
mutation createVideo($url: String!) {
createVideo(url: $url) {
url
creator {
id
name
}
}
}
๋ฐ์ดํฐ ์์ฒญ,๋ณ๊ฒฝ์์ ์ Query ์ Mutation ์ผ๋ก ๋๋๊น?
- ๋ช ํํ ์ญํ ๋ถ๋ฆฌ
- API ์์ธก ๊ฐ๋ฅ์ฑ ์ ์ง
Query (์ฝ๊ธฐ/์กฐํ) : ์ฌ๋ฌ๋ฒ ํธ์ถํด๋ ์๋ณํจ
Mutation (์ฐ๊ธฐ/์์ ) : ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ฉด ์ค๋ณต ์์ ๋ฐ์ํ ์ ์์
๋ถ๋ฆฌํจ์ผ๋ก์จ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ค๊ณํ๊ธฐ ์ํจ์ !