GraphQL은 클라이언트와 서버 간의 데이터 통신을 위한 쿼리 언어입니다. 이는 RESTful API보다 훨씬 유연하며 효율적인 데이터 요청을 가능하게 합니다. GraphQL Subscriptions은 이러한 GraphQL의 기능 중 하나로 실시간 데이터 업데이트를 가능하게 해줍니다. 자바스크립트를 사용하여 GraphQL Subscriptions를 구현하기 위해서는 서버 디자인 패턴을 알아야 합니다.
Pub-Sub 패턴
GraphQL Subscriptions를 구현하기 위한 가장 일반적인 서버 디자인 패턴은 Pub-Sub (Publish-Subscribe) 패턴입니다. 이 패턴은 이벤트 기반 아키텍처에서 사용되며, 메시지를 발행하는 쪽 (Publisher)과 해당 메시지를 구독하는 쪽 (Subscriber)로 나누어집니다.
GraphQL Subscriptions에서는 GraphQL 요청이 발생할 때마다 서버가 해당 요청을 받아들이고, 해당 데이터 변경 사항이 발생하면 이를 구독중인 클라이언트에게 실시간으로 알려줍니다. 이를 위해 Pub-Sub 패턴을 사용하여 데이터 변경 사항을 발행하고, 구독 중인 클라이언트에게 해당 변경 사항을 전달합니다.
Pub-Sub 라이브러리 사용
GraphQL Subscriptions를 구현하기 위해서는 Pub-Sub 라이브러리를 사용해야 합니다. 가장 많이 사용되는 Pub-Sub 라이브러리 중 하나는 Apollo Server Pub-Sub입니다. 이 라이브러리는 Apollo Server에 내장되어 있으며, 쉽게 GraphQL Subscriptions를 구현할 수 있도록 도와줍니다.
Apollo Server Pub-Sub를 사용하여 GraphQL Subscriptions를 구현하려면 다음과 같은 단계를 따르면 됩니다:
- Pub-Sub 객체 생성: Apollo Server Pub-Sub를 사용하여 Pub-Sub 객체를 생성합니다.
import { PubSub } from 'apollo-server';
const pubsub = new PubSub();
- Subscription Resolver 구현: GraphQL Schema에서 Subscription Resolver를 구현합니다. Subscription Resolver는 Pub-Sub 객체를 사용하여 데이터 변경 사항을 구독 중인 클라이언트에게 전달하는 역할을 합니다.
const resolvers = {
Subscription: {
somethingChanged: {
subscribe: () => pubsub.asyncIterator(['SOMETHING_CHANGED']),
},
},
};
- 데이터 변경 시 Pub-Sub 호출: 데이터의 변경이 발생할 때마다 Pub-Sub 객체를 사용하여 해당 데이터 변경 사항을 발행합니다.
pubsub.publish('SOMETHING_CHANGED');
- 클라이언트에서 구독: 클라이언트는 GraphQL Subscription을 통해 해당 데이터 변경 사항을 구독할 수 있습니다.
subscription {
somethingChanged {
// 구독할 데이터 필드
}
}
이렇게 Pub-Sub 패턴과 Apollo Server Pub-Sub 라이브러리를 사용하여 자바스크립트로 GraphQL Subscriptions를 구현할 수 있습니다.
결론
GraphQL Subscriptions를 위한 서버 디자인 패턴으로 Pub-Sub 패턴을 사용하는 것은 매우 효과적입니다. Pub-Sub 라이브러리인 Apollo Server Pub-Sub를 활용하면 손쉽게 GraphQL Subscriptions를 구현할 수 있습니다. 이를 통해 실시간 데이터 업데이트와 실시간 상호작용을 가능하게 하여 뛰어난 사용자 경험을 제공할 수 있습니다.
참고 문헌: Apollo Server Pub-Sub