serverless

AWS AppSync GraphQL

최시엘 2025. 1. 7. 10:48

AWS AppSync는 AWS에서 제공하는 완전 관리형 GraphQL 서비스입니다. AppSync를 사용하면 클라이언트 애플리케이션이 서버에서 데이터를 가져오고, 변경하고, 실시간으로 구독할 수 있습니다. GraphQL을 사용하여 클라이언트는 필요한 데이터만 쿼리할 수 있으며, 백엔드의 구조에 대한 지식 없이도 데이터를 효율적으로 사용할 수 있습니다.

GraphQL은 Facebook에서 개발한 데이터 쿼리 언어로, 클라이언트가 필요한 데이터의 구조를 명확하게 정의할 수 있습니다. REST API와 달리, GraphQL은 단일 엔드포인트를 통해 다양한 데이터 요청을 처리할 수 있습니다.
AWS AppSync를 사용하면 개발자가 안전한 서버리스 고성능 GraphQL 및 Pub/Sub API를 사용하여 애플리케이션과 서비스 데이터 및 이벤트에 연결할 수 있다고 한다.

 

  • 단일 GraphQL API 엔드포인트에서 하나 이상의 데이터 소스의 데이터에 액세스합니다.
  • 여러 소스 GraphQL API를 하나의 병합된 GraphQL API로 결합합니다.
  • 애플리케이션에 실시간 데이터 업데이트를 게시할 수 있습니다.
  • 내장된 보안, 모니터링, 로깅 및 추적을 활용하고 지연 시간을 줄이기 위한 선택적 캐싱을 활용합니다.
  • API 요청 및 전송된 모든 실시간 메시지에 대해서만 비용을 지불하면 됩니다.

AWS AppSync 기능

  • GraphQL로 구동되는 간소화된 데이터 액세스 및 쿼리
  • GraphQL 구독 및 게시/구독 채널을 위한 서버리스 WebSocket
  • 서버 측 캐싱을 통해 데이터를 고속 인 메모리 캐시에서 사용할 수 있도록 하여 지연 시간을 단축합니다.
  • 비즈니스 로직 작성을 위한 JavaScript 및 TypeScript 지원
  • API 액세스를 제한하는 비공개 API를 통한 엔터프라이즈 보안 및 AWS WAF 통합
  • API 키, IAM, Amazon Cognito, OpenID Connect 공급자, 사용자 지정 로직에 대한 Lambda 권한 부여를 지원하는 권한 부여 제어 기능이 내장되어 있습니다.
  • 연동 사용 사례를 지원하기 위한 병합된 API

관련 서비스

  • 웹 또는 모바일 앱을 처음부터 빌드하는 경우 AWS Amplify 사용을 고려해 보세요. Amplify는 AWS AppSync 및 기타 AWS 서비스를 활용하여 더 적은 작업으로 더 강력하고 강력한 웹 및 모바일 앱을 빌 드할 수 있도록 지원합니다.

GraphQL 및 AWS AppSync 아키텍처

GraphQL은 API를 위한 쿼리 및 조작 언어입니다. GraphQL은 데이터 요구 사항 및 상호 작용을 설명하 는 유연하고 직관적인 구문을 제공합니다. 이를 통해 개발자는 필요한 것이 무엇인지 정확히 물어보고 예측 가능한 결과를 얻을 수 있습니다. 또한 단일 요청으로 여러 소스에 액세스할 수 있어 네트워크 호 출 수와 대역폭 요구 사항이 감소하므로 애플리케이션이 소비하는 배터리 수명과 CPU 주기가 절약됩니다.

 

변형을 통해 데이터 업데이트가 간단하게 이루어지므로 개발자는 데이터가 변경되어야 하는 방식을 설명할 수 있습니다. 또한 GraphQL은 구독을 통해 실시간 솔루션을 빠르게 설정할 수 있도록 합니다. 이러한 모든 기능이 강력한 개발자 도구와 결합된 GraphQL은 애플리케이션 데이터 관리에 필수입니다.

 

GraphQL은 REST의 대안입니다. RESTful 아키텍처는 현재 클라이언트-서버 통신에 가장 많이 사용되 는 솔루션 중 하나입니다. 이 아키텍처는 URL을 통해 리소스(데이터)가 노출된다는 개념에 중점을 둡 니다. 이러한 URL을 사용하여 GET, POST, DELETE 등의 HTTP 메서드 형식으로 CRUD(생성, 읽기, 업 데이트, 삭제) 작업을 통해 데이터에 액세스하고 데이터를 조작할 수 있습니다. REST의 장점은 학습과 구현이 비교적 간단하다는 점입니다. RESTful API를 빠르게 설정하여 다양한 서비스를 직접적으로 호 출할 수 있습니다.

하지만 기술은 점점 더 복잡해지고 있습니다. 애플리케이션, 도구, 서비스가 전 세계 사용자를 대상으 로 확장되기 시작하면서 빠르고 확장 가능한 아키텍처의 필요성이 무엇보다 중요해졌습니다. REST는 확장성이 요구되는 작업을 처리할 때 많은 단점이 있습니다.

GraphQL이란?

GraphQL은 API의 쿼리 언어이자 해당 쿼리를 실행하는 런타임입니다. GraphQL을 사용하면 클라이언 트가 필요한 데이터를 정확히 요청할 수 있으므로 많은 시나리오에서 REST에 대한 유연하고 효율적인 대안을 제공합니다. 사전 정의된 엔드포인트에 의존하는 REST와 달리 GraphQL은 클라이언트가 쿼리 및 변형 형태로 데이터 요구 사항을 지정할 수 있는 단일 엔드포인트를 사용합니다.

 

REST 및 GraphQL 비교

API(Application Programming Interface)는 애플리케이션 간의 데이터 교환을 용이하게 하는 데 중요한 역할을 합니다. 앞서 언급한 바와 같이 GraphQL 및 REST는 API 설계를 위한 두 가지 주된 접근 방식 입니다. 두 가지 모두 클라이언트-서버 통신을 활성화하는 기본 목적을 수행하지만 구현 및 사용 사례 에서 크게 다릅니다.

GraphQL과 REST의 공통점

1. 클라이언트-서버 모델: 둘 모두 데이터 교환을 위해 클라이언트-서버 아키텍처를 사용합니다.

2. 무상태: 둘 모두 요청 간 클라이언트 세션 정보를 유지하지 않습니다.

3. HTTP 기반: 둘 모두 일반적으로 HTTP를 기본 통신 프로토콜로 사용합니다.

4. 리소스 지향 설계: 둘 모두 클라이언트가 API를 통해 액세스하고 조작할 수 있는 모든 데이터 또는 객체를 가리키는 리소스와 관련된 데이터 교환을 설계합니다.

5. 데이터 형식 유연성: JSON은 둘 모두에서 가장 일반적으로 사용되는 데이터 교환 형식이지만 XML 및 HTML과 같은 다른 형식도 지원됩니다.

6. 언어 및 데이터베이스 애그노스틱: 둘 모두 모든 프로그래밍 언어 또는 데이터베이스 구조에서 작동 할 수 있으므로 상호 운용성이 뛰어납니다.

7. 캐싱 지원: 둘 모두 캐싱을 지원하므로 클라이언트와 서버가 자주 액세스하는 데이터를 저장하여 성 능을 개선할 수 있습니다.

 

GraphQL과 REST의 차이점

1. 요청 구조 및 데이터 가져오기 REST는 다양한 HTTP 메서드(GET, POST, PUT, DELETE)를 사용하여 리소스에 대한 작업을 수행 합니다. 이 경우 주로 여러 리소스에 다중 엔드포인트가 필요하므로, 그에 따라 데이터 검색이 비효 율적으로 진행될 수 있습니다. 예를 들어 GET 작업을 실행하여 사용자의 데이터를 검색하면 데이터 를 지나치게 많거나 적게 가져올 수 있습니다. 올바른 데이터를 가져오려면 잘라내기 또는 다중 작 업을 직접적으로 호출할 수 있습니다. GraphQL은 모든 작업에 단일 엔드포인트를 사용합니다. 이는 데이터 가져오기를 위한 쿼리와 데이 터 수정을 위한 변형에 의존합니다. 클라이언트는 쿼리를 사용하여 단일 요청에서 필요한 데이터를 정확히 가져올 수 있으므로 데이터 전송을 최소화하여 네트워크 오버헤드를 줄일 수 있습니다.

2. 서버측 스키마 REST에는 서버측 스키마가 필요하지 않지만 효율적인 API 설계 및 문서화를 위해 선택적으로 정의 할 수 있습니다. GraphQL은 강력한 형식의 서버측 스키마를 사용하여 데이터 및 데이터 서비스를 정의합니다. GraphQL Schema Definition Language(SDL)로 작성된 스키마에는 각 객체에 대한 객체 유형 및 필 드와 각 필드에 대한 작업을 정의하는 서버측 해석기 함수가 포함됩니다.

3. 버전 관리 REST에는 종종 URL에 버전 관리가 포함되어 여러 API 버전을 동시에 유지할 수 있습니다. 버전 관 리는 필수는 아니지만 변경 사항을 방지하는 데 도움이 될 수 있습니다. GraphQL은 이전 버전과의 호환성을 요구하여 명시적 버전 관리 없이 API의 지속적인 발전을 촉진 합니다. 삭제된 필드는 오류 메시지를 반환하는 반면 사용 중단 태그는 이전 필드를 단계적으로 제 거하고 경고 메시지를 반환합니다.

4. 오류 처리 REST가 약하게 입력되므로 주변 코드에 오류 처리를 구축해야 합니다. 이렇게 하면 유형 관련 오류 가 자동으로 식별되지 않을 수 있습니다(예: 숫자를 텍스트로 구문 분석). 반면 GraphQL은 강력하게 입력되며 포괄적인 스키마 정의가 필요합니다. 이렇게 하면 높은 수준의 세부 정보로 많은 요청 오류를 자동으로 식별할 수 있습니다.

 

GraphQL 스키마 정의

type Query {
  getUser(id: ID!): User
  listUsers: [User]
}

type Mutation {
  createUser(name: String!, email: String!): User
  updateUser(id: ID!, name: String, email: String): User
  deleteUser(id: ID!): User
}

type User {
  id: ID!
  name: String!
  email: String!
}

 

스키마에 User, Query, Mutation 이라는 세 가지 유형이 정의 되어있다.

User는 id, name, email의 필드로 이루어진 객체이고,

Query은 소스에서 데이터를 검색(RESTful 의 GET),

Mutation은 데이터 수정과 같은 상태 변경 작업 (PUT, POST)을 한다.

 

GraphQL 쿼리 예제

# Get a user by ID
query {
  getUser(id: "1") {
    id
    name
    email
  }
}

# List all users
query {
  listUsers {
    id
    name
    email
  }
}

# Create a new user
mutation {
  createUser(name: "John Doe", email: "john.doe@example.com") {
    id
    name 
    email
  }
}

# Update an existing user
mutation {
  updateUser(id: "1", name: "Jane Doe", email: "jane.doe@example.com"){
    id
    name
    email
  }
}

# Delete a user
mutation {
  deleteUser(id: "1") {
    id
    name
    email
  }
}

CRUD 뮤테이션을 통해 create, update, delete 기능을 실행.

 

AWS AppSync 설정 예제

AppSync 콘솔에서 GraphQL API 생성:
AWS Management Console에서 AppSync를 선택하고 새로운 GraphQL API를 생성합니다.
스키마를 정의하고 데이터 소스를 설정합니다.


AppSync 클라이언트 설정:
AWS Amplify 라이브러리를 사용하여 클라이언트 애플리케이션에서 AppSync를 설정할 수 있습니다.

 
import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';
import { API, graphqlOperation } from 'aws-amplify';
import { createUser, updateUser, deleteUser } from './graphql/mutations';
import { getUser, listUsers } from './graphql/queries';

Amplify.configure(awsconfig);

// Create a new user
const newUser = await API.graphql(graphqlOperation(createUser, { input: { name: "John Doe", email: "john.doe@example.com" } }));

// Get a user by ID
const user = await API.graphql(graphqlOperation(getUser, { id: "1" }));

// List all users
const users = await API.graphql(graphqlOperation(listUsers));

// Update an existing user
const updatedUser = await API.graphql(graphqlOperation(updateUser, { input: { id: "1", name: "Jane Doe", email: "jane.doe@example.com" } }));

// Delete a user
const deletedUser = await API.graphql(graphqlOperation(deleteUser, { input: { id: "1" } }));
 

 

위 예제를 통해 AWS AppSync와 GraphQL을 사용하여 클라이언트 애플리케이션에서 데이터를 쿼리하고, 변경, 삭제할 수 있다.