AWS AppSync에서 일대다 연관을 한 요청으로 가져오기

3163 단어 AppSyncGraphQLAWS

개요



AWS AppSync는 AWS에 GraphQL 서버를 구축할 수 있는 관리형 서비스입니다.
GraphQL의 특징의 하나로서, 취득하는 필드를 클라이언트측으로부터 지정할 수 있는 점이 있습니다.

GraphQL 및 중첩 필드



GraphQL 스키마에서는 한 유형의 필드에 다른 유형을 지정할 수도 있습니다.

GraphQL 스키마
type User {
  name: String!
  posts: [Post]
}

type Post {
  id: ID!
  content: String!
  user: User!
}

이 스키마에 적절하게 해석기를 연결하면,
  • 게시물과 그것을 만든 사용자 가져 오기
  • 사용자와 그 사용자가 만든 Post의 배열을 얻는다

  • 라고 하는 데이터를 1 리퀘스트로 요구할 수 있게 됩니다.

    의문점



    위의 예와 같이 UserPost 라는 모델이 있고, 그것을 UserTablePostTable 라는 테이블에 따로 따로 저장하고 있다고 합니다.PostTable 에는 userId 라는 속성이 있어, 이것이 테이블간을 조인하는 외래 키가 됩니다.

    이제 중첩 필드를 포함하여 데이터를 검색하는 GraphQL 쿼리는 다음과 같습니다.

    GraphQL 쿼리
    query getPost {
      getPost(id: "99999") {
        id
        content
        user {
          name
        }
      }
    }
    
    Post 는 쿼리의 인수로 주어진 id = 99999 로 식별될 수 있습니다.
    하지만 Post 를 작성한 User 는 어떻게 식별하면 좋을까요?
    GraphQL 스키마에는 특정 필드를 외래 키로 표시하는 사양이 없습니다.

    필드에 해석기를 연결


    Post.userUser 형이기 때문에 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을 사용하기 시작할 때 당황한 일이 몇 가지 있기 때문에, 그들을 조금씩 정리해 가면 좋겠습니다.

    좋은 웹페이지 즐겨찾기