모든 user 이름을 보여주고 싶음. /users/ GET
users 에서 사용자 명만 주는게 아니라 성이나 프로필 사진도 줄거임. Database 에 내가 사용하지 않을 영역을 요청하는 방식은 비효율적. 처음 GET 을 쓸 때는 프로필사진과 성을 사용안하고 사용자명만 필요함. 나중에 필요할땐 부를텐디... 이걸 Over-fetching 이라 함. 내가 요청한 영역의 정보보다 더 많은걸 받음.
어떤 하나를 완성하기 위해 니가 부가적인 다른 Request를 할 때 발생함. 인스타그램에서 /feed/ /notifications/ /user1/ 3가지 요청이 가고나서야 앱이 시작됨. REST 에서 하나를 완성하려고 많은 소스를 요청함... 이것도 GraphQL 이 해결할 수 있는 문제임. 한 query 에서 원하는 정보만큼 받아올 수 있음. GraphQL 에는 URL 은 존재하지도 않음. 하나의 endPoint 만 있음.
GraphQL Backend에 보내는 쿼리
query {
feed {
comments
likeNumber
}
notifications {
isRead
}
user {
username
profilePic
}
}
Server 에서 보낸 JSON
{
feed: [
{
comments:1,
likeNumber:20
}
],
notifications: [
{
isRead: true
},
{
isRead: false
}
],
user: {
username: "nico",
profile: "http:"
}
}
이걸 GraphQL Backend 에 보내면 네가 요청한 정보들만 받을 수 있고 원하는 방식으로 조정할 수도 있음. API 로 조정하거나 여러가질 섞어서 모양을 바꾸거나 할 수 있음.
$ mkdir movieql
$ cd movieql
$ yarn init
// graphql 서버를 쉽게 만들 수 있는 startup 패키지?
$ yarn add graphql
$ yarn add graphql-yoga@alpha
// 엄청 감단하고 네가 파일을 수정할 때마다 서버를 재시작 해줌.
$ yarn global add nodemon
// babel 설치
yarn add @babel/cli --dev
yarn add @babel/core --dev
// preset 으로 env 를 설치. (가장 기본적으로 ES6 지원을 위한 preset 이라 보믄됨)
yarn add @babel/preset-env --dev
yarn add @babel/node --dev
echo '{"presets": ["@babel/preset-env"]}' > babel.config.json
package json 에서 nodemon 사용하고 babel-node 로 컴파일하는 script 추가
"scripts": {
"start": "nodemon --exec babel-node index.js"
},
yarn start
schema.graphql 파일에 사용자가 뭘할지 정의할 것임. 그중 하나는 Query (Database로 부터 정보를 가져옴) Mutation 은 Database, Memory 혹은 서버에서 데이터를 수정하는 것. GraphQL 은 이런 스펙과 서버에 이러한 유형들을 저장하고 씀. 어떤 Mutation, Query 를 쓸지 정의하는게 시작임.