백엔드 개발자라면 REST API와 GraphQL이라는 두 가지 접근 방식을 많이 접해보았을 것입니다. 이 두 가지는 데이터 통합과 클라이언트와 서버 간의 상호작용을 위한 필수적인 도구입니다. 이번 글에서는 REST API와 GraphQL을 활용한 데이터 통합 튜토리얼을 통해 이 두 가지 기술의 장단점을 이해하고, 실제 코드 예제를 통해 어떻게 통합할 수 있는지를 알아보겠습니다.

REST API와 GraphQL의 이해

REST API는 HTTP를 통해 리소스를 CRUD(Create, Read, Update, Delete) 방식으로 조작하는 아키텍처 스타일입니다. 각 리소스는 고유한 URL로 접근되며, JSON 형식으로 데이터를 주고받습니다. REST는 간단하고 직관적이지만, 데이터가 중복되거나 과다하게 전송될 수 있는 단점이 있습니다.

반면 GraphQL은 Facebook이 개발한 쿼리 언어로, 클라이언트가 원하는 데이터의 구조를 요청할 수 있습니다. 즉, 필요하지 않은 데이터를 요청하지 않도록 최적화할 수 있습니다. 이러한 유연성 덕분에 클라이언트와 서버 간의 데이터 전송량을 줄일 수 있습니다.

프로젝트 설정

프로젝트를 설정하기 위해 Express.js와 Apollo Server를 사용할 것입니다. Express.js는 REST API 구축에 유용하며, Apollo Server는 GraphQL API를 쉽게 구축할 수 있게 도와줍니다.

1. 프로젝트 초기화

mkdir data-integration-tutorial
cd data-integration-tutorial
npm init -y
npm install express apollo-server graphql

2. REST API 구축

server.js 파일을 생성하고 간단한 REST API를 구축해보겠습니다.
const express = require('express');
const app = express();
const PORT = 4000;

app.use(express.json());

let data = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
];

// 모든 데이터 조회
app.get('/api/users', (req, res) => {
  res.json(data);
});

// 사용자 추가
app.post('/api/users', (req, res) => {
  const newUser = { id: data.length + 1, name: req.body.name };
  data.push(newUser);
  res.status(201).json(newUser);
});

app.listen(PORT, () => {
  console.log(REST API 서버가 http://localhost:${PORT}에서 실행 중입니다.);
});

3. GraphQL API 구축

이제 GraphQL 서버를 구축해보겠습니다. 같은 server.js 파일에 아래 코드를 추가합니다.

const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql
  type User {
    id: Int
    name: String
  }

  type Query {
    users: [User]
  }

  type Mutation {
    addUser(name: String): User
  }
;

const resolvers = {
  Query: {
    users: () => data,
  },
  Mutation: {
    addUser: (parent, args) => {
      const newUser = { id: data.length + 1, name: args.name };
      data.push(newUser);
      return newUser;
    },
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(GraphQL 서버가 ${url}에서 실행 중입니다.);
});

4. 데이터 통합

이제 REST API와 GraphQL API를 통합해보겠습니다. GraphQL API에서 REST API를 호출하여 데이터를 가져오는 방법을 보여드리겠습니다.

const axios = require('axios');

const resolvers = {
  Query: {
    users: async () => {
      const response = await axios.get('http://localhost:4000/api/users');
      return response.data;
    },
  },
  Mutation: {
    addUser: async (parent, args) => {
      const response = await axios.post('http://localhost:4000/api/users', {
        name: args.name,
      });
      return response.data;
    },
  },
};

위와 같이 users 쿼리와 addUser 뮤테이션을 수정하여 REST API에서 데이터를 가져오고 추가하도록 설정했습니다.

마무리

이번 튜토리얼에서는 REST API와 GraphQL API를 활용하여 데이터를 통합하는 방법을 살펴보았습니다. REST는 간단한 CRUD 작업에 유용하며, GraphQL은 복잡한 데이터 요구를 처리하기에 적합합니다. 이 두 가지 접근 방식을 함께 사용하여 데이터 통합의 유연성을 극대화할 수 있습니다. 실제 프로젝트에서는 두 방식의 장점을 살려 최적의 해결책을 구현해 보시기 바랍니다.