[nodejs] Apollo Federation을 사용한 마이크로서비스 아키텍처 구현
본 포스트에서는 Apollo Federation을 사용하여 마이크로서비스 아키텍처를 구현하는 방법에 대해 알아보겠습니다. Apollo Federation은 GraphQL 기반의 API 게이트웨이를 제공하며, 여러 개별적인 GraphQL 서비스를 통합하여 단일 엔드포인트로 노출할 수 있도록 도와줍니다.
마이크로서비스 아키텍처란?
마이크로서비스 아키텍처는 각각 독립적으로 배포 및 확장 가능한 작은 서비스들로 소통하는 애플리케이션 아키텍처를 말합니다. 이 아키텍처는 각 서비스가 특정 기능을 수행하기 위해 필요한 데이터와 로직을 격리시킴으로써 유연성과 확장성을 제공합니다.
Apollo Federation의 장점
Apollo Federation은 여러 개별 GraphQL 서비스를 통합함으로써 다음과 같은 장점을 제공합니다:
- 통합된 스키마: 각 서비스의 스키마를 통합하여 클라이언트에게 단일 스키마를 노출함
- 단일 엔드포인트: 클라이언트는 단일 엔드포인트에 요청을 보내고, Federation이 각 서비스로 라우팅
구현 단계
아래는 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을 사용한 마이크로서비스 아키텍처 구현에 대해 알아보았습니다. 감사합니다.