[nodejs] Federation을 사용한 GraphQL 스키마 합성 방법

GraphQL은 여러 개의 서비스에서 하나의 통합된 API를 제공하기 위해 여러 스키마를 합성하는 기능을 제공합니다. 이번 블로그 포스트에서는 Apollo Federation을 사용하여 GraphQL 스키마를 합성하는 방법을 알아보겠습니다.

1. Apollo Federation이란?

Apollo Federation은 여러 독립적인 GraphQL 서비스를 통합하는데 사용되는 도구 세트입니다. 이를 통해 서로 다른 스키마를 가진 여러 서비스를 단일 API로 통합할 수 있습니다.

2. Federation을 사용한 GraphQL 스키마 합성

GraphQL 스키마를 합성하는 과정은 아래와 같습니다.

2.1 각 서비스에서 스키마 정의

먼저 각각의 서비스에서 해당 서비스가 제공하는 타입, 쿼리, 뮤테이션 등을 스키마로 정의합니다. 예를 들어, 사용자 서비스에서는 User 타입과 관련된 쿼리와 뮤테이션을 정의하고, 상품 서비스에서는 Product 타입과 관련된 쿼리와 뮤테이션을 정의합니다.

# User 서비스의 스키마
type User {
  id: ID!
  name: String!
  # ...
}

type Query {
  user(id: ID!): User
  # ...
}

2.2 Gateway에서 스키마 합성

이후, Apollo Gateway를 사용하여 각 서비스의 스키마를 통합합니다. Gateway는 각 서비스의 스키마를 합쳐 하나의 통합된 스키마를 만들어주는 역할을 합니다.

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

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

2.3 API 서버에서 통합된 스키마 제공

마지막으로, Gateway를 사용하여 만들어진 통합된 스키마를 기반으로 GraphQL API 서버를 구축합니다. 그러면 모든 서비스의 기능을 단일 API로 접근할 수 있습니다.

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

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

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

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

3. 마치며

이렇게 Federation을 사용하여 여러 개의 GraphQL 서비스를 통합할 수 있습니다. Apollo Federation은 서로 다른 스키마를 가진 여러 서비스를 효율적으로 통합할 수 있는 강력한 도구입니다. GraphQL을 사용하여 마이크로서비스 아키텍처를 구축하는 개발자에게 많은 도움이 될 것입니다.

더 자세한 내용은 Apollo Federation 공식 문서에서 확인할 수 있습니다.