GraphQL Federation은 여러 GraphQL 서비스를 단일 통합 그래프로 합치는 아키텍처 패턴이다. Apollo Federation이 표준 구현으로, 각 서비스가 자신의 스키마를 소유하면서 다른 서비스의 타입을 확장할 수 있다.
아키텍처
클라이언트
↓
Gateway (Apollo Router)
├── User Service (subgraph)
├── Product Service (subgraph)
└── Order Service (subgraph)
서브그래프 정의
graphql
# User Service
type User @key(fields: "id") {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
}
graphql
# Order Service - User 타입 확장
extend type User @key(fields: "id") {
id: ID! @external
orders: [Order!]!
}
type Order {
id: ID!
total: Float!
userId: ID!
}
구현 (Apollo)
javascript
// User Service
const { ApolloServer } = require('@apollo/server');
const { buildSubgraphSchema } = require('@apollo/subgraph');
const server = new ApolloServer({
schema: buildSubgraphSchema({ typeDefs, resolvers }),
});
// Resolver (다른 서비스에서 User 참조 시)
const resolvers = {
User: {
__resolveReference(reference, { dataSources }) {
return dataSources.usersAPI.getUser(reference.id);
},
orders: (user, _, { dataSources }) => {
return dataSources.ordersAPI.getOrdersByUser(user.id);
},
},
};
관련 개념