아래 공식문서로 문법 및 전체적인 그림을 익히고,
노마드 코더 강의로 graph ql api 생성, 문서화 그리고 rest api를 graph ql로 마이그레이션하는 방법을 파악.
apollo-server
, graphql
, node-fetch
nodemon
Query
, Mutation
resolver에 사용될 type을 정의한다.
Query
, Mutataion
은 지정된 Type이다.typeDefs
를 활용해서 api response를 handling하는 resolver를 요구사항에 맞게 정의한다.
Query Resolver
, Mutataion Resolver
는 지정된 Resolver이다.Dynamic Resolver
또한 type 정의를 참고하여 작성할 수 있다.const typeDefs = gql`
type Query {
allMovies: [Movie!]!
allUsers: [User!]!
allTweets: [Tweet!]!
}
type Mutation {
postTweet(text: String!, userId: ID!): Tweet
deleteTweet(id: ID!): Boolean!
}
`
const resolvers = {
Query: {
// typeDefs와 이름이 반드시 같아야한다.
allTweets() {
return tweets;
},
...
},
Mutation: { ... }
}
func (root, { userId }) { ... }
User: {
// Dynamic Resolver
fullName({ firstName, lastName }) {
return `${firstName} ${lastName}`;
},
},
각 tweet과 User를 연결
let tweets = [
{
id: '1',
text: 'first one',
userId: '2',
},
{
id: '2',
text: 'second one',
userId: '1',
},
];
const typeDefs = gql`
type User {
id: ID!
username: String!
firstName: String!
lastName: String!
fullName: String!
}
type Tweet {
id: ID!
text: String!
author: User // NOTE: relationship definition
}
type Query {
allTweets: [Tweet!]!
}
`;
const resolvers = {
Query: {
allTweets() {
return tweets;
},
tweet(root, { id }) {
return tweets.find((tweet) => tweet.id === id);
},
},
Mutation: {
Tweet: {
author({ userId }) { // 첫번째 arg는 Tweet이 된다.
return users.find((user) => user.id === userId);
},
},
};
{
allTweets {
id
text
author {
fullName
}
}
}
allTweets
이 요청됨tweets
이 리턴됨- 각 tweet에서
author
가 요청됨tweets
에서author
가 없음을 알고, author resolver를 탐색함- author resolver에서 첫번째 argument로 tweet 데이터를 넘겨줌
- author resolver는
User
타입을 리턴함.users
에서fullName
이 없음을 알고, fullName resolver를 탐색함- fullName resolver에서 첫번째 argument로 user 데이터를 넘겨줌
- fullName resolver는 user 데이터를 가지고
fullName
을 만들어서 리턴함.
{
"data": {
"allTweets": [
{
"id": "1",
"text": "first one",
"author": {
"fullName": "Elon Musk"
}
},
{
"id": "2",
"text": "second one",
"author": {
"fullName": "inhye jeong"
}
}
]
}
}
const resolvers = {
Query: {
allMovies() {
return fetch('https://yts.mx/api/v2/list_movies.json')
.then((r) => r.json())
.then((json) => json.data.movies);
},
movie(_, { id }) {
return fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
.then((r) => r.json())
.then((json) => json.data.movie);
},
},
}
이렇게 처리하면, FE에서는 원하는 필드를 graph ql로 호출해서 사용할 수 있음.