Node.js에서 GraphQL 사용하기: API 개발의 새로운 패러다임

작성일 :

Node.js에서 GraphQL 사용하기: API 개발의 새로운 패러다임

현대의 웹 애플리케이션 개발에서 API는 핵심적인 역할을 합니다. RESTful API가 오랜 기간 동안 주류를 이루었지만, 최근에는 GraphQL이 점차 그 자리를 차지하고 있습니다. 이 글에서는 Node.js 환경에서 GraphQL을 사용하여 효율적인 API를 개발하는 방법을 다루어 보겠습니다.

GraphQL의 기본 개념

GraphQL은 Facebook에서 개발한 쿼리 언어로, 클라이언트가 필요한 데이터만 요청하고 받을 수 있도록 설계되었습니다. 이는 과도한 데이터 전송을 피하고 클라이언트와 서버 사이의 통신을 최적화하는 데 큰 장점을 제공합니다. 주요 개념으로는 스키마, 쿼리, 뮤테이션이 있습니다.

  • 스키마: 데이터 구조를 정의합니다. 스키마는 어떤 타입이 있고, 각 타입이 어떤 필드를 가지는지 명시합니다.
  • 쿼리: 클라이언트가 서버에서 데이터를 가져오는 요청을 말합니다. RESTful API의 GET 요청에 해당합니다.
  • 뮤테이션: 서버의 데이터를 변경하는 요청을 의미합니다. RESTful API의 POST, PUT, DELETE 요청에 해당합니다.

Node.js와 GraphQL 통합하기

Node.js를 통해 GraphQL을 사용하려면 몇 가지 필수 npm 패키지를 설치해야 합니다. 이를 통해 서버를 설정하고 스키마를 정의할 수 있습니다.

bash
npm install express express-graphql graphql

위 명령어로 express, express-graphql, graphql 패키지를 설치합니다. 그 다음, 간단한 Express 서버를 설정해 보겠습니다.

javascript
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');

// 간단한 스키마 정의
const schema = buildSchema(`
  type Query {
    hello: String
  }
`);

// 루트 리졸버 정의
const root = {
  hello: () => {
    return 'Hello, world!';
  },
};

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}));

app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

이제 브라우저에서 http://localhost:4000/graphql에 접속하면 GraphiQL 인터페이스가 나타납니다. 여기서 hello 쿼리를 실행해보면 'Hello, world!'라는 응답을 받을 수 있습니다.

실습: 간단한 GraphQL API 구현

더 복잡한 예제로서 사용자 정보와 관련된 GraphQL API를 만들어 보겠습니다. 먼저 사용자 데이터를 관리하기 위한 기본 스키마를 정의합니다.

javascript
const schema = buildSchema(`
  type User {
    id: ID!
    name: String!
    age: Int
  }

  type Query {
    user(id: ID!): User
    users: [User]
  }

  type Mutation {
    addUser(name: String!, age: Int): User
  }
`);

이 스키마에서는 사용자 타입(User)과 사용자 정보를 가져오는 쿼리(user와 users), 그리고 사용자를 추가하는 뮤테이션(addUser)을 정의했습니다. 이제 해당 스키마의 리졸버를 구현해 보겠습니다.

javascript
let users = [];

const root = {
  user: ({ id }) => {
    return users.find(user => user.id === id);
  },
  users: () => {
    return users;
  },
  addUser: ({ name, age }) => {
    const user = { id: users.length + 1, name, age };
    users.push(user);
    return user;
  },
};

이제 전체 코드를 결합한 완성된 서버 코드는 다음과 같습니다.

javascript
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');

const schema = buildSchema(`
  type User {
    id: ID!
    name: String!
    age: Int
  }
  type Query {
    user(id: ID!): User
    users: [User]
  }
  type Mutation {
    addUser(name: String!, age: Int): User
  }
`);

let users = [];

const root = {
  user: ({ id }) => {
    return users.find(user => user.id === id);
  },
  users: () => {
    return users;
  },
  addUser: ({ name, age }) => {
    const user = { id: users.length + 1, name, age };
    users.push(user);
    return user;
  },
};

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}));

app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

이제 http://localhost:4000/graphql에 접속한 후 GraphiQL 인터페이스에서 다음의 쿼리를 실행하여 사용자를 추가하고 가져올 수 있습니다.

graphql
mutation {
  addUser(name: "John Doe", age: 28) {
    id
    name
    age
  }
}

query {
  users {
    id
    name
    age
  }
}

이 예제에서는 Node.js와 GraphQL을 사용하여 매우 간단한 사용자 관리 API를 구현했습니다. 이를 통해 GraphQL의 기본 개념과 Node.js와의 통합 방법을 이해할 수 있었습니다. 실제 프로젝트에서는 보다 복잡한 스키마와 리졸버, 데이터베이스 연계 등을 고려해야 합니다.

결론

GraphQL은 API 개발에 혁신적인 접근 방식을 제공합니다. 데이터를 효율적으로 전송하고, 클라이언트와 서버 간의 통신을 최적화할 수 있습니다. Node.jsGraphQL의 결합은 현대 웹 애플리케이션 개발에서 매우 강력한 도구가 될 수 있습니다. 이를 통해 개발자는 보다 유연하고 효율적인 API를 구축할 수 있습니다.