GraphQL vs REST – 데이터 통신 방식 비교

GraphQL vs REST – 데이터 통신 방식 비교


현대 웹 애플리케이션 개발에서 데이터 통신 방식은 매우 중요한 요소입니다. REST와 GraphQL은 이러한 데이터 통신 방식을 구현하는 두 가지 주요 방법론입니다. 이번 포스팅에서는 "GraphQL", "REST", "데이터 통신 방식"을 중심으로 이 두 가지 기술을 비교하고, 각 방식의 장단점을 설명하겠습니다. 중급 개발자를 대상으로 상세히 설명하고, 예제를 통해 실습해 보겠습니다.


REST란?


REST(Representational State Transfer)는 HTTP를 사용하여 네트워크 상에서 자원을 정의하고 접근하는 아키텍처 스타일입니다. RESTful API는 클라이언트가 서버의 자원을 CRUD(Create, Read, Update, Delete) 방식으로 조작할 수 있도록 합니다.


REST의 주요 특징


  1. 자원 기반: 모든 것은 자원으로 간주됩니다. 예를 들어, 사용자, 제품, 주문 등이 자원입니다.
  2. 표준 HTTP 메서드 사용: GET, POST, PUT, DELETE 등의 메서드를 사용하여 자원을 조작합니다.
  3. 상태 없음(Stateless): 각 요청은 독립적이며, 서버는 요청 간의 상태를 유지하지 않습니다.
  4. 표현의 일관성: 서버의 응답은 클라이언트가 자원을 일관되게 이해할 수 있도록 설계됩니다.

REST 예제


다음은 Node.js와 Express를 사용하여 간단한 RESTful API를 구현한 예제입니다.


const express = require('express');
const app = express();
app.use(express.json());

let users = [
  { id: 1, name: 'John Doe' },
  { id: 2, name: 'Jane Doe' }
];

// GET 모든 사용자 조회
app.get('/users', (req, res) => {
  res.json(users);
});

// GET 특정 사용자 조회
app.get('/users/:id', (req, res) => {
  const user = users.find(u => u.id === parseInt(req.params.id));
  if (!user) return res.status(404).send('User not found');
  res.json(user);
});

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

// PUT 사용자 수정
app.put('/users/:id', (req, res) => {
  const user = users.find(u => u.id === parseInt(req.params.id));
  if (!user) return res.status(404).send('User not found');

  user.name = req.body.name;
  res.json(user);
});

// DELETE 사용자 삭제
app.delete('/users/:id', (req, res) => {
  users = users.filter(u => u.id !== parseInt(req.params.id));
  res.status(204).send();
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

GraphQL이란?


GraphQL은 Facebook에서 개발한 데이터 쿼리 언어로, 클라이언트가 필요한 데이터만 요청하고 받을 수 있도록 설계되었습니다. GraphQL은 단일 엔드포인트에서 다양한 자원에 접근할 수 있는 유연한 쿼리 방식을 제공합니다.


GraphQL의 주요 특징


  1. 단일 엔드포인트: 모든 요청은 단일 엔드포인트에서 처리됩니다.
  2. 유연한 쿼리: 클라이언트는 필요한 데이터만 선택하여 요청할 수 있습니다.
  3. 타입 시스템: 스키마를 통해 데이터의 구조와 타입을 정의합니다.
  4. 서브스크립션: 실시간 데이터 업데이트를 지원합니다.

GraphQL 예제


다음은 Node.js와 Apollo Server를 사용하여 간단한 GraphQL API를 구현한 예제입니다.


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

let users = [
  { id: 1, name: 'John Doe' },
  { id: 2, name: 'Jane Doe' }
];

const typeDefs = gql`
  type User {
    id: ID!
    name: String!
  }

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

  type Mutation {
    addUser(name: String!): User!
    updateUser(id: ID!, name: String!): User
    deleteUser(id: ID!): Boolean
  }
`;

const resolvers = {
  Query: {
    users: () => users,
    user: (parent, args) => users.find(user => user.id === parseInt(args.id))
  },
  Mutation: {
    addUser: (parent, args) => {
      const user = { id: users.length + 1, name: args.name };
      users.push(user);
      return user;
    },
    updateUser: (parent, args) => {
      const user = users.find(user => user.id === parseInt(args.id));
      if (!user) return null;
      user.name = args.name;
      return user;
    },
    deleteUser: (parent, args) => {
      const index = users.findIndex(user => user.id === parseInt(args.id));
      if (index === -1) return false;
      users.splice(index, 1);
      return true;
    }
  }
};

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

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

GraphQL과 REST의 비교


데이터 요청 방식


  • REST: 각각의 자원에 대해 고유한 URL을 통해 요청합니다. 예를 들어, 사용자 정보를 얻으려면 /users 엔드포인트를 사용하고, 특정 사용자 정보를 얻으려면 /users/:id 엔드포인트를 사용합니다.
  • GraphQL: 단일 엔드포인트를 통해 클라이언트가 필요한 데이터를 선택하여 요청합니다. 예를 들어, 특정 사용자 정보를 얻으려면 클라이언트는 필요한 필드만 선택하여 쿼리를 작성합니다.

유연성


  • REST: 엔드포인트가 고정되어 있어 필요한 데이터 외에도 불필요한 데이터를 포함할 수 있습니다.
  • GraphQL: 클라이언트가 필요한 데이터만 요청할 수 있어, 불필요한 데이터 전송을 줄일 수 있습니다.

성능


  • REST: 과도한 엔드포인트 호출과 불필요한 데이터 전송으로 인해 성능이 저하될 수 있습니다.
  • GraphQL: 필요한 데이터만 선택하여 전송하므로, 네트워크 트래픽을 줄이고 성능을 최적화할 수 있습니다.

스키마와 타입 시스템


  • REST: 고정된 스키마가 없으며, 자원 구조를 명확하게 정의하기 어렵습니다.
  • GraphQL: 명확한 스키마와 타입 시스템을 통해 데이터 구조를 정의하고, 클라이언트와 서버 간의 계약을 유지할 수 있습니다.

실시간 데이터


  • REST: 실시간 데이터 업데이트를 처리하기 위해 별도의 구현이 필요합니다(WebSocket 등).
  • GraphQL: 서브스크립션을 통해 실시간 데이터 업데이트를 쉽게 처리할 수 있습니다.

예제 비교


REST 예제


사용자 정보를 가져오는 REST API 요청 예제입니다.


curl -X GET http://localhost:3000/users

특정 사용자 정보를 가져오는 REST API 요청 예제입니다.


curl -X GET http://localhost:3000/users/1

GraphQL 예제


모든 사용자 정보를 가져오는 GraphQL 쿼리 예제입니다.


query {
  users {
    id
    name
  }
}

특정 사용자 정보를 가져오는 GraphQL 쿼리 예제입니다.


query {
  user(id: "1") {
    id
    name
  }
}

실제 사례


REST 사용 사례


  1. Twitter API: 트위터는 다양한 RESTful API를 제공하여 트윗, 사용자 정보, 팔로워 등 다양한 데이터를 제공하고 있습니다.
  2. GitHub API: GitHub는 RESTful API를 통해 리포지토리, 커밋, 이슈 등의 데이터를 제공하고 있습니다.

GraphQL 사용 사례


  1. Facebook: Facebook은 GraphQL을 사용하여 복잡한 데이터 구조를 효율적으로 처리하고 있습니다.
  2. GitHub: GitHub는 REST API 외에도 GraphQL API를 제공하여 개발자들이 유연하게 데이터를 요청할 수 있도록 지원하고 있습니다.

결론


GraphQL과 REST는 각각의 장단점이 있으며, 특정 상황에 맞는 적절한 기술을 선택하는 것이 중요합니다. REST는 단순하고 널리 사용되는 방식으로, 특정 자원에 대한 CRUD 작업에 적합합니다. 반면, GraphQL은 유연한 쿼리와 단일 엔드포인트를 통해 필요한 데이터만 효율적으로 요청할 수 있어, 복잡한 데이터 구조를 처리하는 데 유리합니다. 애플리케이션의 요구 사항과 특성에 따라 적절한 기술을 선택하여 사용하면, 효율적이고 유지보수하기 쉬운 시스템을 구축할 수 있습니다.

이 포스팅이 GraphQL과 REST의 차이점을 이해하는 데 도움이 되길 바랍니다. 질문이나 추가 정보가 필요하시면 언제든지 댓글로 남겨주세요.

다음 이전