AWS 시작하기
풀 스택 React 애플리케이션 구축
AWS Amplify를 사용하여 간단한 웹 애플리케이션 생성
모듈 4: GraphQL API 및 데이터베이스 추가
이 모듈에서는 Amplify CLI와 라이브러리를 사용하여 GraphQL API를 구성하고 앱에 추가합니다.
개요
인증을 적용한 앱을 생성하고 구성했으므로, 이제 API를 추가해보겠습니다.
이 모듈에서는 Amplify CLI와 라이브러리를 사용하여 앱에 API를 추가해봅니다. 여기서 생성할 API는 GraphQL API로, Amazon DynamoDB(NoSQL 데이터베이스) 기반의 AWS AppSync(관리형 GraphQL 서비스)를 사용합니다. (GraphQL에 대한 소개는 GraphQL 웹 사이트를 참조하세요.)
여기서 구축할 앱은 사용자가 메모를 작성하고 삭제하고 나열할 수 있는 Notes 앱입니다. 이 예제를 통해 일반적인 유형의 CRUD+L(생성, 읽기, 업데이트, 삭제 및 나열) 애플리케이션을 구축하는 방법을 살펴볼 수 있습니다.
학습 목표
- GraphQL API 생성 및 배포
- API와 상호 작용하는 프런트엔드 코드 작성
주요 개념
API – 여러 소프트웨어 중개자 간의 통신과 상호 작용을 지원하는 프로그래밍 인터페이스를 제공합니다.
GraphQL – 애플리케이션의 유형이 지정된 표현을 기반으로 쿼리 언어 및 서버 측 API 구현 방식입니다. 이 API 표현 방식은 GraphQL 유형 시스템을 기반으로 한 스키마를 사용하여 선언됩니다.
소요 시간
15분
사용 서비스
구현
-
GraphQL API 및 데이터베이스 생성
a. 앱 디렉터리의 루트에서 다음 명령을 실행하여 앱에 GraphQL API를 추가합니다.
amplify add api ? Select from one of the below mentioned services: GraphQL ? Here is the GraphQL API that we will create. Select a setting to edit or continue: Continue ? Choose a schema template: Single object with fields (e.g., "Todo" with ID, name, description) ? Do you want to edit the schema now? (Y/n) yes
b. 텍스트 편집기에서 GraphQL 스키마를 엽니다. /amplify/backend/api/<api_name>/schema.graphql.
다음 스키마가 포함된 파일을 업데이트합니다.
type Note @model @auth(rules: [ { allow: public } ] ){ id: ID! name: String! description: String }
c. 파일을 저장합니다.
-
API 배포
이제 API가 로컬로 구성되었으므로 API를 배포할 차례입니다. API를 배포하려면 Amplify 푸시 명령을 실행합니다.
amplify push --y
이렇게 하면 다음 세 가지 작업이 수행됩니다.
- AWS AppSync API 생성
- DynamoDB 테이블 생성
- src/graphql에 있는 폴더에 API를 쿼리하는 데 사용할 수 있는 로컬 GraphQL 작업 생성
언제든지 계정의 GraphQL API를 보려면 다음 명령을 실행한 후 왼쪽 탐색 창에서 GraphQL API를 선택합니다.
amplify console api > Choose GraphQL
언제든지 다음 명령을 실행하여 계정의 Amplify 앱을 볼 수 있습니다.
amplify console ? Which site do you want to open? AWS console
-
API와 상호 작용하는 프런트엔드 코드 작성
백엔드가 배포되었으므로, 이제 사용자가 메모를 생성하고 나열하고 삭제할 수 있도록 코드를 작성해보겠습니다.
다음 코드로 src/App.js를 업데이트합니다.
import React, { useState, useEffect } from "react"; import "./App.css"; import "@aws-amplify/ui-react/styles.css"; import { API } from "aws-amplify"; import { Button, Flex, Heading, Text, TextField, View, withAuthenticator, } from "@aws-amplify/ui-react"; import { listNotes } from "./graphql/queries"; import { createNote as createNoteMutation, deleteNote as deleteNoteMutation, } from "./graphql/mutations"; const App = ({ signOut }) => { const [notes, setNotes] = useState([]); useEffect(() => { fetchNotes(); }, []); async function fetchNotes() { const apiData = await API.graphql({ query: listNotes }); const notesFromAPI = apiData.data.listNotes.items; setNotes(notesFromAPI); } async function createNote(event) { event.preventDefault(); const form = new FormData(event.target); const data = { name: form.get("name"), description: form.get("description"), }; await API.graphql({ query: createNoteMutation, variables: { input: data }, }); fetchNotes(); event.target.reset(); } async function deleteNote({ id }) { const newNotes = notes.filter((note) => note.id !== id); setNotes(newNotes); await API.graphql({ query: deleteNoteMutation, variables: { input: { id } }, }); } return ( <View className="App"> <Heading level={1}>My Notes App</Heading> <View as="form" margin="3rem 0" onSubmit={createNote}> <Flex direction="row" justifyContent="center"> <TextField name="name" placeholder="Note Name" label="Note Name" labelHidden variation="quiet" required /> <TextField name="description" placeholder="Note Description" label="Note Description" labelHidden variation="quiet" required /> <Button type="submit" variation="primary"> Create Note </Button> </Flex> </View> <Heading level={2}>Current Notes</Heading> <View margin="3rem 0"> {notes.map((note) => ( <Flex key={note.id || note.name} direction="row" justifyContent="center" alignItems="center" > <Text as="strong" fontWeight={700}> {note.name} </Text> <Text as="span">{note.description}</Text> <Button variation="link" onClick={() => deleteNote(note)}> Delete note </Button> </Flex> ))} </View> <Button onClick={signOut}>Sign Out</Button> </View> ); }; export default withAuthenticator(App);
이 예의 앱에는 세 가지 주요 기능이 있습니다.
- fetchNotes - 이 함수는 API 클래스를 사용하여 GraphQL API로 쿼리를 전송하고 메모의 목록을 가져옵니다.
- createNote - 이 함수도 API 클래스를 사용하여 GraphQL API에 변형을 전송합니다. 이 함수에서는 양식 데이터를 사용하여 새 메모를 생성할 수 있도록 GraphQL 변형에 필요한 변수를 전달한다는 점이 다릅니다.
- deleteNote - 이 함수는 createNote와 마찬가지로 몇 가지 변수와 함께 GraphQL 변형을 전송하지만 메모를 생성하는 것이 아니라 삭제합니다.
-
앱 실행
앱을 테스트하려면 시작 명령을 실행합니다.
npm start
결론
이제 Notes 앱이 생성되었습니다. AWS Amplify를 사용하여 앱에 GraphQL API를 추가하고 생성, 읽기 및 삭제 기능을 구성했습니다. 다음 모듈에서는 앱에 스토리지 서비스를 추가합니다.