[nodejs] Apollo Federation을 사용한 분산 GraphQL 서비스 구축

분산 시스템은 많은 이점을 가지고 있지만, 분산 그래프 시스템을 구축하는 것은 복잡하고 어려운 작업일 수 있습니다. 이 글에서는 Apollo Federation을 사용하여 서비스 간의 데이터 그래프를 구축하는 방법에 대해 알아보겠습니다. Apollo Federation은 단일 GraphQL Gateway로 여러 서비스를 조합하여 하나의 완전한 그래프 API를 생성할 수 있도록 해줍니다.

1. Apollo Federation 소개

Apollo Federation은 여러 개별 GraphQL 서비스를 구성 요소로 사용하여 하나의 통합된 GraphQL API를 생성할 수 있는 도구입니다. 각 서비스는 독립적으로 개발하고 배포할 수 있으며, Gateway를 통해 조합됩니다.

1.1 Federation의 핵심 기능

2. Apollo Federation의 구성 요소

아래는 Apollo Federation을 구현하기 위해 필요한 구성 요소입니다.

3. Apollo Federation 사용하기

3.1 Gateway 설정

const { ApolloGateway } = require("@apollo/gateway");
const { ApolloServer } = require("apollo-server");

const gateway = new ApolloGateway({
  serviceList: [
    { name: "accounts", url: "http://localhost:4001" },
    { name: "reviews", url: "http://localhost:4002" },
  ],
});

const server = new ApolloServer({
  gateway,
  subscriptions: false,
});

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

3.2 Subgraph 설정

const { ApolloServer, gql } = require("apollo-server");
const { buildFederatedSchema } = require("@apollo/federation");

const typeDefs = gql`
  type Review @key(fields: "id") {
    id: ID
    body: String
    author: User
  }

  extend type User @key(fields: "id") {
    id: ID @external
    reviews: [Review]
  }
`;

const resolvers = {
  Review: {
    author(review) {
      return { __typename: "User", id: review.authorId };
    },
  },
};

const server = new ApolloServer({
  schema: buildFederatedSchema([{ typeDefs, resolvers }]),
});

server.listen({ port: 4002 }).then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

4. 결론

Apollo Federation을 사용하면 분산된 GraphQL 서비스를 통합하여 효율적으로 데이터 그래프를 구축할 수 있습니다. 이를 통해 각각의 서비스를 독립적으로 확장하고 유지보수할 수 있으면서도, 클라이언트에게 단일 진입점을 제공할 수 있습니다.

더 많은 정보를 원하시면 Apollo Federation 공식 문서를 참고하세요.

참고문헌: