시뻘건 개발 도전기

AWS AppSync with DynamoDB 본문

기타/AWS Tech

AWS AppSync with DynamoDB

시뻘건볼때기 2024. 3. 22. 08:47
반응형

AWS에서 2018년 정식 출시한 AppSync를 사용하여 DynamoDB에서 데이터를 조회해본다.

 

GraphQL을 기반으로한 AppSync는 [그림 1]과 같이 AWS Lambda, DynamoDB, Elasticsesarch, Aurora 또는 HTTP를 이용해 브로드캐스팅하여 원본 데이터를 가지고 손쉽게 api를 제공해줄 수 있다. 이를 이용하여 운영 중에도 신규 api가 추가되거나 기존 api의 spec이 변경되거나 신규 앤드포인트가 생겨도 큰 변화 없이 간편하게 api를 제공하기 위함이다.

[그림 1] AppSync의 형태

 

AppSync API 생성

step 1. AppSync > APIs 우측 상단에 API 생성 버튼 클릭

[그림 2] AppSync APIs

 

step 2. API type 선택: GrapgQL APIs, Design from scratch

[그림 3] API type

  1. [그림 3]와 같이 API의 유형과 데이터 소스를 선택할 수 있다.
    1. GraphQL APIs: 단일 백엔드 API에서 데이터를 쿼리하거나 업데이트한다.
    2. Merged APIs: 여러 백엔드 API에서 클라이언트에 데이터를 전달하고 다수의 GraphQL API의 그룹을 관리한다.
  2. DynamoDB를 사용하기위해 DynamoDB data source를 선택해야하나 DynamoDB의 테이블을 먼저 생성하는 것이 선행되어야한다. 지금은 Design from scratch를 선택한다.

 

step 3. API 세부 정보 지정

[그림 4] API 세부 정보 지정

  1. api명과 프라이빗 api 구성을 선택한다.
  2. 프라이빗 api의 경우에는 AWS VPC 내에서만 사용할 api라면 선택해준다. 그러면 기본적으로 외부 네트워크 망에서는 통신할 수 없다.
    1. 자세한 내용 참고: https://aws.amazon.com/ko/blogs/mobile/architecture-patterns-for-aws-appsync-private-apis/
    2. nlb를 사용해서 vpc link를 통해 연결시키는 것을 알 수 있다.

 

step 4. GraphQL 리소스 지정

[그림 5] GraphQL 리소스 지정

  1. GraphQL 리소스 지정을 위해 DynamoDB의 테이블을 선택해야하나, DynamoDB 테이블 생성이 선행되어야하므로 밑에서 생성하여 지정하도록한다. 지금은 “나중에 GraphQL 리소스를 생성”을 선택한다.
 

step 5. schema 생성

  1. 스키마를 아래와같이 작성한다.
    1. Corp type은 java에서의 class라고 생각하면 편하다. Corp라는 모델이다.
    2. Mutation type은 데이터를 변경하기 위한 작업들을 선언한다. 여기서는 addCorp(…)만 선언했다.
    3. Query type은 쿼리를 이용해 데이터를 조회하기 위한 작업들을 선언한다.
    4. schema는 Query와 Mutation이라는 스키마를 선언한다.
    5. 느낌표(!)는 not null을 의미한다.
  2. 우측 상단에 스키마 저장 버튼을 클릭한다.
type Corp {
	id: ID!
	corpNo: String
	name: String
	phoneNumber: String
	author: String
	title: String
	content: String
	url: String
	ups: Int!
	downs: Int!
	version: Int!
}

type Mutation {
	addCorp(corpNo: String!, name: String, phoneNumber: String): Corp!
}

type Query {
	getCorpById(id: ID!): Corp
}

schema {
	query: Query
	mutation: Mutation
}

 

atep 6. 리소스 생성

[그림 6] 리소스 생성

 

[그림 7] DynamoDB table

  1. 우측 상단에 리소스 생성을 클릭한다.
  2. 리소스는 우리가 step5에서 유형을 만들었으므로 “기존 유형 사용”을 선택하고 “유형 선택”에서 우리가 만든 Corp Type을 선택한다.
  3. 생성할 테이블명과 기본 키, 정렬 키를 선택하되, 기본적으로 정렬이 필요없다면 None을 선택한다.
  4. 인덱스 추가 버튼을 클릭하여 인덱스를 생성한다.
  5. GraphQL은 직접 작성할 예정이기 때문에 자동 생성하지 않는다.
  6. [그림 7]과 같이 DynamoDB > 테이블에서 테이블이 생성되었는지 확인한다.
 

step 7. 해석기 연결

[그림 8] 해석기 연결

우측 해석기 지면에서 해석기를 연결한다.

  1. 우리가 만든 Mutation addCorp(…)에 대한 해석기를 연결한다.
    1. 단일 데이터 소스에 저장/조회만 할 것이기 때문에 “단위 해석기”를 선택한다.
  2. 우리가 만든 데이터 원본을 선택한다.
  3. 캐싱은 과금이 되니 주의한다. 캐시를 사용하려면 활성화한다.
  4. 강화 모니터링은 과금이 되니 주의한다. CloudWatch를 통해 모니터링을 할 수 있는 기능인 듯하다.
  5. 우측 하단의 생성을 클릭한다.
  6. 해석기 코드를 아래와같이 입력한다.
    1.  
    2. 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 }
    3. util.autoId() 함수는 aws-appsync/utils에서 제공해주는 랜덤 id 생성기이다. (UUID 랜덩 생성기)
  7. 우측 상단에 저장을 클릭한다.
  8. 마찬가지로 Query 타입에 해당하는 작업에 대해서 해석기를 연결한다.
    1. Query에 연결되는 해석기 코드는 아래와같이 작성한다.
    2. 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
 

step 8. 쿼리 작성

  1. 좌측에 쿼리 탭으로 진입한다.
  2. 아래와 같이 쿼리를 작성한다.
    1. mutation addCorp {
        addCorp(corpNo: "123", name: "가보자고", phoneNumber: "010-8888-0000") {
          id
          corpNo
          name
          phoneNumber
          author
        }
      }
      
      query getCorpById {
        getCorpById(id: "2aeb9ed5-b7ef-4e1c-b539-88f4dd149b80") {
          id
          corpNo
          name
          phoneNumber
          author
          url
          ups
          downs
        }
      }
      
    2. addCorp(…)를 실행하는 mutation을 선언하여 연결된 해석기를 실행한다.
      1. corpNo: 123, name: 가보자고, phoneNumber: 010-8888-0000이고 나머지는 default 값을 사용하여 insert 하겠다는 의미다.
      2. insert된 Object인 Corp 모델을 리턴을 받는데, 여기서 어떤 컬럼들을 받을지를 정의한다.
        1. 위 예시에는 Corp model의 id, corpNo, name, phoneNumber, author만 전달받는다.
        2. 실제로는 Corp type을 통채로 주지만 어떤 컬럼들을 사용할지 정의하는 것이다. (필요에 따라 유연하게 설정이 가능하다는 장점)
    3. getCorpById(…)룰 실행하는 query를 선언하여 연결된 해석기를 실행한다.
      1. id: 2aeb9ed5-b7ef-4e1c-b539-88f4dd149b80인 row를 조회한다.
      2. 조회된 Object인 Corp 모델을 리턴을 받는데, 여기서 어떤 컬럼들을 받을지를 정의한다.
        1. 위 예시에는 id, corpNo, name, phoneNumber, author, url, ups, downs만 전달받는다.
    4. 눈치 챘겠지만, 저장, 조회 모두 리턴되는 Object의 필요한 데이터만 받을 수 있게 손쉽게 작업이 가능하다.

 

step 9. 쿼리 실행

[그림 9] 쿼리 실행
[그림 10] 저장 데이터 조회

  1. 실행 버튼을 클릭하고 원하는 쿼리를 실행한다. 일단 addCorp(…)를 실행하여 데이터를 넣어본다.
    1. 결과는 우측에 노출된다.
  2. getCorpById(…)도 실행해보면 default 값으로 저장된 다른 컬럼들도 확인 할 수 있다.
  3. 실제 DynamoDB의 테이블을 보면 저장된 것을 확인해볼 수 있다.
 

참고 문서

반응형

'기타 > AWS Tech' 카테고리의 다른 글

AWS AppSync with OpenSearch  (1) 2024.03.29
AWS AppSync 알아보기  (1) 2024.03.18
Comments