https://product.kyobobook.co.kr/detail/S000200019862, P32
query {
human(id: 1002) {
name
appearsIn
starships {
name
}
}
}
자바스크립트에서 리졸버 함수는 네 가지 인자인 obj, args, context, info를 가지는 콜백 함수로 구성됩니다.
const resolvers = {
Query: {
human(obj, args, context, info) {
return context.db.loadHumanById(args.id).then(
userData => new Human(userData)
);
}
}
Human: {
name(obj, args, context, info) {
return obj.name;
}
appearsIn(obj, args, context, info) {
return obj.appearsIn;
}
starships(obj, args, context, info) {
const { starshipIDs } = obj;
return context
.db
.findStarshipsByIds(starshipIDs)
.then(shop => {
return ship.map(
(ship) => new Starship(shipData)
);
});
}
Starship: {
name(obj, args, context, info) {
return obj.name;
}
}
}
}
human 리졸버 함수는 context에 존재하는 데이터베이스 접근 오브젝트(db)를 통해 loadHumanById라는 비동기 메서드를 호출하였고, userData를 획득한 이후 Human으로 재구성하여 반환하고 있습니다.
이제 Human 오브젝트를 반환하는 human(id: 1002) 필드가 리졸브되었으므로 스칼라값이 Human 오브젝트의 각 필드의 리졸버를 호출해 데이터를 가져오기 시작합니다.
Human 오브젝트가 리졸브된 뒤, GraphQL은 타입 시스템을 통해 Human 오브젝트가 어떤 필드를 갖고 있는지 미리 알고 있습니다. 순차적으로 name, apprearsIn, starships 필드의 리졸버를 호출하기 시작할 것입니다.
name과 appearsIn 필드의 경우, 간단하게 상위 오브젝트인 Human에서 곧바로 obj.name과 같이 접근하도록 구성할 수 있습니다. name 필드는 오브젝트 타입이 아닌 스칼라 이므로 여기서 추가적인 리졸버 호출은 일어나지 않습니다. 추가로, 대부분의 GraphQL 서버 라이브러리에서는 name과 같이 하위 필드가 없는 스칼라 필드의 경우 리졸버 작성을 생략하더라도 자동 생성 처리됩니다.
starships 리졸버 함수도 실행됩니다. findStarshipsByIds메서드 호출을 통해 데이터베이스로부터 반환된 우주선 데이터를 토대로 Starship 배열을 반환합니다. Starship은 오브젝트 타입이므로 이우 또 다시 Human에서 리졸브된 starships 배열의 각 Starship 오브젝트들에 대해 name 필드를 리졸브하는 순서로 나아갑니다.
모든 리졸버 호출이 마무리된 이후, GraphQL 엔진은 반환된 모든 데이터를 쿼리에서 요구한 것과 동일한 key-value 맴 형태로 구성하여 다음과 같이 JSON 형태로 반환합니다.
{
"data": {
"human": {
"name": "Han Solo",
"appearsIn": [
"NEWHOPE",
"EMPIRE",
"JEDI"
],
"starships": [
{ "name": "Millenium Falcon" },
{ "name": "Imperial shuttle" }
]
}
}
}