기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
에서 향상된 구독 필터 정의 AWS AppSync
에서 추가 논리 연산자를 지원하는 필터를 사용하여 GraphQL API 구독 해석기에서 백엔드에서 직접 데이터 필터링을 위한 비즈니스 로직을 정의하고 활성화할 AWS AppSync수 있습니다. 클라이언트의 구독 쿼리에 정의된 구독 인수와는 다르게, 이러한 필터를 구성할 수 있습니다. 구독 인수 사용에 관한 자세한 정보는 구독 인수 사용 섹션을 참조하세요. 연산자 목록은 AWS AppSync 해석기 매핑 템플릿 유틸리티 참조 섹션을 참조하세요.
이 문서에서는 실시간 데이터 필터링을 다음과 같은 범주로 분류합니다.
-
기본 필터링 - 구독 쿼리의 클라이언트 정의 인수를 기반으로 필터링합니다.
-
향상된 필터링 - AWS AppSync 서비스 백엔드에서 중앙에 정의된 로직을 기반으로 필터링합니다.
다음 섹션에서는 향상된 구독 필터를 구성하는 방법을 설명하고 실제 사용 사례를 보여 줍니다.
GraphQL 스키마에서 구독 정의
향상된 구독 필터를 사용하려면 GraphQL 스키마에서 구독을 정의한 다음 필터링 확장을 사용하여 향상된 필터를 정의합니다. 에서 향상된 구독 필터링이 작동하는 방식을 설명하려면 티켓 관리 시스템 을 정의하는 다음 GraphQL 스키마API를 예로 들어 AWS AppSync사용하세요.
type Ticket { id: ID createdAt: AWSDateTime content: String severity: Int priority: Priority category: String group: String status: String } type Mutation { createTicket(input: TicketInput): Ticket } type Query { getTicket(id: ID!): Ticket } type Subscription { onSpecialTicketCreated: Ticket @aws_subscribe(mutations: ["createTicket"]) onGroupTicketCreated(group: String!): Ticket @aws_subscribe(mutations: ["createTicket"]) } enum Priority { none lowest low medium high highest } input TicketInput { content: String severity: Int priority: Priority category: String group: String
에 대한 NONE
데이터 소스를 생성한 API다음 이 데이터 소스를 사용하여 해석기를 createTicket
돌연변이에 연결한다고 가정해 보겠습니다. 핸들러는 다음과 같을 수 있습니다.
import { util } from '@aws-appsync/utils'; export function request(ctx) { return { payload: { id: util.autoId(), createdAt: util.time.nowISO8601(), status: 'pending', ...ctx.args.input, }, }; } export function response(ctx) { return ctx.result; }
참고
향상된 필터는 지정된 구독에서 GraphQL 해석기의 핸들러에 활성화됩니다. 자세한 내용은 해석기 참조를 참조하세요.
향상된 필터의 동작을 구현하려면 extensions.setSubscriptionFilter()
함수를 사용하여 구독하는 클라이언트가 관심을 가질 수 있는 GraphQL 변형의 게시된 데이터에 대해 평가된 필터 식을 정의해야 합니다. 필터링 확장에 대한 자세한 내용은 확장을 참조하세요.
다음 섹션에서는 필터링 확장을 사용하여 향상된 필터를 구현하는 방법을 설명합니다.
필터링 확장을 사용하여 향상된 구독 필터 생성
향상된 필터는 구독 해석기의 응답 핸들러JSON에 기록됩니다. 필터는 filterGroup
이라는 목록으로 그룹화할 수 있습니다. 필터는 각각 필드, 연산자 및 값이 있는 하나 이상의 규칙을 사용하여 정의됩니다. 향상된 필터를 설정하는 onSpecialTicketCreated
에 대한 새 해석기를 정의해 보겠습니다. AND 로직을 사용하여 평가되는 필터에서 여러 규칙을 구성할 수 있으며, 필터 그룹의 여러 필터는 OR 로직을 사용하여 평가됩니다.
import { util, extensions } from '@aws-appsync/utils'; export function request(ctx) { // simplfy return null for the payload return { payload: null }; } export function response(ctx) { const filter = { or: [ { severity: { ge: 7 }, priority: { in: ['high', 'medium'] } }, { category: { eq: 'security' }, group: { in: ['admin', 'operators'] } }, ], }; extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter)); // important: return null in the response return null; }
이전 예제에서 정의한 필터를 기반으로 다음 방법으로 티켓을 생성하면 구독 API 클라이언트에 중요한 티켓이 자동으로 푸시됩니다.
-
priority
수준high
또는medium
AND
-
severity
수준이7
보다 크거나 같음(ge
)
OR
-
classification
티켓이Security
로 설정됨AND
-
group
할당이admin
또는operators
로 설정됨
구독 해석기에 정의된 필터(향상된 필터링)는 구독 인수만을 기반으로 하는 필터링(기본 필터링)보다 우선합니다. 구독 인수 사용에 관한 자세한 정보는 구독 인수 사용을 참조하세요.
구독의 GraphQL 스키마에서 인수가 정의되고 필요한 경우 해당 인수가 해석기의 extensions.setSubscriptionFilter()
메서드에 규칙으로 정의된 경우에만 지정된 인수를 기반으로 필터링됩니다. 하지만 구독 해석기에 extensions
필터링 메서드가 없는 경우 클라이언트에 정의된 인수는 기본 필터링에만 사용됩니다. 기본 필터링과 향상된 필터링은 동시에 사용할 수 없습니다.
구독의 필터 확장 로직에 있는 context
변수를 사용하여 요청에 대한 컨텍스트 정보에 액세스할 수 있습니다. 예를 들어 Amazon Cognito 사용자 풀, OIDC또는 Lambda 사용자 지정 권한 부여자를 권한 부여에 사용하는 경우 구독이 설정context.identity
되면 에서 사용자에 대한 정보를 검색할 수 있습니다. 이 정보를 사용하여 사용자의 자격 증명을 기반으로 필터를 설정할 수 있습니다.
이제 onGroupTicketCreated
에 대한 향상된 필터 동작을 구현한다고 가정해 보겠습니다. onGroupTicketCreated
구독에는 필수 group
이름이 인수로 필요합니다. 티켓을 만들면 티켓에 pending
상태가 자동으로 지정됩니다. 제공된 그룹에 속하는 새로 만들어진 티켓만 받도록 구독 필터를 설정할 수 있습니다.
import { util, extensions } from '@aws-appsync/utils'; export function request(ctx) { // simplfy return null for the payload return { payload: null }; } export function response(ctx) { const filter = { group: { eq: ctx.args.group }, status: { eq: 'pending' } }; extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter)); return null; }
다음 예와 같이 변형을 사용하여 데이터를 게시하는 경우:
mutation CreateTicket { createTicket(input: {priority: medium, severity: 2, group: "aws"}) { id priority severity status group createdAt } }
구독한 클라이언트는 createTicket
돌연변이가 있는 티켓이 생성되는 즉시 데이터가 자동으로 푸시 WebSockets될 때까지 수신 대기합니다.
subscription OnGroup { onGroupTicketCreated(group: "aws") { category status severity priority id group createdAt content } }
필터링 로직은 클라이언트 코드를 단순화하는 향상된 필터링을 통해 AWS AppSync 서비스에 구현되므로 인수 없이 클라이언트를 구독할 수 있습니다. 클라이언트는 정의된 필터 기준을 충족하는 경우에만 데이터를 수신합니다.
중첩된 스키마 필드에 대한 향상된 필터 정의
향상된 구독 필터링을 사용하여 중첩된 스키마 필드를 필터링할 수 있습니다. 위치 및 주소 유형을 포함하도록 이전 섹션의 스키마를 수정했다고 가정해 보겠습니다.
type Ticket { id: ID createdAt: AWSDateTime content: String severity: Int priority: Priority category: String group: String status: String location: ProblemLocation } type Mutation { createTicket(input: TicketInput): Ticket } type Query { getTicket(id: ID!): Ticket } type Subscription { onSpecialTicketCreated: Ticket @aws_subscribe(mutations: ["createTicket"]) onGroupTicketCreated(group: String!): Ticket @aws_subscribe(mutations: ["createTicket"]) } type ProblemLocation { address: Address } type Address { country: String } enum Priority { none lowest low medium high highest } input TicketInput { content: String severity: Int priority: Priority category: String group: String location: AWSJSON
이 스키마에서는 .
구분 기호를 사용하여 중첩을 나타낼 수 있습니다. 다음 예제에서는 location.address.country
아래에 중첩된 스키마 필드에 대한 필터 규칙을 추가합니다. 티켓 주소가 USA
로 설정되면 구독이 트리거됩니다.
import { util, extensions } from '@aws-appsync/utils'; export const request = (ctx) => ({ payload: null }); export function response(ctx) { const filter = { or: [ { severity: { ge: 7 }, priority: { in: ['high', 'medium'] } }, { category: { eq: 'security' }, group: { in: ['admin', 'operators'] } }, { 'location.address.country': { eq: 'USA' } }, ], }; extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter)); return null; }
위의 예에서 location
은 중첩 수준 1을, address
는 중첩 수준 2, country
는 중첩 수준 3을 나타내며, 모두 .
구분 기호로 구분됩니다.
createTicket
변형을 사용하여 이 구독을 테스트할 수 있습니다.
mutation CreateTicketInUSA { createTicket(input: {location: "{\"address\":{\"country\":\"USA\"}}"}) { category content createdAt group id location { address { country } } priority severity status } }
클라이언트에서 향상된 필터 정의
GraphQL의 기본 필터링을 구독 인수와 함께 사용할 수 있습니다. 구독 쿼리에서 호출을 수행하는 클라이언트가 인수 값을 정의합니다. extensions
필터링이 있는 AWS AppSync 구독 해석기에서 향상된 필터가 활성화되면 해석기에 정의된 백엔드 필터가 우선하고 우선합니다.
구독의 filter
인수를 사용하여 동적 클라이언트 정의 향상된 필터를 구성하세요. 이러한 필터를 구성할 때는 새 인수를 반영하도록 GraphQL 스키마를 업데이트해야 합니다.
... type Subscription { onSpecialTicketCreated(filter: String): Ticket @aws_subscribe(mutations: ["createTicket"]) } ...
그러면 클라이언트는 다음 예와 같이 구독 쿼리를 전송할 수 있습니다.
subscription onSpecialTicketCreated($filter: String) { onSpecialTicketCreated(filter: $filter) { id group description priority severity } }
다음 예와 같이 쿼리 변수를 구성할 수 있습니다.
{"filter" : "{\"severity\":{\"le\":2}}"}
구독 응답 매핑 템플릿에서 util.transform.toSubscriptionFilter()
해석기 유틸리티를 구현하여 구독 인수에 정의된 필터를 각 클라이언트의 적용할 수 있습니다.
import { util, extensions } from '@aws-appsync/utils'; export function request(ctx) { // simplfy return null for the payload return { payload: null }; } export function response(ctx) { const filter = ctx.args.filter; extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter)); return null; }
이 전략을 통해 클라이언트는 향상된 필터링 로직과 추가 연산자를 사용하는 자체 필터를 정의할 수 있습니다. 필터는 지정된 클라이언트가 보안 WebSocket 연결에서 구독 쿼리를 호출할 때 할당됩니다. filter
쿼리 변수 페이로드의 형식을 포함하여 향상된 필터링을 위한 변환 유틸리티에 대한 자세한 내용은 JavaScript 해석기 개요 섹션을 참조하세요.
향상된 필터링 추가 제한 사항
다음은 향상된 필터에 추가 제한이 적용되는 몇 가지 사용 사례입니다.
-
향상된 필터는 최상위 객체 목록에 대한 필터링을 지원하지 않습니다. 이 사용 사례에서는 향상된 구독을 위해 변형의 게시된 데이터가 무시됩니다.
-
AWS AppSync 는 최대 5개 수준의 중첩을 지원합니다. 중첩 수준 5를 초과하는 스키마 필드에 대한 필터는 무시됩니다. 아래 GraphQL 응답을 예로 들어 보겠습니다.
venue.address.country.metadata.continent
의continent
필드는 수준 5 중첩이므로 허용됩니다. 그러나venue.address.country.metadata.capital.financial
의financial
은 수준 6 중첩이므로 필터가 작동하지 않습니다.{ "data": { "onCreateFilterEvent": { "venue": { "address": { "country": { "metadata": { "capital": { "financial": "New York" }, "continent" : "North America" } }, "state": "WA" }, "builtYear": 2023 }, "private": false, } } }