기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
이 자습서에서는 Amazon DynamoDB 테이블을 로 가져오 AWS AppSync 고 연결하여 자체 애플리케이션에서 활용할 수 있는 JavaScript 파이프라인 해석기를 사용하여 완전한 기능을 갖춘 GraphQL API를 빌드합니다.
AWS AppSync 콘솔을 사용하여 Amazon DynamoDB 리소스를 프로비저닝하고, 해석기를 생성하고, 데이터 소스에 연결합니다. 또한 GraphQL 명령문을 통해 Amazon DynamoDB 데이터베이스를 읽고 쓸 수 있으며 실시간 데이터를 구독할 수 있습니다.
GraphQL 명령문을 Amazon DynamoDB 작업으로 변환하고 응답을 다시 GraphQL로 변환하기 위해서는 특정 단계를 완료해야 합니다. 이 자습서에서는 여러 가지 실제 시나리오와 데이터 액세스 패턴을 통해 구성 프로세스를 설명합니다.
GraphQL API 생성
에서 GraphQL API를 생성하려면 AWS AppSync
-
AppSync 콘솔을 열고 API 생성을 선택합니다.
-
처음부터 디자인을 선택하고 다음을 선택합니다.
-
API
PostTutorialAPI
의 이름을 지정한 후 다음을 선택합니다. 나머지 옵션은 기본값으로 설정한 채 검토 페이지로 건너뛰고Create
를 선택합니다.
AWS AppSync 콘솔에서 새 GraphQL API를 생성합니다. 기본적으로 API 키 인증 모드를 사용합니다. 콘솔에서 GraphQL API의 나머지 부분을 설정하고 이 자습서의 나머지 부분에서 이 API에 대한 쿼리를 실행할 수 있습니다.
기본 Post API 정의
GraphQL API가 있으므로 게시 데이터의 기본적인 생성, 검색 및 삭제를 허용하는 기본 스키마를 설정할 수 있습니다.
스키마에 데이터를 추가하려면
-
API에서 스키마 탭을 선택합니다.
-
Post
객체를 추가하고 가져오기 위한Post
유형과 작업addPost
를 정의하는 스키마를 만들 것입니다. 스키마 창에서 파일 콘텐츠를 다음 코드로 바꿉니다.schema { query: Query mutation: Mutation } type Query { getPost(id: ID): Post } type Mutation { addPost( id: ID! author: String! title: String! content: String! url: String! ): Post! } type Post { id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! }
-
스키마 저장(Save Schema)을 선택합니다.
Amazon DynamoDB 테이블 설정
AWS AppSync 콘솔은 Amazon DynamoDB 테이블에 자체 AWS 리소스를 저장하는 데 필요한 리소스를 프로비저닝하는 데 도움이 될 수 있습니다. 이 단계에서는 Amazon DynamoDB 테이블을 생성하여 게시물을 저장합니다. 또한 나중에 사용할 보조 인덱스도 설정합니다.
Amazon DynamoDB 테이블을 생성하려면
-
스키마 페이지에서 리소스 생성을 선택합니다.
-
기존 유형 사용을 선택하고
Post
유형을 선택합니다. -
보조 인덱스 섹션에서 인덱스 추가를 선택합니다.
-
인덱스 이름을
author-index
로 지정합니다. -
Primary key
를author
로 설정하고Sort
키를None
으로 설정합니다. -
GraphQL 자동 생성을 비활성화합니다. 이 예에서는 해석기를 직접 생성합니다.
-
생성(Create)을 선택합니다.
이제 PostTable
이라는 새 데이터 소스가 생겼습니다. 사이드 탭의 데이터 소스를 방문하면 이를 확인할 수 있습니다. 이 데이터 소스를 사용하여 쿼리와 뮤테이션을 Amazon DynamoDB 테이블에 연결합니다.
addPost 해석기 설정(Amazon DynamoDB PutItem)
이제 AWS AppSync 가 Amazon DynamoDB 테이블을 인식했으므로 해석기를 정의하여 개별 쿼리 및 변형에 연결할 수 있습니다. 생성한 첫 번째 해석기는 JavaScript를 사용하는 addPost
파이프라인 해석기로, 이 해석기를 사용하면 Amazon DynamoDB 테이블에 게시물을 작성할 수 있습니다. 파이프라인 해석기에는 다음 구성 요소가 있습니다.
-
해석기를 연결할 GraphQL 스키마의 위치. 이 경우
createPost
형식의Mutation
필드에서 해석기를 설정합니다. 이 해석기는 호출자가 뮤테이션{ addPost(...){...} }
를 호출하면 간접적으로 호출됩니다. -
이 해석기에 사용할 데이터 원본. 이 경우 앞서 정의한 DynamoDB 데이터 소스를 사용하려고 합니다. 따라서
post-table-for-tutorial
DynamoDB 테이블에 항목을 추가할 수 있습니다. -
요청 핸들러. 요청 핸들러는 호출자의 수신 요청을 처리하고 DynamoDB에 대해 AWS AppSync 가 수행할 지침으로 변환하는 함수입니다.
-
응답 핸들러. 응답 핸들러의 작업은 DynamoDB의 응답을 처리하여 GraphQL에 필요한 것으로 변환하는 것입니다. 이러한 템플릿은 DynamoDB의 데이터 모양과 GraphQL의
Post
형식이 다른 경우 유용하지만 이 경우 모양이 서로 동일하기 때문에 데이터를 그냥 전달하면 됩니다.
해석기를 설정하려면
-
API에서 스키마 탭을 선택합니다.
-
해석기 창에서
Mutation
유형 아래의addPost
필드를 찾은 다음 연결을 선택합니다. -
데이터 소스를 선택한 다음 생성을 선택합니다.
-
코드 편집기에서 코드를 다음 코드 조각으로 바꿉니다.
import { util } from '@aws-appsync/utils' import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { const item = { ...ctx.arguments, ups: 1, downs: 0, version: 1 } const key = { id: ctx.args.id ?? util.autoId() } return ddb.put({ key, item }) } export function response(ctx) { return ctx.result }
-
저장(Save)을 선택합니다.
참고
이 코드에서는 DynamoDB 요청을 쉽게 생성할 수 있는 DynamoDB 모듈 유틸리티를 사용합니다.
AWS AppSync 는 새 게시물의 ID를 생성하는 데 util.autoId()
사용되는 라는 자동 ID 생성을 위한 유틸리티와 함께 제공됩니다. ID를 지정하지 않으면 유틸리티에서 ID를 자동으로 생성합니다.
const key = { id: ctx.args.id ?? util.autoId() }
JavaScript에 사용할 수 있는 유틸리티에 대한 자세한 내용은 해석기 및 함수를 위한 JavaScript 런타임 기능을 참조하세요.
게시물 추가를 위한 API 직접 호출
해석기가 구성되었으므로는 들어오는 addPost
변형을 Amazon DynamoDB PutItem
작업으로 변환할 AWS AppSync 수 있습니다. 이제 변형을 실행해 테이블에 데이터를 입력할 수 있습니다.
작업을 실행하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 뮤테이션을 추가합니다.
mutation addPost { addPost( id: 123, author: "AUTHORNAME" title: "Our first post!" content: "This is our first post." url: "https://aws.amazon.com/appsync/" ) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
addPost
를 선택합니다. 새로 생성한 게시물의 결과가 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.{ "data": { "addPost": { "id": "123", "author": "AUTHORNAME", "title": "Our first post!", "content": "This is our first post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
다음 설명은 어떤 일이 발생했는지 보여줍니다.
-
AWS AppSync 가
addPost
변형 요청을 받았습니다. -
AWS AppSync 는 해석기의 요청 핸들러를 실행합니다.
ddb.put
함수는 다음과 같은PutItem
요청을 생성합니다.{ operation: 'PutItem', key: { id: { S: '123' } }, attributeValues: { downs: { N: 0 }, author: { S: 'AUTHORNAME' }, ups: { N: 1 }, title: { S: 'Our first post!' }, version: { N: 1 }, content: { S: 'This is our first post.' }, url: { S: 'https://aws.amazon.com/appsync/' } } }
-
AWS AppSync 는이 값을 사용하여 Amazon DynamoDB
PutItem
요청을 생성하고 실행합니다. -
AWS AppSync 는
PutItem
요청 결과를 가져와 GraphQL 유형으로 다시 변환했습니다.{ "id" : "123", "author": "AUTHORNAME", "title": "Our first post!", "content": "This is our first post.", "url": "https://aws.amazon.com/appsync/", "ups" : 1, "downs" : 0, "version" : 1 }
-
응답 핸들러는 결과를 즉시 반환합니다(
return ctx.result
). -
최종 결과는 GraphQL 응답에서 확인할 수 있습니다.
getPost 해석기 설정(Amazon DynamoDB GetItem)
이제 Amazon DynamoDB 테이블에 데이터를 추가할 수 있으므로 DynamoDB 테이블에서 데이터를 검색할 수 있도록 쿼리를 설정해야 합니다. 이렇게 하기 위해 다른 해석기를 설정합니다.
해석기를 추가하려면
-
API에서 스키마 탭을 선택합니다.
-
오른쪽의 해석기 창에서
Query
유형 아래의getPost
필드를 찾은 다음 연결을 선택합니다. -
데이터 소스를 선택한 다음 생성을 선택합니다.
-
코드 편집기에서 코드를 다음 코드 조각으로 바꿉니다.
import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { return ddb.get({ key: { id: ctx.args.id } }) } export const response = (ctx) => ctx.result
-
해석기를 저장합니다.
참고
이 해석기에서는 응답 핸들러에 화살표 함수 표현식을 사용합니다.
게시물 가져오기를 위한 API 직접 호출
이제 해석기가 설정되었으므로 수신 getPost
쿼리를 Amazon DynamoDB GetItem
작업으로 변환하는 방법을 AWS AppSync 알고 있습니다. 이제 앞에서 생성한 게시물을 검색하는 쿼리를 실행할 수 있습니다.
쿼리를 실행하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에서 다음 코드를 추가하고 게시물을 만든 후 복사한 ID를 사용합니다.
query getPost { getPost(id: "123") { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
getPost
를 선택합니다. 새로 생성한 게시물의 결과가 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. -
Amazon DynamoDB에서 가져온 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.
{ "data": { "getPost": { "id": "123", "author": "AUTHORNAME", "title": "Our first post!", "content": "This is our first post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
또는 다음 예를 사용합니다.
query getPost {
getPost(id: "123") {
id
author
title
}
}
getPost
쿼리에 id
, author
, title
만 필요한 경우, 요청 함수를 변경하여 프로젝션 표현식을 사용하여 DynamoDB 테이블에서 원하는 속성만 지정하면 DynamoDB에서 AWS AppSync로 불필요한 데이터 전송을 방지할 수 있습니다. 예를 들어 요청 함수는 아래 코드 조각과 비슷할 수 있습니다.
import * as ddb from '@aws-appsync/utils/dynamodb'
export function request(ctx) {
return ddb.get({
key: { id: ctx.args.id },
projection: ['author', 'id', 'title'],
})
}
export const response = (ctx) => ctx.result
getPost
와 함께 selectionSetList를 사용하여 expression
을 나타낼 수도 있습니다.
import * as ddb from '@aws-appsync/utils/dynamodb'
export function request(ctx) {
const projection = ctx.info.selectionSetList.map((field) => field.replace('/', '.'))
return ddb.get({ key: { id: ctx.args.id }, projection })
}
export const response = (ctx) => ctx.result
updatePost 뮤테이션 생성(Amazon DynamoDB UpdateItem)
이제 Amazon DynamoDB에서 Post
객체를 생성하고 검색할 수 있습니다. 다음으로, 객체 업데이트를 위한 새 변형을 설정합니다. 모든 필드를 지정해야 하는 addPost
뮤테이션에 비해 이 뮤테이션을 사용하면 변경하려는 필드만 지정할 수 있습니다. 또한 수정하려는 버전을 지정할 수 있는 새 expectedVersion
인수도 도입되었습니다. 객체의 최신 버전을 수정하고 있는지 확인하는 조건을 설정해야 합니다. 이 작업은 UpdateItem
Amazon DynamoDB operation.sc를 사용하여 수행합니다.
해석기를 업데이트하려면
-
API에서 스키마 탭을 선택합니다.
-
스키마 창에서 다음과 같이
Mutation
형식을 수정하여 새로운updatePost
변형을 추가할 수 있습니다.type Mutation { updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( id: ID author: String! title: String! content: String! url: String! ): Post! }
-
스키마 저장(Save Schema)을 선택합니다.
-
오른쪽의 해석기 창에서
Mutation
유형에 새로 생성된updatePost
필드를 찾은 다음 연결을 선택합니다. 아래 코드 조각을 사용하여 새 해석기를 만듭니다.import { util } from '@aws-appsync/utils'; import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { id, expectedVersion, ...rest } = ctx.args; const values = Object.entries(rest).reduce((obj, [key, value]) => { obj[key] = value ?? ddb.operations.remove(); return obj; }, {}); return ddb.update({ key: { id }, condition: { version: { eq: expectedVersion } }, update: { ...values, version: ddb.operations.increment(1) }, }); } export function response(ctx) { const { error, result } = ctx; if (error) { util.appendError(error.message, error.type); } return result;
-
변경한 내용을 모두 저장합니다.
이 해석기는 ddb.update
를 사용하여 Amazon DynamoDB UpdateItem
요청을 생성합니다. 전체 항목을 쓰는 대신 특정 속성을 업데이트하도록 Amazon DynamoDB에 요청합니다. Amazon DynamoDB 업데이트 표현식을 사용하여 요청합니다.
ddb.update
함수는 키와 업데이트 객체를 인수로 사용합니다. 그런 다음 들어오는 인수의 값을 확인합니다. 값이 null
로 설정되면 DynamoDB remove
작업을 사용하여 DynamoDB 항목에서 값을 제거해야 한다는 신호를 보냅니다.
또한 새로운 condition
섹션이 있습니다. 조건 표현식을 사용하면 작업이 수행되기 전에 Amazon DynamoDB에 이미 있는 객체의 상태를 기반으로 요청이 성공해야 하는지 여부를 AWS AppSync 및 Amazon DynamoDB에 알 수 있습니다. 이 경우에는 Amazon DynamoDB에 현재 있는 항목의 version
필드가 expectedVersion
인수와 정확하게 일치하는 경우에만 UpdateItem
요청에 성공하면 됩니다. 항목이 업데이트되면 version
의 값을 증가시키겠습니다. 작업 기능 increment
를 사용하면 이 작업을 쉽게 수행할 수 있습니다.
조건 표현식에 대한 자세한 내용은 조건 표현식 설명서를 참조하세요.
UpdateItem
요청에 대한 자세한 내용은 UpdateItem 설명서 및 DynamoDB 모듈 설명서를 참조하세요.
업데이트 표현식을 작성하는 방법에 대한 자세한 내용은 DynamoDB UpdateExpressions 문서를 참조하십시오.
게시물 업데이트를 위한 API 직접 호출
새 해석기를 사용해 Post
객체를 업데이트해 보겠습니다.
객체를 업데이트하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 뮤테이션을 추가합니다. 또한 앞서 적어둔 값을 갖도록
id
인수를 업데이트해야 합니다.mutation updatePost { updatePost( id:123 title: "An empty story" content: null expectedVersion: 1 ) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
updatePost
를 선택합니다. -
Amazon DynamoDB에서 업데이트된 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.
{ "data": { "updatePost": { "id": "123", "author": "A new author", "title": "An empty story", "content": null, "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 2 } } }
이 요청에서는 AWS AppSync 및 Amazon DynamoDB에 title
및 content
필드만 업데이트하도록 요청했습니다. version
필드를 증분하는 것을 제외하고 다른 모든 필드는 그대로 둡니다. title
속성을 새 값으로 설정하고 게시물에서 content
속성을 제거했습니다. author
, url
, ups
및 downs
필드는 그대로 남아 있습니다. 뮤테이션 요청을 다시 실행해도 요청은 정확하게 그대로 유지됩니다. 다음과 유사한 응답이 나타납니다.
{
"data": {
"updatePost": null
},
"errors": [
{
"path": [
"updatePost"
],
"data": null,
"errorType": "DynamoDB:ConditionalCheckFailedException",
"errorInfo": null,
"locations": [
{
"line": 2,
"column": 3,
"sourceName": null
}
],
"message": "The conditional request failed (Service: DynamoDb, Status Code: 400, Request ID: 1RR3QN5F35CS8IV5VR4OQO9NNBVV4KQNSO5AEMVJF66Q9ASUAAJG)"
}
]
}
조건 표현식이 false
로 평가되었으므로 요청에 실패합니다.
-
요청을 처음 실행했을 때 Amazon DynamoDB에 있는 게시물의
version
필드 값은1
이었고, 이는expectedVersion
인수와 일치했습니다. 요청에 성공하자 Amazon DynamoDB의version
필드가2
로 증가했습니다. -
요청을 두 번째로 실행했을 때 Amazon DynamoDB에 있는 게시물의
version
필드 값은2
이었고, 이는expectedVersion
인수와 일치하지 않았습니다.
이러한 패턴을 일반적으로 낙관적 잠금이라고 합니다.
투표 뮤테이션 생성(Amazon DynamoDB UpdateItem)
Post
유형에는 추천과 비추천을 기록할 수 있는 ups
및 downs
필드가 포함되어 있습니다. 하지만 현재로서는 API를 통해 아무것도 할 수 없습니다. 게시물을 추천 및 비추천하도록 하는 뮤테이션을 추가해 보겠습니다.
뮤테이션을 추가하려면
-
API에서 스키마 탭을 선택합니다.
-
스키마 창에서
Mutation
유형을 수정하고DIRECTION
열거형을 추가하여 새 투표 뮤테이션을 추가합니다.type Mutation { vote(id: ID!, direction: DIRECTION!): Post updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( id: ID, author: String!, title: String!, content: String!, url: String! ): Post! } enum DIRECTION { UP DOWN }
-
스키마 저장(Save Schema)을 선택합니다.
-
오른쪽의 해석기 창에서
Mutation
유형에 새로 생성된vote
필드를 찾은 다음 연결을 선택합니다. 코드를 생성하고 다음 코드 조각으로 대체하여 새 해석기를 만듭니다.import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const field = ctx.args.direction === 'UP' ? 'ups' : 'downs'; return ddb.update({ key: { id: ctx.args.id }, update: { [field]: ddb.operations.increment(1), version: ddb.operations.increment(1), }, }); } export const response = (ctx) => ctx.result;
-
변경한 내용을 모두 저장합니다.
게시물을 추천 또는 비추천하는 API 직접 호출
이제 새 해석기가 설정되었으므로 수신 upvotePost
또는 downvote
변형을 Amazon DynamoDB UpdateItem
작업으로 변환하는 방법을 AWS AppSync 배웁니다. 이제 앞서 생성한 게시물을 추천 또는 비추천하는 변형을 실행할 수 있습니다.
뮤테이션을 추가하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 뮤테이션을 추가합니다. 또한 앞서 적어둔 값을 갖도록
id
인수를 업데이트해야 합니다.mutation votePost { vote(id:123, direction: UP) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
votePost
를 선택합니다. -
Amazon DynamoDB에서 업데이트된 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.
{ "data": { "vote": { "id": "123", "author": "A new author", "title": "An empty story", "content": null, "url": "https://aws.amazon.com/appsync/", "ups": 6, "downs": 0, "version": 4 } } }
-
실행을 몇 번 더 선택합니다. 쿼리를 실행할 때마다
ups
및version
필드가1
씩 증가하는 것이 보여야 합니다. -
쿼리를 변경하여 다른
DIRECTION
으로 호출합니다.mutation votePost { vote(id:123, direction: DOWN) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
votePost
를 선택합니다.이번에는 쿼리를 실행할 때마다
downs
및version
필드가1
씩 증가하는 것이 보여야 합니다.
deletePost 해석기 설정(Amazon DynamoDB DeleteItem)
다음으로 게시물을 삭제하기 위한 뮤테이션을 생성해야 합니다. 이 작업은 DeleteItem
Amazon DynamoDB 작업을 사용하여 수행합니다.
뮤테이션을 추가하려면
-
스키마에서 스키마 탭을 선택합니다.
-
스키마 창에서 다음과 같이
Mutation
유형을 수정하여 새로운deletePost
뮤테이션을 추가합니다.type Mutation { deletePost(id: ID!, expectedVersion: Int): Post vote(id: ID!, direction: DIRECTION!): Post updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( id: ID author: String!, title: String!, content: String!, url: String! ): Post! }
-
이번에는
expectedVersion
필드를 선택 사항으로 설정했습니다. 다음으로 스키마 저장을 선택합니다. -
오른쪽의 해석기 창에서
Mutation
유형에 새로 생성된delete
필드를 찾은 다음 연결을 선택합니다. 다음 코드를 사용하여 새 해석기를 생성합니다.import { util } from '@aws-appsync/utils' import { util } from '@aws-appsync/utils'; import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { let condition = null; if (ctx.args.expectedVersion) { condition = { or: [ { id: { attributeExists: false } }, { version: { eq: ctx.args.expectedVersion } }, ], }; } return ddb.remove({ key: { id: ctx.args.id }, condition }); } export function response(ctx) { const { error, result } = ctx; if (error) { util.appendError(error.message, error.type); } return result; }
참고
참고:
expectedVersion
인수는 선택적 인수입니다. 호출자가 요청에서expectedVersion
인수를 설정하면, 요청 핸들러에서는 항목이 이미 삭제된 경우 또는 Amazon DynamoDB에 있는version
속성이expectedVersion
과 정확하게 일치하는 경우,DeleteItem
요청이 완료되게 하는 조건을 추가합니다. 그냥 두면DeleteItem
요청에 아무런 조건 표현식도 지정되지 않습니다. 이는version
의 값이나 해당 항목이 Amazon DynamoDB에 존재하는지 여부에 관계없이 완료됩니다.항목을 삭제하고 있더라도 항목이 아직 삭제되지 않은 경우 삭제된 항목을 반환할 수 있습니다.
DeleteItem
요청에 대한 자세한 내용은 DeleteItem 설명서를 참조하세요.
게시물 삭제를 위한 API 직접 호출
해석기가 설정되었으므로 수신 delete
변형을 Amazon DynamoDB DeleteItem
작업으로 변환하는 방법을 AWS AppSync 알고 있습니다. 이제 변형을 실행해 테이블에 데이터를 삭제할 수 있습니다.
뮤테이션을 추가하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 뮤테이션을 추가합니다. 또한 앞서 적어둔 값을 갖도록
id
인수를 업데이트해야 합니다.mutation deletePost { deletePost(id:123) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
deletePost
를 선택합니다. -
Amazon DynamoDB에서 해당 게시물이 삭제됩니다. 는 Amazon DynamoDB에서 삭제된 항목의 값을 AWS AppSync 반환합니다.이 값은 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.
{ "data": { "deletePost": { "id": "123", "author": "A new author", "title": "An empty story", "content": null, "url": "https://aws.amazon.com/appsync/", "ups": 6, "downs": 4, "version": 12 } } }
-
deletePost
에 대한 호출이 Amazon DynamoDB에서 실제로 삭제된 항목인 경우에만 값이 반환됩니다. 실행을 다시 선택합니다. -
호출에는 계속 성공하지만 반환되는 값은 없습니다.
{ "data": { "deletePost": null } }
-
이제 게시물을 삭제해 보는데, 이번에는
expectedValue
를 지정해 보겠습니다. 지금까지 작업한 게시물 하나를 방금 삭제했기 때문에 먼저 새 게시물을 생성해야 합니다. -
쿼리 창에 다음 뮤테이션을 추가합니다.
mutation addPost { addPost( id:123 author: "AUTHORNAME" title: "Our second post!" content: "A new post." url: "https://aws.amazon.com/appsync/" ) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
addPost
를 선택합니다. -
새로 생성한 게시물의 결과가 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 곧 필요할 것이기 때문에 새로 생성한 객체의
id
를 기록해 둡니다. 예를 들면 다음과 같아야 합니다.{ "data": { "addPost": { "id": "123", "author": "AUTHORNAME", "title": "Our second post!", "content": "A new post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
-
이제 expectedVersion의 값이 잘못된 게시물을 삭제해 보겠습니다. 쿼리 창에 다음 뮤테이션을 추가합니다. 또한 앞서 적어둔 값을 갖도록
id
인수를 업데이트해야 합니다.mutation deletePost { deletePost( id:123 expectedVersion: 9999 ) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
deletePost
를 선택합니다. 다음 결과가 반환됩니다.{ "data": { "deletePost": null }, "errors": [ { "path": [ "deletePost" ], "data": null, "errorType": "DynamoDB:ConditionalCheckFailedException", "errorInfo": null, "locations": [ { "line": 2, "column": 3, "sourceName": null } ], "message": "The conditional request failed (Service: DynamoDb, Status Code: 400, Request ID: 7083O037M1FTFRK038A4CI9H43VV4KQNSO5AEMVJF66Q9ASUAAJG)" } ] }
-
조건 표현식이
false
로 평가되었으므로 요청에 실패합니다. Amazon DynamoDB에 있는 게시물의version
값이 인수에 지정된expectedValue
와 일치하지 않습니다. 객체의 현재 값은 GraphQL 응답에서data
섹션의errors
필드에 반환됩니다. 이 요청을 다시 실행하되expectedVersion
을 수정합니다.mutation deletePost { deletePost( id:123 expectedVersion: 1 ) { id author title content url ups downs version } }
-
실행(주황색 재생 버튼)을 선택한 다음
deletePost
를 선택합니다.이번에는 요청에 성공하고 Amazon DynamoDB에서 삭제된 값이 반환됩니다.
{ "data": { "deletePost": { "id": "123", "author": "AUTHORNAME", "title": "Our second post!", "content": "A new post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
-
실행을 다시 선택합니다. 호출에 계속해서 성공하지만 이번에는 게시물이 이미 Amazon DynamoDB에서 삭제되었으므로 반환되는 값이 없습니다.
{ "data": { "deletePost": null } }
allPost 해석기 설정(Amazon DynamoDB 스캔)
지금까지 API는 살펴보고자 하는 각 게시물의 id
를 아는 경우에만 유용했습니다. 테이블의 게시물을 모두 반환하는 새 해석기를 추가해 보겠습니다.
뮤테이션을 추가하려면
-
API에서 스키마 탭을 선택합니다.
-
스키마 창에서 다음과 같이
Query
형식을 수정하여 새로운allPost
쿼리를 추가할 수 있습니다.type Query { allPost(limit: Int, nextToken: String): PaginatedPosts! getPost(id: ID): Post }
-
새로운
PaginationPosts
형식을 다음과 같이 추가합니다.type PaginatedPosts { posts: [Post!]! nextToken: String }
-
스키마 저장(Save Schema)을 선택합니다.
-
오른쪽의 해석기 창에서
Query
유형에 새로 생성된allPost
필드를 찾은 다음 연결을 선택합니다. 다음 코드를 사용하여 새 해석기를 생성합니다.import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { limit = 20, nextToken } = ctx.arguments; return ddb.scan({ limit, nextToken }); } export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
이 해석기의 요청 핸들러에는 두 개의 선택적 인수가 필요합니다.
-
limit
- 단일 호출에서 반환할 최대 항목 수를 지정합니다. -
nextToken
- 다음 결과 세트를 검색하는 데 사용됩니다(nextToken
값의 출처는 나중에 설명).
-
-
해석기의 모든 변경 사항을 저장합니다.
Scan
요청에 대한 자세한 내용은 스캔 참조 문서를 참조하세요.
모든 게시물을 스캔하는 API 직접 호출
해석기가 설정되었으므로 수신 allPost
쿼리를 Amazon DynamoDB Scan
작업으로 변환하는 방법을 AWS AppSync 알고 있습니다. 이제 테이블을 스캔해 게시물을 모두 검색할 수 있습니다. 지금까지 작업했던 데이터를 모두 삭제했기 때문에 이 요청을 수행하기 전에 몇 가지 데이터로 테이블을 채워야 합니다.
데이터를 추가 및 쿼리하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 뮤테이션을 추가합니다.
mutation addPost { post1: addPost(id:1 author: "AUTHORNAME" title: "A series of posts, Volume 1" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post2: addPost(id:2 author: "AUTHORNAME" title: "A series of posts, Volume 2" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post3: addPost(id:3 author: "AUTHORNAME" title: "A series of posts, Volume 3" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post4: addPost(id:4 author: "AUTHORNAME" title: "A series of posts, Volume 4" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post5: addPost(id:5 author: "AUTHORNAME" title: "A series of posts, Volume 5" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post6: addPost(id:6 author: "AUTHORNAME" title: "A series of posts, Volume 6" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post7: addPost(id:7 author: "AUTHORNAME" title: "A series of posts, Volume 7" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post8: addPost(id:8 author: "AUTHORNAME" title: "A series of posts, Volume 8" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post9: addPost(id:9 author: "AUTHORNAME" title: "A series of posts, Volume 9" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } }
-
실행(주황색 재생 버튼)을 선택합니다.
-
이제 테이블을 스캔해 보겠습니다. 한 번에 5개 결과를 반환합니다. 쿼리 창에 다음 쿼리를 추가합니다.
query allPost { allPost(limit: 5) { posts { id title } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPost
를 선택합니다.처음 5개 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.
{ "data": { "allPost": { "posts": [ { "id": "5", "title": "A series of posts, Volume 5" }, { "id": "1", "title": "A series of posts, Volume 1" }, { "id": "6", "title": "A series of posts, Volume 6" }, { "id": "9", "title": "A series of posts, Volume 9" }, { "id": "7", "title": "A series of posts, Volume 7" } ], "nextToken": "<token>" } } }
-
5개 결과가 반환되고 다음 결과 집합을 가져오는데 사용할 수 있는
nextToken
도 있습니다. 이전 결과 집합에서allPost
을 포함하도록nextToken
쿼리를 업데이트합니다.query allPost { allPost( limit: 5 nextToken: "<token>" ) { posts { id author } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPost
를 선택합니다.나머지 4개 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 게시물이 모두 9개이며 남은 게시물이 없기 때문에 이 결과 집합에는
nextToken
이 없습니다. 예를 들면 다음과 같아야 합니다.{ "data": { "allPost": { "posts": [ { "id": "2", "title": "A series of posts, Volume 2" }, { "id": "3", "title": "A series of posts, Volume 3" }, { "id": "4", "title": "A series of posts, Volume 4" }, { "id": "8", "title": "A series of posts, Volume 8" } ], "nextToken": null } } }
allPostsByAuthor 해석기 설정(Amazon DynamoDB 쿼리)
Amazon DynamoDB에서 모든 게시물을 스캔하는 것 이외에 Amazon DynamoDB를 쿼리해 특정 작성자가 생성한 게시물을 검색할 수 있습니다. 앞서 이미 생성한 Amazon DynamoDB 테이블에는 특정 작성자가 생성한 게시물을 모두 검색하는 Query
작업에 사용할 수 있는 author-index
라는 GlobalSecondaryIndex
가 있습니다.
쿼리를 추가하려면
-
API에서 스키마 탭을 선택합니다.
-
스키마 창에서 다음과 같이
Query
형식을 수정하여 새로운allPostsByAuthor
쿼리를 추가할 수 있습니다.type Query { allPostsByAuthor(author: String!, limit: Int, nextToken: String): PaginatedPosts! allPost(limit: Int, nextToken: String): PaginatedPosts! getPost(id: ID): Post }
참고: 여기서는
allPost
쿼리에 사용한 것과 동일한PaginatedPosts
유형을 사용합니다. -
스키마 저장(Save Schema)을 선택합니다.
-
오른쪽의 해석기 창에서
Query
유형에 새로 생성된allPostsByAuthor
필드를 찾은 다음 연결을 선택합니다. 아래 코드 조각을 사용하여 해석기를 만듭니다.import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { limit = 20, nextToken, author } = ctx.arguments; return ddb.query({ index: 'author-index', query: { author: { eq: author } }, limit, nextToken, }); } export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
allPost
해석기와 마찬가지로 이 해석기에는 두 개의 선택적 인수가 있습니다.-
limit
- 단일 호출에서 반환할 최대 항목 수를 지정합니다. -
nextToken
- 다음 결과 세트를 검색합니다(nextToken
의 값은 이전 호출에서 가져올 수 있음).
-
-
해석기의 모든 변경 사항을 저장합니다.
Query
요청에 대한 자세한 내용은 쿼리 참조 문서를 참조하세요.
작성자별 모든 게시물을 쿼리하는 API 직접 호출
해석기가 설정되었으므로는 author-index
인덱스에 대해 수신 allPostsByAuthor
변형을 DynamoDB Query
작업으로 변환하는 방법을 AWS AppSync 알고 있습니다. 이제 테이블을 쿼리해 특정 작성자별로 게시물을 모두 검색할 수 있습니다.
하지만 그 전에, 지금까지 모든 게시물의 작성자가 동일하므로 테이블을 몇 개의 게시물로 더 채워 보겠습니다.
데이터를 추가하고 쿼리하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 뮤테이션을 추가합니다.
mutation addPost { post1: addPost(id:10 author: "Nadia" title: "The cutest dog in the world" content: "So cute. So very, very cute." url: "https://aws.amazon.com/appsync/" ) { author, title } post2: addPost(id:11 author: "Nadia" title: "Did you know...?" content: "AppSync works offline?" url: "https://aws.amazon.com/appsync/" ) { author, title } post3: addPost(id:12 author: "Steve" title: "I like GraphQL" content: "It's great" url: "https://aws.amazon.com/appsync/" ) { author, title } }
-
실행(주황색 재생 버튼)을 선택한 다음
addPost
를 선택합니다. -
이제
Nadia
가 작성한 게시물을 모두 반환하도록 테이블을 쿼리하겠습니다. 쿼리 창에 다음 쿼리를 추가합니다.query allPostsByAuthor { allPostsByAuthor(author: "Nadia") { posts { id title } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPostsByAuthor
를 선택합니다.Nadia
가 작성한 모든 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.{ "data": { "allPostsByAuthor": { "posts": [ { "id": "10", "title": "The cutest dog in the world" }, { "id": "11", "title": "Did you know...?" } ], "nextToken": null } } }
-
Query
에 대한 페이지 매김은Scan
을 수행할 때와 동일하게 작동합니다. 예를 들어,AUTHORNAME
의 모든 게시물을 살펴보겠습니다. 이 경우 한 번에 5개 결과를 반환합니다. -
쿼리 창에 다음 쿼리를 추가합니다.
query allPostsByAuthor { allPostsByAuthor( author: "AUTHORNAME" limit: 5 ) { posts { id title } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPostsByAuthor
를 선택합니다.AUTHORNAME
가 작성한 모든 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.{ "data": { "allPostsByAuthor": { "posts": [ { "id": "6", "title": "A series of posts, Volume 6" }, { "id": "4", "title": "A series of posts, Volume 4" }, { "id": "2", "title": "A series of posts, Volume 2" }, { "id": "7", "title": "A series of posts, Volume 7" }, { "id": "1", "title": "A series of posts, Volume 1" } ], "nextToken": "<token>" } } }
-
다음과 같이 이전 쿼리에서 반환된 값으로
nextToken
인수를 업데이트합니다.query allPostsByAuthor { allPostsByAuthor( author: "AUTHORNAME" limit: 5 nextToken: "<token>" ) { posts { id title } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPostsByAuthor
를 선택합니다.AUTHORNAME
이 작성한 나머지 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.{ "data": { "allPostsByAuthor": { "posts": [ { "id": "8", "title": "A series of posts, Volume 8" }, { "id": "5", "title": "A series of posts, Volume 5" }, { "id": "3", "title": "A series of posts, Volume 3" }, { "id": "9", "title": "A series of posts, Volume 9" } ], "nextToken": null } } }
집합 사용
지금까지 Post
유형은 플랫 키/값 객체였습니다. 또한 해석기를 사용하여 집합, 목록 및 맵 등과 같은 복잡한 객체를 모델링할 수 있습니다. 태그를 포함하도록 Post
형식을 업데이트해 보겠습니다. 게시물에는 태그가 0개 이상 있을 수 있는데, 태그는 DynamoDB에 문자열 집합으로 저장됩니다. 또한 태그를 추가 및 제거하는 몇 가지 변형과 특정 태그가 지정된 게시물을 스캔하는 새 쿼리를 설정해 볼 것입니다.
데이터를 설정하려면
-
API에서 스키마 탭을 선택합니다.
-
스키마 창에서 다음과 같이
Post
형식을 수정하여 새로운tags
필드를 추가할 수 있습니다.type Post { id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! tags: [String!] }
-
스키마 창에서 다음과 같이
Query
형식을 수정하여 새로운allPostsByTag
쿼리를 추가할 수 있습니다.type Query { allPostsByTag(tag: String!, limit: Int, nextToken: String): PaginatedPosts! allPostsByAuthor(author: String!, limit: Int, nextToken: String): PaginatedPosts! allPost(limit: Int, nextToken: String): PaginatedPosts! getPost(id: ID): Post }
-
스키마 창에서 다음과 같이
Mutation
유형을 수정하여 새로운addTag
및removeTag
뮤테이션을 추가할 수 있습니다.type Mutation { addTag(id: ID!, tag: String!): Post removeTag(id: ID!, tag: String!): Post deletePost(id: ID!, expectedVersion: Int): Post upvotePost(id: ID!): Post downvotePost(id: ID!): Post updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( author: String!, title: String!, content: String!, url: String! ): Post! }
-
스키마 저장(Save Schema)을 선택합니다.
-
오른쪽의 해석기 창에서
Query
유형에 새로 생성된allPostsByTag
필드를 찾은 다음 연결을 선택합니다. 아래 코드 조각을 사용하여 해석기를 만듭니다.import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { limit = 20, nextToken, tag } = ctx.arguments; return ddb.scan({ limit, nextToken, filter: { tags: { contains: tag } } }); } export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
-
해석기의 모든 변경 사항을 저장합니다.
-
이제 아래 코드 조각을 사용하여
Mutation
필드addTag
에 대해 동일한 작업을 수행합니다:참고
DynamoDB 유틸리티는 현재 집합 작업을 지원하지 않지만, 직접 요청을 작성하여 집합과 상호 작용할 수 있습니다.
import { util } from '@aws-appsync/utils' export function request(ctx) { const { id, tag } = ctx.arguments const expressionValues = util.dynamodb.toMapValues({ ':plusOne': 1 }) expressionValues[':tags'] = util.dynamodb.toStringSet([tag]) return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: `ADD tags :tags, version :plusOne`, expressionValues, }, } } export const response = (ctx) => ctx.result
-
해석기의 모든 변경 사항을 저장합니다.
-
아래 코드 조각을 사용하여
Mutation
필드removeTag
에 대해 이 작업을 한 번 더 반복합니다.import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id, tag } = ctx.arguments; const expressionValues = util.dynamodb.toMapValues({ ':plusOne': 1 }); expressionValues[':tags'] = util.dynamodb.toStringSet([tag]); return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: `DELETE tags :tags ADD version :plusOne`, expressionValues, }, }; } export const response = (ctx) => ctx.resultexport
-
해석기의 모든 변경 사항을 저장합니다.
태그를 사용하는 API 직접 호출
이제 해석기를 설정했으므로 수신되는 , addTag
removeTag
및 allPostsByTag
요청을 DynamoDB UpdateItem
및 Scan
작업으로 변환하는 방법을 AWS AppSync 알아봅니다. 실행해 보기 위해 이전에 생성한 게시물 중 선택해 보겠습니다. 예를 들어, Nadia
에서 작성한 게시물을 사용해 보겠습니다.
태그를 사용하려면
-
API에서 쿼리 탭을 선택합니다.
-
쿼리 창에 다음 쿼리를 추가합니다.
query allPostsByAuthor { allPostsByAuthor( author: "Nadia" ) { posts { id title } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPostsByAuthor
를 선택합니다. -
Nadia의 모든 게시물이 쿼리 창 오른쪽에 있는 결과 창에 나타나야 합니다. 예를 들면 다음과 같아야 합니다.
{ "data": { "allPostsByAuthor": { "posts": [ { "id": "10", "title": "The cutest dog in the world" }, { "id": "11", "title": "Did you known...?" } ], "nextToken": null } } }
-
세상에서 가장 귀여운 강아지라는 제목이 붙은 게시물을 사용해 봅시다. 나중에 사용할 것이기 때문에 이 게시물의
id
를 기록해 둡니다. 이제dog
태그를 추가해 보겠습니다. -
쿼리 창에 다음 뮤테이션을 추가합니다. 또한 앞서 적어둔 값을 갖도록
id
인수를 업데이트해야 합니다.mutation addTag { addTag(id:10 tag: "dog") { id title tags } }
-
실행(주황색 재생 버튼)을 선택한 다음
addTag
를 선택합니다. 다음과 같이 새 태그로 게시물이 업데이트됩니다.{ "data": { "addTag": { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog" ] } } }
-
태그를 더 추가할 수 있습니다.
tag
인수를puppy
로 변경하도록 뮤테이션을 업데이트합니다.mutation addTag { addTag(id:10 tag: "puppy") { id title tags } }
-
실행(주황색 재생 버튼)을 선택한 다음
addTag
를 선택합니다. 다음과 같이 새 태그로 게시물이 업데이트됩니다.{ "data": { "addTag": { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog", "puppy" ] } } }
-
태그를 삭제할 수도 있습니다. 쿼리 창에 다음 뮤테이션을 추가합니다. 또한 앞서 적어둔 값을 갖도록
id
인수를 업데이트해야 합니다.mutation removeTag { removeTag(id:10 tag: "puppy") { id title tags } }
-
실행(주황색 재생 버튼)을 선택한 다음
removeTag
를 선택합니다. 게시물이 업데이트되고puppy
태그가 삭제됩니다.{ "data": { "addTag": { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog" ] } } }
-
또한 태그가 지정된 게시물을 모두 검색할 수도 있습니다. 쿼리 창에 다음 쿼리를 추가합니다.
query allPostsByTag { allPostsByTag(tag: "dog") { posts { id title tags } nextToken } }
-
실행(주황색 재생 버튼)을 선택한 다음
allPostsByTag
를 선택합니다.dog
태그가 지정된 게시물이 다음과 같이 모두 반환됩니다.{ "data": { "allPostsByTag": { "posts": [ { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog", "puppy" ] } ], "nextToken": null } } }
결론
이 자습서에서는 AWS AppSync 및 GraphQL을 사용하여 DynamoDB의 Post
객체를 조작할 수 있는 API를 구축했습니다.
정리하려면 콘솔에서 AWS AppSync GraphQL API를 삭제하면 됩니다.
DynamoDB 테이블과 연결된 역할을 삭제하려면 데이터 소스 테이블에서 데이터 소스를 선택하고 편집을 클릭합니다. 새 역할 생성 또는 기존 역할 사용에서 역할 값을 기록해 둡니다. IAM 콘솔로 이동하여 역할을 삭제합니다.
DynamoDB 테이블을 삭제하려면 데이터 소스 목록에서 테이블 이름을 클릭합니다. 그러면 테이블을 삭제할 수 있는 DynamoDB 콘솔로 이동합니다.