이번편은 지난 Subscriptions를 활용한 실시간 애플리케이션에 이어서 GraphQL Subscriptions의 필터링 및 페이로드 변경과 Altair GraphQL Client를 이용한 테스트에 대해서 간략하게 소개하고 Subscriptions를 마무리 하고자 합니다.
GraphQL Subscriptions는 필터링 및 페이로드 변형을 통해 특정 조건에 맞는 이벤트만 전달하거나 데이터를 변형하여 클라이언트로 반환할 수 있습니다.
filter
옵션을 사용하여 특정 조건에 맞는 구독만을 허용할 수 있습니다. 필터링 함수의 매개변수는 다음과 같습니다.
payload
: 이벤트 발행 시 전달된 데이터 (예: pubSub.publish
의 두 번째 인자)variables
: 해당 구독에서 전달된 변수context
: GraphQL 요청의 컨텍스트아래 예제에서는 somethingChanged
이벤트에서 특정 ID를 가진 데이터만 구독하도록 필터링합니다.
import { Subscription, Resolver, Args } from '@nestjs/graphql';
import { PubSub } from 'graphql-subscriptions';
const pubsub = new PubSub();
@Resolver()
export class ExampleResolver {
@Subscription(returns => String, {
filter: (payload, variables, context) => {
// 이벤트 페이로드의 id가 구독 변수의 id와 일치하는 경우에만 true 반환
return payload.somethingChanged.id === variables.id;
},
})
somethingChanged(@Args('id') id: string) {
return pubsub.asyncIterator('SOMETHING_CHANGED');
}
}
코드 설명:
@Subscription
데코레이터:returns
: 반환할 데이터의 타입을 GraphQL에서 지정합니다. 예제에서는 String
타입을 사용했습니다.filter
: 특정 조건에 맞는 이벤트만 전달하기 위한 함수입니다.payload
: 이벤트 페이로드로, 여기서는 somethingChanged
객체가 전달됩니다.variables
: 해당 구독에서 전달된 id
변수입니다.context
: GraphQL 요청의 컨텍스트로, 사용자의 인증 정보 등이 포함될 수 있습니다.somethingChanged
메서드:asyncIterator
를 반환합니다.SOMETHING_CHANGED
이벤트를 구독합니다.resolve
옵션을 사용하여 이벤트 페이로드를 변형하여 클라이언트에 반환할 수 있습니다.
아래 예제에서는 somethingChanged
이벤트에서 반환된 데이터를 클라이언트가 원하는 형태로 변형합니다.
import { Subscription, Resolver } from '@nestjs/graphql';
import { PubSub } from 'graphql-subscriptions';
const pubsub = new PubSub();
@Resolver()
export class ExampleResolver {
@Subscription(returns => String, {
resolve: value => value.transformedData, // value 객체에서 원하는 데이터를 변형하여 반환
})
somethingChanged() {
return pubsub.asyncIterator('SOMETHING_CHANGED');
}
}
코드 설명:
@Subscription
데코레이터:returns
: 반환할 데이터의 타입을 지정합니다. 예제에서는 String
타입을 사용했습니다.resolve
: 이벤트 페이로드를 변형하기 위한 함수로, 원하는 데이터를 반환합니다.value
: pubSub.publish
를 통해 발행된 이벤트 페이로드로, 여기서는 value.transformedData
를 반환합니다.필터링과 페이로드 변형을 함께 사용하여 이벤트를 필터링하고, 원하는 형태로 데이터를 변형할 수 있습니다.
import { Subscription, Resolver, Args } from '@nestjs/graphql';
import { PubSub } from 'graphql-subscriptions';
const pubsub = new PubSub();
@Resolver()
export class ExampleResolver {
@Subscription(returns => String, {
filter: (payload, variables) => {
return payload.somethingChanged.id === variables.id;
},
resolve: value => value.transformedData,
})
somethingChanged(@Args('id') id: string) {
return pubsub.asyncIterator('SOMETHING_CHANGED');
}
}
코드 설명:
payload.somethingChanged.id
와 variables.id
를 비교하여 일치하는 경우에만 true를 반환합니다.value
객체에서 transformedData
를 반환하여 클라이언트로 전달합니다.Altair GraphQL Client
를 사용하면 쉽게 GraphQL Subscriptions를 테스트할 수 있습니다. 웹소켓 프로토콜을 graphql-ws
로 설정하고, CONNECTION PARAMETERS
에 토큰 정보를 JSON 형식으로 입력하면 됩니다.
x-jwt
토큰 설정ws://localhost:3000/graphql
WebSocket (graphql-ws)
{ "x-jwt": "your-jwt-token" }
GraphQL Subscriptions는 실시간 데이터를 필요로 하는 애플리케이션에서 강력한 기능을 제공합니다. 이번 포스팅에서는 필터링 및 페이로드 변경
그리고 Altair GraphQL Client를 이용한 테스트
를 살펴보았습니다.