GraphQL과 타입스크립트로 개발하는 웹 서비스

오픈소스·2024년 9월 21일
0
post-thumbnail

https://product.kyobobook.co.kr/detail/S000200019862, P32

query {
  human(id: 1002) {
    name
    appearsIn
    starships {
      name
    }
  }
}

자바스크립트에서 리졸버 함수는 네 가지 인자인 obj, args, context, info를 가지는 콜백 함수로 구성됩니다.

  • obj는 이전(상위) 오브젝트를 의미합니다.
  • args는 전달된 인자입니다. human(id: 1002)의 경우, args는 { id: 1002 }와 같이 제공됩니다.
  • context는 모든 리졸버에 공통적으로 제공되는 중요한 문맥 정보 모음입니다. 여기에는 RDBMS 데이터베이스 액세스 오브젝트, 요청자의 로그인 정보, 캐시 DB 액세스 오브젝트 등 요청과 독립적으로 구성되어 사용되는 자원들이 포함될 수 있습니다. 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" }
      ]
    }
  }
}

0개의 댓글