새 프로젝트를 시작할 때 API 설계 방식으로 REST와 GraphQL 중 무엇을 선택할지 고민하는 경우가 많습니다. 두 방식 모두 훌륭하지만, 상황에 따라 적합한 선택이 다릅니다. 각각의 특징을 이해하고 올바른 선택을 해봅시다.

REST API란?

REST(Representational State Transfer)는 URL로 리소스를 나타내고 HTTP 메서드(GET, POST, PUT, DELETE)로 동작을 표현하는 아키텍처 스타일입니다.

# 사용자 목록 조회
GET /api/users

# 특정 사용자 조회
GET /api/users/1

# 사용자 생성
POST /api/users
Content-Type: application/json
{ "name": "홍길동", "email": "hong@example.com" }

# 사용자 수정
PUT /api/users/1
{ "name": "홍길순" }

# 사용자 삭제
DELETE /api/users/1

GraphQL이란?

GraphQL은 Facebook이 개발한 쿼리 언어입니다. 클라이언트가 필요한 데이터를 정확히 명시해서 요청할 수 있습니다. 단 하나의 엔드포인트(/graphql)로 모든 요청을 처리합니다.

# 필요한 필드만 정확히 요청
query GetUser {
  user(id: 1) {
    name
    email
    posts {
      title
      createdAt
    }
  }
}

# 뮤테이션 (데이터 변경)
mutation CreateUser {
  createUser(input: { name: "홍길동", email: "hong@example.com" }) {
    id
    name
  }
}

핵심 차이점 비교

항목RESTGraphQL
엔드포인트리소스마다 별도 URL단일 엔드포인트
데이터 요청서버가 응답 형태 결정클라이언트가 필요한 필드 지정
Over-fetching발생 가능없음
Under-fetching발생 가능 (N+1 문제)한 번에 해결
캐싱HTTP 캐싱 기본 지원별도 설정 필요
학습 곡선낮음높음
파일 업로드쉬움추가 설정 필요

REST가 적합한 경우

  • 간단한 CRUD 서비스
  • 퍼블릭 API (외부 개발자가 사용하는 경우)
  • HTTP 캐싱이 중요한 경우
  • 팀이 REST에 익숙한 경우
  • 파일 업로드가 핵심 기능인 경우

GraphQL이 적합한 경우

  • 모바일 앱처럼 네트워크 효율이 중요한 클라이언트
  • 다양한 클라이언트(웹, 앱, 서드파티)가 동일 API를 사용하는 경우
  • 복잡하게 연결된 데이터 구조 (소셜 네트워크, 추천 시스템)
  • 프론트엔드 팀이 API 스펙을 자율적으로 관리해야 하는 경우

실전 예시: 블로그 API

블로그 게시글 목록 페이지에서 작성자 정보도 함께 보여야 한다면:

// REST — 2번의 요청 필요 (N+1 문제)
const posts = await fetch('/api/posts').then(r => r.json());
const authors = await Promise.all(
  posts.map(p => fetch(`/api/users/${p.authorId}`).then(r => r.json()))
);

// GraphQL — 1번의 요청으로 해결
const { data } = await fetch('/graphql', {
  method: 'POST',
  body: JSON.stringify({
    query: `{
      posts {
        title
        author { name avatar }
        createdAt
      }
    }`
  })
});
결론
REST와 GraphQL은 경쟁 관계가 아닙니다. 단순한 서비스는 REST로 빠르게 시작하고, 클라이언트가 다양하거나 데이터 관계가 복잡해질수록 GraphQL 전환을 고려하세요. 혼합 사용도 가능합니다.