[nodejs] Apollo Federation을 사용한 마이크로서비스 아키텍처 구현

본 포스트에서는 Apollo Federation을 사용하여 마이크로서비스 아키텍처를 구현하는 방법에 대해 알아보겠습니다. Apollo Federation은 GraphQL 기반의 API 게이트웨이를 제공하며, 여러 개별적인 GraphQL 서비스를 통합하여 단일 엔드포인트로 노출할 수 있도록 도와줍니다.

마이크로서비스 아키텍처란?

마이크로서비스 아키텍처는 각각 독립적으로 배포 및 확장 가능한 작은 서비스들로 소통하는 애플리케이션 아키텍처를 말합니다. 이 아키텍처는 각 서비스가 특정 기능을 수행하기 위해 필요한 데이터와 로직을 격리시킴으로써 유연성과 확장성을 제공합니다.

Apollo Federation의 장점

Apollo Federation은 여러 개별 GraphQL 서비스를 통합함으로써 다음과 같은 장점을 제공합니다:

구현 단계

아래는 Apollo Federation을 사용하여 마이크로서비스 아키텍처를 구현하는 단계입니다:

1. 각 서비스의 GraphQL 스키마 정의

# 서비스 A의 스키마
type Query {
  # ...
}

type ServiceAEntity {
  # ...
}

# 서비스 B의 스키마
type Query {
  # ...
}

type ServiceBEntity {
  # ...
}

2. Federation 서버 구현

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

const typeDefs = `
  # Federation을 위한 directives 추가
  directive @key(fields: String) on OBJECT | INTERFACE

  # 각 서비스의 스키마 import
  extend type Query {
    serviceAEntity(id: ID!): ServiceAEntity
    serviceBEntity(id: ID!): ServiceBEntity
  }
`;

const resolvers = {
  Query: {
    // 각 서비스의 resolver 정의
  }
};

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

server.listen().then(({ url }) => {
  console.log(`Federation Gateway running at ${url}`);
});

3. 클라이언트에서의 사용

클라이언트는 단일 엔드포인트에 요청을 보내며, 필요한 데이터를 복수의 서비스에서 가져올 수 있습니다.

결론

Apollo Federation을 사용하면 각각 독립적인 GraphQL 서비스를 하나로 통합할 수 있어 마이크로서비스 아키텍처를 쉽게 구현할 수 있습니다. 향후 더 복잡한 아키텍처에서도 유연하게 확장할 수 있는 강력한 도구로써, Apollo Federation을 적극적으로 활용해보시기를 권장합니다.

공식 문서 바로 가기

이상으로 Apollo Federation을 사용한 마이크로서비스 아키텍처 구현에 대해 알아보았습니다. 감사합니다.