실시간 데이터 - AWS AppSync

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

실시간 데이터

AWS AppSync를 사용하면 구독을 활용하여 라이브 애플리케이션 업데이트, 푸시 알림 등을 구현할 수 있습니다. 클라이언트가 GraphQL 구독 작업을 간접적으로 호출하면 AWS AppSync에서 보안 WebSocket 연결을 자동으로 설정하고 유지 관리합니다. 그러면 AWS AppSync가 애플리케이션의 연결 및 조정 요구 사항을 지속적으로 관리하는 동안 애플리케이션은 데이터 원본의 데이터를 구독자에게 실시간으로 배포할 수 있습니다. 다음 섹션에서는 AWS AppSync의 구독이 작동하는 방식을 설명합니다.

GraphQL 스키마 구독 명령

AWS AppSync의 구독은 변형에 대한 응답으로 간접적으로 호출됩니다. 즉, 변형에 대한 GraphQL 스키마 명령을 지정하여 AWS AppSync에서 실시간으로 데이터 원본을 만들 수 있습니다.

AWS Amplify 클라이언트 라이브러리는 구독 연결 관리를 자동으로 처리합니다. 라이브러리는 순수 WebSocket을 클라이언트와 서비스 간의 네트워크 프로토콜로 사용합니다.

참고

구독을 위해 연결 시 권한 부여를 제어하려면 필드 수준 권한 부여에 AWS Identity and Access Management(IAM), AWS Lambda, Amazon Cognito 자격 증명 풀 또는 Amazon Cognito 사용자 풀을 사용할 수 있습니다. 구독에 대한 세부적인 액세스 제어를 위해 해석기를 구독 필드에 연결하고 호출자의 자격 증명과 AWS AppSync 데이터 원본을 사용하여 로직을 수행할 수 있습니다. 자세한 내용은 인증 및 권한 부여 섹션을 참조하세요.

구독이 변형에서 트리거되고 변형 선택 세트가 구독자에게 전송됩니다.

다음 예에서는 GraphQL 구독을 사용하는 방법을 보여 줍니다. 데이터 원본이 Lambda, Amazon DynamoDB 또는 Amazon OpenSearch Service일 수 있으므로 데이터 원본을 지정하지 않습니다.

구독으로 시작하려면 다음과 같이 스키마에 구독 진입점을 추가해야 합니다.

schema { query: Query mutation: Mutation subscription: Subscription }

블로그 게시물 사이트가 있고 새 블로그와 기존 블로그에 대한 변경 사항을 구독하려 한다고 가정해 보겠습니다. 이를 수행하려면 스키마에 다음 Subscription 정의를 추가합니다.

type Subscription { addedPost: Post updatedPost: Post deletedPost: Post }

다음과 같은 변형이 있다고 추가로 가정해 보겠습니다.

type Mutation { addPost(id: ID! author: String! title: String content: String url: String): Post! updatePost(id: ID! author: String! title: String content: String url: String ups: Int! downs: Int! expectedVersion: Int!): Post! deletePost(id: ID!): Post! }

다음과 같이 알림을 받고자 하는 각 구독에 대해 @aws_subscribe(mutations: ["mutation_field_1", "mutation_field_2"]) 명령을 추가하여 이러한 필드를 실시간으로 만들 수 있습니다.

type Subscription { addedPost: Post @aws_subscribe(mutations: ["addPost"]) updatedPost: Post @aws_subscribe(mutations: ["updatePost"]) deletedPost: Post @aws_subscribe(mutations: ["deletePost"]) }

@aws_subscribe(mutations: ["",..,""])는 변형 입력의 배열을 받기 때문에 구독을 시작하는 여러 변형을 지정할 수 있습니다. 클라이언트로부터 구독하는 경우, GraphQL 쿼리는 다음과 같습니다.

subscription NewPostSub { addedPost { __typename version title content author url } }

이 구독 쿼리는 클라이언트 연결 및 도구에 필요합니다.

순수 WebSocket 클라이언트를 사용하는 경우 각 클라이언트가 자체 선택 세트를 정의할 수 있으므로 선택 세트 필터링은 클라이언트별로 수행됩니다. 이 경우 구독 선택 세트는 변형 선택 세트의 하위 집합이어야 합니다. 예를 들어 addPost(...){id author title url version} 변형과 연결된 addedPost{author title} 구독은 게시물의 작성자와 제목만 수신합니다. 다른 필드는 수신하지 않습니다. 그러나 변형의 선택 집합에 작성자가 없으면 구독자는 작성자 필드에 대한 null 값을 가져옵니다(작성자 필드가 스키마에서 필수/null이 아님으로 정의된 경우에는 오류를 가져옴).

순수 WebSocket을 사용할 때는 구독 선택 세트가 필수입니다. 구독에서 필드가 명시적으로 정의되지 않은 경우 AWS AppSync는 필드를 반환하지 않습니다.

이전 예제에서 구독에는 인수가 없었습니다. 스키마가 다음과 같은 모습이라고 가정합니다.

type Subscription { updatedPost(id:ID! author:String): Post @aws_subscribe(mutations: ["updatePost"]) }

이 경우 클라이언트는 구독을 다음과 같이 정의합니다.

subscription UpdatedPostSub { updatedPost(id:"XYZ", author:"ABC") { title content } }

스키마에서 subscription 필드의 반환 형식은 해당 변형 필드의 반환 형식과 동일해야 합니다. 이전 예에서는 이러한 내용이 addPostaddedPost 형식으로 반환된 Post 둘 다로 표시되었습니다.

클라이언트에 대한 구독을 설정하려면 클라이언트 애플리케이션 빌드 섹션을 참조하세요.

구독 인수 사용

GraphQL 구독 사용 시 중요한 부분은 인수를 사용하는 시기와 방법을 이해하는 것입니다. 발생한 변형에 대해 클라이언트에게 알리는 방법과 시기를 세밀하게 수정할 수 있습니다. 이렇게 하려면 'Todos'를 생성하는 빠른 시작 장의 샘플 스키마를 참조하세요. 이 샘플 스키마에는 다음 변형이 정의되어 있습니다.

type Mutation { createTodo(input: CreateTodoInput!): Todo updateTodo(input: UpdateTodoInput!): Todo deleteTodo(input: DeleteTodoInput!): Todo }

기본 샘플에서 클라이언트는 인수 없이 onUpdateTodo subscription을 사용하여 Todo에 대한 업데이트를 구독할 수 있습니다.

subscription OnUpdateTodo { onUpdateTodo { description id name when } }

사용자는 해당 인수를 사용하여 subscription을 필터링할 수 있습니다. 예를 들어 특정 ID를 사용하는 todo가 업데이트될 때만 subscription을 트리거하려면 ID 값을 지정합니다.

subscription OnUpdateTodo { onUpdateTodo(id: "a-todo-id") { description id name when } }

또한 여러 인수를 전달할 수도 있습니다. 예를 들어, 다음 subscription은 특정 장소와 시간에 Todo 업데이트에 대한 알림을 받는 방법을 보여 줍니다.

subscription todosAtHome { onUpdateTodo(when: "tomorrow", where: "at home") { description id name when where } }

모든 인수는 선택 사항입니다. subscription에 인수를 지정하지 않으면 애플리케이션에서 발생하는 모든 Todo 업데이트를 구독하게 됩니다. 하지만 ID 인수가 필요하도록 subscription의 필드 정의를 업데이트할 수 있습니다. 이렇게 하면 모든 todo의 응답이 아닌 특정 todo의 응답이 발생합니다.

onUpdateTodo( id: ID!, name: String, when: String, where: String, description: String ): Todo

인수 null 값에는 의미가 있습니다.

AWS AppSync에서 구독 궈리를 수행하면 null 인수 값은 인수를 전체적으로 생략하는 것과는 다르게 결과를 필터링합니다.

todos를 생성할 수 있는 todos API 샘플로 돌아가 보겠습니다. 빠른 시작 장의 샘플 스키마를 참조하세요.

Todo 유형에 소유자를 설명하는 새 owner 필드를 포함하도록 스키마를 수정해 보겠습니다. owner 필드는 필수가 아니며 UpdateTodoInput에만 설정할 수 있습니다. 다음과 같은 스키마의 단순화된 버전을 참조하세요.

type Todo { id: ID! name: String! when: String! where: String! description: String! owner: String } input CreateTodoInput { name: String! when: String! where: String! description: String! } input UpdateTodoInput { id: ID! name: String when: String where: String description: String owner: String } type Subscription { onUpdateTodo( id: ID, name: String, when: String, where: String, description: String ): Todo @aws_subscribe(mutations: ["updateTodo"]) }

다음 구독은 모든 Todo 업데이트를 반환합니다.

subscription MySubscription { onUpdateTodo { description id name when where } }

필드 인수 owner: null을 추가하도록 이전 구독을 수정하는 경우 이제 다른 질문을 하게 됩니다. 이제 이 구독은 소유자를 제공하지 않은 모든 Todo 업데이트에 대한 알림을 받을 수 있도록 클라이언트를 등록합니다.

subscription MySubscription { onUpdateTodo(owner: null) { description id name when where } }
참고

2022년 1월 1일부터는 WebSocket을 통한 MQTT를 더 이상 AWS AppSync API의 GraphQL 구독에 대한 프로토콜로 사용할 수 없습니다. 순수 WebSocket은 AWS AppSync에서 지원되는 유일한 프로토콜입니다.

2019년 11월 이후에 출시된 AWS AppSync SDK 또는 Amplify 라이브러리 기반 클라이언트는 기본적으로 순수 WebSocket을 자동으로 사용합니다. 클라이언트를 최신 버전으로 업그레이드하면 AWS AppSync의 순수 WebSocket 엔진을 사용할 수 있습니다.

순수 WebSocket은 더 큰 페이로드 크기(240KB), 더 다양한 클라이언트 옵션, 개선된 CloudWatch 메트릭을 제공합니다. 순수 WebSocket 사용 방법에 관한 추가 정보는 실시간 웹소켓 클라이언트 빌드 섹션을 참조하세요.