GraphQL 소개 및 사용법 (Introduction to GraphQL and How to Use It)
GraphQL은 데이터 쿼리 언어로, 클라이언트가 필요한 데이터만 정확히 요청할 수 있게 해주며, 서버와 클라이언트 간의 데이터 전송을 더 효율적으로 만들어 줍니다. GraphQL은 페이스북에서 개발되어 2015년에 오픈 소스로 공개되었습니다. 이 문서에서는 GraphQL의 기본 개념과 사용법, Node.js에서 GraphQL을 사용하는 방법을 상세히 설명합니다.
GraphQL의 기본 개념 (Basic Concepts of GraphQL)
GraphQL은 다음과 같은 주요 개념으로 구성됩니다:
- 쿼리 (Query): 클라이언트가 서버에 데이터 요청을 할 때 사용하는 쿼리입니다. 클라이언트는 자신이 필요한 데이터의 형태와 필드를 명확히 정의할 수 있습니다.
- 뮤테이션 (Mutation): 서버의 데이터를 생성, 업데이트, 삭제할 때 사용하는 쿼리입니다.
- 스키마 (Schema): GraphQL API의 구조를 정의하는 스키마입니다. 데이터 타입과 쿼리, 뮤테이션의 형태를 명시합니다.
- 리졸버 (Resolver): GraphQL 서버에서 쿼리와 뮤테이션을 처리하는 함수입니다. 클라이언트의 요청에 따라 데이터를 반환합니다.
GraphQL의 장점 (Advantages of GraphQL)
- 정확한 데이터 요청: 클라이언트는 필요한 데이터만 요청할 수 있어, 오버페칭(over-fetching)과 언더페칭(under-fetching) 문제를 줄일 수 있습니다.
- 단일 엔드포인트: RESTful API에서는 여러 엔드포인트를 사용하지만, GraphQL에서는 하나의 엔드포인트로 모든 요청을 처리합니다.
- 강력한 타입 시스템: GraphQL은 강력한 타입 시스템을 통해 API의 계약을 명확히 하고, 자동으로 문서화를 제공합니다.
GraphQL 설치 및 설정 (Installing and Setting Up GraphQL)
Node.js에서 GraphQL을 사용하려면 다음과 같은 라이브러리를 설치하고 설정해야 합니다.
- 프로젝트 초기화 및 패키지 설치: 새로운 Node.js 프로젝트를 생성하고 필요한 패키지를 설치합니다.
mkdir graphql-example cd graphql-example npm init -y npm install graphql express express-graphql
- 서버 설정: Express와
express-graphql
을 사용하여 GraphQL 서버를 설정합니다.
// index.js const express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); // GraphQL 스키마 정의 const schema = buildSchema(` type Query { hello: String } `); // 리졸버 정의 const root = { hello: () => 'Hello, world!', }; const app = express(); app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, // GraphiQL 인터페이스 활성화 })); app.listen(4000, () => console.log('Running a GraphQL API server at http://localhost:4000/graphql'));
위 코드는 간단한 GraphQL 서버를 설정합니다. /graphql
엔드포인트에서 GraphQL 쿼리를 실행할 수 있습니다.
GraphQL 쿼리 및 뮤테이션 (GraphQL Queries and Mutations)
GraphQL 서버를 구축한 후, 클라이언트에서 쿼리와 뮤테이션을 작성할 수 있습니다.
- 쿼리 (Query): 클라이언트는 GraphiQL 또는 다른 GraphQL 클라이언트를 사용하여 쿼리를 실행할 수 있습니다.
query { hello }
위 쿼리는 hello
필드를 요청하여 서버로부터 “Hello, world!”를 반환받습니다.
- 뮤테이션 (Mutation): 데이터를 변경하는 뮤테이션을 정의할 수 있습니다. 다음 예제에서는 간단한 뮤테이션을 추가합니다.
// index.js (계속) const schema = buildSchema(` type Query { hello: String } type Mutation { setMessage(message: String!): String } `); let message = 'Hello, world!'; const root = { hello: () => message, setMessage: ({ message: newMessage }) => { message = newMessage; return message; }, };
위 코드에서는 setMessage
뮤테이션을 추가하여 message
값을 변경할 수 있습니다.
mutation { setMessage(message: "New message") }
위 뮤테이션은 서버에서 message
값을 “New message”로 변경합니다.
GraphQL 스키마 디자인 (Designing GraphQL Schema)
GraphQL 스키마는 애플리케이션의 데이터 구조와 상호작용을 정의합니다. 스키마를 디자인할 때는 데이터 타입과 쿼리, 뮤테이션을 신중하게 정의해야 합니다.
- 타입 정의: 스키마에서 다양한 데이터 타입을 정의합니다. 예를 들어, 사용자(User)와 게시물(Post) 타입을 정의할 수 있습니다.
const schema = buildSchema(` type User { id: ID! name: String email: String } type Post { id: ID! title: String body: String author: User } type Query { users: [User] posts: [Post] } `);
- 리졸버 정의: 각 쿼리와 뮤테이션에 대한 리졸버를 정의합니다.
const root = { users: () => { return [ { id: '1', name: 'John Doe', email: 'john@example.com' }, { id: '2', name: 'Jane Doe', email: 'jane@example.com' } ]; }, posts: () => { return [ { id: '1', title: 'GraphQL Basics', body: 'Learn the basics of GraphQL.', author: { id: '1', name: 'John Doe', email: 'john@example.com' } }, { id: '2', title: 'Advanced GraphQL', body: 'Dive into advanced GraphQL features.', author: { id: '2', name: 'Jane Doe', email: 'jane@example.com' } } ]; } };
위 예제는 users
와 posts
쿼리에 대한 리졸버를 정의하여, 각각 사용자와 게시물 데이터를 반환합니다.
GraphQL 도구 및 클라이언트 (GraphQL Tools and Clients)
GraphQL을 사용할 때 다양한 도구와 클라이언트를 사용할 수 있습니다.
- GraphiQL: GraphQL 쿼리를 작성하고 테스트할 수 있는 웹 기반 IDE입니다. 위 코드에서
graphiql: true
로 활성화했습니다. - Apollo Client: 클라이언트 측에서 GraphQL 쿼리를 작성하고 데이터를 관리하는 데 사용할 수 있는 라이브러리입니다.
npm install @apollo/client graphql
클라이언트 코드 예제:
import { ApolloClient, InMemoryCache, gql } from '@apollo/client'; const client = new ApolloClient({ uri: 'http://localhost:4000/graphql', cache: new InMemoryCache() }); client .query({ query: gql` query { hello } ` }) .then(result => console.log(result));
- GraphQL Playground: GraphQL 쿼리와 뮤테이션을 작성하고 실행할 수 있는 대화형 웹 UI입니다.
결론
GraphQL은 효율적이고 유연한 데이터 쿼리와 관리를 가능하게 하는 강력한 도구입니다. Node.js와 함께 GraphQL을 사용하면 데이터 요청과 응답을 더욱 효율적으로 관리할 수 있으며, 클라이언트와 서버 간의 상호작용을 최적화할 수 있습니다. GraphQL의 강력한 타입 시스템과 쿼리 언어를 활용하여, 복잡한 데이터 요구 사항을 명확하고 직관적으로 처리할 수 있습니다.