AppSync는 AWS에서 제공하는 Managed GraphQL 서비스이다. 즉, 서버리스의 형태로 GraphQL 백엔드를 개발할 수 있는 서비스이다.
AppSyn 를 사용하지 않고도 AWS Lambda 등을 활용하여 GraphQL 백엔드를 구축하는 것이 가능했으나, 이 경우에는 Lambda 메모리 사이즈, 콜드스타트, DataSource와의 통신, 인증된 유저 토큰 처리 등등 고민해야하고 직접 개발해야하는 것들이 더 많았다. 그러나 AppSync 를 활용하면 GraphQL 스키마를 작성하고 스키마의 각각의 필드에 대한 resolvers 를 작성하는 것만으로도 GraphQL 엔드포인트를 생성할 수 있다.
Resolver
AppSync에서는 resolver를 VTL이라는 자바 기반 템플릿 언어으로 작성한다.
AppSync에서는 request와 response할 시에 호출될 resolver를 각각 정의해줘야 한다. 따라서 각각의 필드에 대하여 request mapping template과 response mapping template이 한쌍을 이뤄 하나의 resolver를 이루게 된다. AppSync 에서 사용할 수 있는 resolver 타입은 2종류가 있다.
- Unit Resolver
- 간단한 형태로 구성되어있고, 한 개의 데이터소스(DynamoDB, RDS 등)와 연결시켜서 request 와 response 를 처리해주는 resolver이다.
- Pipeline Resolver
-
백엔드 API 를 개발하다보면 Unit resolvers로 해결되지 않는 복잡한 로직들이 많다. 예를 들면, Friendship 테이블에서 두 사람이 친구로 등록된 경우에만 해당 로직을 처리한다던지, 포인트를 사용하여 결제하려는 경우 Point 테이블에서 유저의 포인트가 충분한 경우에만 결제 로직을 처리한다던지 등 여러가지 상황들이 있다. 이럴 때 Pipeline resolvers를 활용할 수 있다.
request mapping template
+response mapping template
쌍을 Function으로 등록하여 사용한다. 이 Function은 다른 resolver 에서도 사용할 수 있어서, 공통적인 로직을 만들어두고 다양한 resolver에서 사용하는 패턴 등의 활용이 가능하다. -
Scalar Types
알고 계시듯이 GraphQL은 쿼리언어 자체적으로 type check을 처리해준다. 그러므로 request 나 response 에서 주고받는 데이터 각각이 Int 타입인지 String 타입인지를 개발자가 고려할 필요가 없다.
GraphQL에서 정의하고 있는 일반적인 Scalar 타입은 아래와 같다.
- ID
- String
- Int
- Float
- Double
이에 추가적으로 AppSync에서 제공하는 Scalar 타입을 활용하면 더욱 편리하게 API를 개발할 수 있다.
- AWSDate
- AWSTime
- AWSDateTime
- AWSTimestamp
- AWSEmail
- AWSJSON
- AWSURL
- AWSPhone
- AWSIPAddress
이러한 Scalar type 을 활용하여 커스텀 타입을 지정할 수 있다.
예시
appsync를 생성해보자.
우선 프로젝트 디렉토리를 구성한다.
그리고 먼저 serverless-appsync-plugin를 설치해준다.
Schema
이제 스키마를 작성해보자. serverless-appsync-plugin
에서 Schema stitching 이라는 기능을 제공하고 있기때문에 모듈별로 분리해서 스키마를 작성하는 것이 가능하다.
3가지 스키마 파일을 생성했다면 각각 아래와 같이 스키마를 작성해준다.
Resolvers
resolvers 폴더로 이동하여 resolver 파일을 생성해보자.
파일명은 serverless-appsync-plugin에서 default로 인식하는 {type}.{field}.request.vtl
, {type}.{field}.respose.vtl
로 지정하였고, 내용은 이곳에 있는 내용을 기반으로 작성했다.
serverless.yml
위에서 본 모든 리소스들이 serverless.yml
에 마지막으로 정리된다.
배포하기
프로젝트 디렉토리에서 이 명령어를 치면 CloudFormation을 통해 배포가 시작된다.
참고
- https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html
- https://docs.aws.amazon.com/appsync/latest/devguide/real-time-data.html
- https://github.com/twkiiim/appsync-tutorial
- https://medium.com/@wesselsbernd/bff-back-end-for-front-end-architecture-as-of-may-2019-5d09b913a8ed
- https://www.youtube.com/watch?v=rjiiNpJzOYk