이제부터 작성할 Resolver라는 로직은, 어떤 언어를 사용할 것인지에 따라 조금 달라질 수 있습니다(여기선 NodeJS 사용)
우선, resolver안의 변수명은 스키마를 작성할 당시의 변수이름과 반드시 동일해야합니다. GraphQL은 사용자가 Query type의 tweet field를 호출해서 하나의 트윗내용을 알아내고자 하는 경우에 resolvers의 Query로 들어가서 해당 field를 호출하는 방식이기 때문입니다.
그렇다는 건, 리턴 타입이 스키마에 작성된 스키마와 동일해야겠죠? 우리는 Query타입안에 tweet호출에 대해서는 null or Tweet 타입을 반환(Nullable Type)하도록 되어있습니다. 그러니까 resolvers의 tweet field는 null or Tweet 타입을 반환해줘야 합니다.
const resolvers = {
Query: {
tweet() {
console.log("I'm called");
// 혹은 Tweet타입의 값을 반환해줘야합니다.
return null;
}
}
}
JavaScript
복사
// 임시 사용(휘발성) 데이터
const tweets = [
{
id: "1",
text: "first one"
},
{
id: "2",
text: "second one"
}
];
const resolvers = {
Query: {
// 임시 데이터를 반환 : 원래라면, DB로부터 데이터를 가져오는 형태여야함
allTweets() {
return tweets;
}
tweet() {
console.log("I'm called");
// 혹은 Tweet타입의 값을 반환해줘야합니다.
return null;
}
}
}
JavaScript
복사
원래는 DB와 연동해서 데이터를 가져오고 그래야하지만, 지금은 그냥 메모리상의 데이터로 설정해서 사용합니다
로컬 서버를 실행해서 아폴로 스튜디오에서 allTweets를 실행해보시면,
{
{
id: "1",
text: "first one"
},
{
id: "2",
text: "second one"
}
}
JSON
복사
해당 구조로 반환되는 것을 알 수 있습니다
좀 전에 얘기했다시피 사용자가 Query type 내 allTweets field를 호출하면, GraphQL은 resolver 로직에서 Query type 내 allTweets의 이름을 가진 함수를 찾아가고, 해당 함수 내의 처리 이후 리턴값을 가져다준다의 동작 방식입니다
arguments
그럼 이번엔 인자가 있는 필드 내용도 살펴보겠습니다.
const typeDefs = gql`
type User {
id: ID!
username: String!
}
type Tweet {
id: ID!
text: String!
author: User!
}
type Query {
allTweets: [Tweet!]!
tweet(id: ID): Tweet
}
type Mutation {
postTweet(text: String!, userId: ID!): Tweet!
deleteTweet(id: ID!): Boolean!
}
`;
const resolvers = {
Query: {
allTweets() {
return tweets;
}
// resolvers function은 아폴로 서버가 해당 함수를 호출할때, 실은 어떤 arguments를 줍니다.
tweet(root, args) {
console.log(args);
return null;
}
}
}
GraphQL
복사
다시 로컬서버 아폴로 스튜디오에서 tweets("1")과 같이 인자값을 전달하고 실행하면, 리턴값은 null이지만 터미널의 콘솔창에는 { id: '1' } 이라고 표시됩니다.
유저가 arguments(query나 mutation에서 유저가 보낸 argument)를 줄때, 해당 arguments가 resolver function의 2번째 매개변수가 된다는 사실을 기억해주시면 될 것 같습니다. (root인자에 대해선 이후에 얘기해볼게요)
여기서 한 단계 발전시켜봅시다. 객체구조분해할당을 사용해볼게요.
// 임시 사용(휘발성) 데이터
const tweets = [
{
id: "1",
text: "first one"
},
{
id: "2",
text: "second one"
}
];
const resolvers = {
Query: {
allTweets() {
return tweets;
}
// 객체구조분해할당을 통해, 인자 내용 중 id값을 변수로 들고옵니다.
tweet(root, { id }) {
// 원래라면, DB에 접근해서 어떤 SQL 코드를 실행해야합니다만, 여기선 그냥 find를 사용할게요
return tweets.find(tweet => tweet.id === id) || null;
}
}
};
JavaScript
복사

