AWS AppSync에서 일대다 연관을 한 요청으로 가져오기
개요
AWS AppSync는 AWS에 GraphQL 서버를 구축할 수 있는 관리형 서비스입니다.
GraphQL의 특징의 하나로서, 취득하는 필드를 클라이언트측으로부터 지정할 수 있는 점이 있습니다.
GraphQL 및 중첩 필드
GraphQL 스키마에서는 한 유형의 필드에 다른 유형을 지정할 수도 있습니다.
GraphQL 스키마type User {
name: String!
posts: [Post]
}
type Post {
id: ID!
content: String!
user: User!
}
이 스키마에 적절하게 해석기를 연결하면,
GraphQL 스키마에서는 한 유형의 필드에 다른 유형을 지정할 수도 있습니다.
GraphQL 스키마
type User {
name: String!
posts: [Post]
}
type Post {
id: ID!
content: String!
user: User!
}
이 스키마에 적절하게 해석기를 연결하면,
라고 하는 데이터를 1 리퀘스트로 요구할 수 있게 됩니다.
의문점
위의 예와 같이 User
와 Post
라는 모델이 있고, 그것을 UserTable
와 PostTable
라는 테이블에 따로 따로 저장하고 있다고 합니다.PostTable
에는 userId
라는 속성이 있어, 이것이 테이블간을 조인하는 외래 키가 됩니다.
이제 중첩 필드를 포함하여 데이터를 검색하는 GraphQL 쿼리는 다음과 같습니다.
GraphQL 쿼리query getPost {
getPost(id: "99999") {
id
content
user {
name
}
}
}
Post
는 쿼리의 인수로 주어진 id = 99999
로 식별될 수 있습니다.
하지만 Post
를 작성한 User
는 어떻게 식별하면 좋을까요?
GraphQL 스키마에는 특정 필드를 외래 키로 표시하는 사양이 없습니다.
필드에 해석기를 연결
Post.user
가 User
형이기 때문에 userId
라는 이름으로 자동으로 JOIN 해준다는 것은 없습니다.
원하는 동작을 얻으려면 Post.user
에 대한 해석기를 연결합니다.
해석기의 데이터 소스는 이번이면 UserTable
매핑 템플릿은 간단하게 한 건의 아이템을 취득하는 명령을 쓰면 OK입니다.
이번에는 데이터 소스에 Amazon DynamoDB를 사용하고 있으므로 다음과 같습니다.
요청 매핑 템플릿{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.source.userId),
}
}
응답 매핑 템플릿$util.toJson($ctx.result)
포인트는 요청 매핑 템플릿의 UserTable
부분입니다.
이 $ctx.source.userId
에 $ctx.source
쿼리의 실행 결과가 포함되어 있으므로 이를 사용하여 getPost
에 데이터를 가져가기로 갑니다.
요약
모바일 앱/SPA를 개발하면 한 화면에서 필요한 정보가 여러 모델에 걸쳐 요청 수가 늘어나거나, 이들을 정리한 사용하기 어려운 엔드포인트를 만드는 등의 과제가 발생할까 생각합니다.
GraphQL을 사용하면 여러 엔티티에 걸친 데이터의 취득도 매우 간단하게 실현할 수 있습니다.
지금까지 REST를 사용하고 있고, GraphQL을 사용하기 시작할 때 당황한 일이 몇 가지 있기 때문에, 그들을 조금씩 정리해 가면 좋겠습니다.
Reference
이 문제에 관하여(AWS AppSync에서 일대다 연관을 한 요청으로 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tetsushi-ito/items/b03116bf004138b79c9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
query getPost {
getPost(id: "99999") {
id
content
user {
name
}
}
}
Post.user
가 User
형이기 때문에 userId
라는 이름으로 자동으로 JOIN 해준다는 것은 없습니다.원하는 동작을 얻으려면
Post.user
에 대한 해석기를 연결합니다.해석기의 데이터 소스는 이번이면
UserTable
매핑 템플릿은 간단하게 한 건의 아이템을 취득하는 명령을 쓰면 OK입니다.이번에는 데이터 소스에 Amazon DynamoDB를 사용하고 있으므로 다음과 같습니다.
요청 매핑 템플릿
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.source.userId),
}
}
응답 매핑 템플릿
$util.toJson($ctx.result)
포인트는 요청 매핑 템플릿의
UserTable
부분입니다.이
$ctx.source.userId
에 $ctx.source
쿼리의 실행 결과가 포함되어 있으므로 이를 사용하여 getPost
에 데이터를 가져가기로 갑니다.요약
모바일 앱/SPA를 개발하면 한 화면에서 필요한 정보가 여러 모델에 걸쳐 요청 수가 늘어나거나, 이들을 정리한 사용하기 어려운 엔드포인트를 만드는 등의 과제가 발생할까 생각합니다.
GraphQL을 사용하면 여러 엔티티에 걸친 데이터의 취득도 매우 간단하게 실현할 수 있습니다.
지금까지 REST를 사용하고 있고, GraphQL을 사용하기 시작할 때 당황한 일이 몇 가지 있기 때문에, 그들을 조금씩 정리해 가면 좋겠습니다.
Reference
이 문제에 관하여(AWS AppSync에서 일대다 연관을 한 요청으로 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tetsushi-ito/items/b03116bf004138b79c9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(AWS AppSync에서 일대다 연관을 한 요청으로 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tetsushi-ito/items/b03116bf004138b79c9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)