[CS] GraphQL과 REST API

Hyunjun Kim·2025년 7월 18일
0

Computer_Science

목록 보기
14/19

GraphQL과 REST API

데이터 처리와 분석은 현대 애플리케이션에서 핵심적인 역할을 한다.
특히, 대규모 데이터셋을 효율적으로 요청하고 처리하는 것은 시스템 성능과 사용자 경험에 직접적인 영향을 미친다.
REST API와 GraphQL은 데이터 접근을 위한 두 가지 주요 방식으로, 각각의 특성과 효율성에서 뚜렷한 차이를 보인다. GraphQL에 대해 알아보고, REST API와 GraphQL의 활용 방안을 비교해보자.

GraphQL이란?

GraphQL은 클라이언트가 필요한 데이터의 구조를 직접 정의해 요청할 수 있는 API 쿼리 언어다. 2015년 페이스북에서 개발되었으며, 단일 엔드포인트를 통해 유연한 데이터 조회를 지원한다.
GraphQL은 스키마 기반으로 동작하며, 클라이언트는 요청 시 원하는 필드와 관계를 명시해 정확한 데이터를 받는다. 이를 통해 불필요한 데이터 전송을 줄이고, 데이터 처리 파이프라인을 최적화할 수 있다.

GraphQL의 주요 구성 요소

  • 스키마: 데이터의 타입과 관계를 정의하며, API의 구조를 명확히 한다.
  • 쿼리(Query): 데이터를 조회하는 요청.
  • 뮤테이션(Mutation): 데이터 생성, 수정, 삭제를 처리.
  • 리졸버(Resolver): 각 필드의 데이터를 가져오는 함수.
  • 서브스크립션(Subscription): 실시간 데이터 업데이트를 지원.

GraphQL은 데이터 집약적인 환경에서 유연성과 효율성을 제공하며, 복잡한 데이터 관계를 처리하거나 동적 요구사항이 많은 애플리케이션에 적합하다.



REST API와 GraphQL의 개념 및 차이점

REST API는 자원 중심의 설계를 기반으로, 각 URL 엔드포인트가 특정 데이터 자원에 대응한다. 클라이언트는 고정된 데이터 구조를 반환받으며, HTTP 메서드(GET, POST, PUT 등)를 사용해 데이터를 조작한다. 이는 직관적이고 표준화된 방식이지만, 데이터 요구사항이 복잡해질수록 비효율이 발생할 수 있다.

GraphQL은 단일 /graphql 엔드포인트를 통해 클라이언트가 원하는 데이터의 구조를 자유롭게 정의할 수 있다. 이를 통해 데이터 요청의 유연성을 높이고, 네트워크 사용량을 최적화한다. 특히, 데이터 집약적인 작업에서 필요한 데이터만 정확히 가져와 처리 효율성을 개선한다.



데이터 요청의 유연성 및 효율성

REST API는 엔드포인트마다 고정된 데이터 스키마를 반환한다. 예를 들어, 데이터 분석 대시보드에서 특정 지표만 필요하더라도, 서버가 정의한 전체 데이터(예: 모든 메타데이터 포함)를 반환받아야 한다. 이는 오버페칭(over-fetching), 즉 불필요한 데이터 전송, 또는 언더페칭(under-fetching), 즉 필요한 데이터가 누락되어 추가 요청이 필요한 문제를 유발한다.

GraphQL은 클라이언트가 요청 시점에 원하는 필드를 지정해 데이터를 조회한다. 이를 통해 데이터 전송량을 줄이고, 분석 파이프라인에서 필요한 데이터만 빠르게 처리할 수 있다. 이는 특히 대규모 데이터셋을 다루거나 복잡한 데이터 관계를 분석할 때 유리하다.

오버패칭, 언더패칭

예시: 데이터 조회 API 설계

REST API에서는 데이터 조회를 위해 여러 엔드포인트가 필요하다. 예를 들어, 도서 데이터셋을 분석한다고 가정하면 다음과 같은 엔드포인트가 사용된다.

GET /api/books // 모든 책 목록 조회
GET /api/books/{id} // 특정 책 상세 조회
GET /api/books/{id}/analytics // 책의 분석 데이터 조회

이 경우, 분석에 필요한 특정 필드(예: 책 제목, 출판년도)만 가져오려면 서버가 반환하는 전체 데이터를 필터링해야 하며, 추가적인 엔드포인트 호출로 네트워크 부하가 증가할 수 있다.

GraphQL은 단일 엔드포인트를 통해 유연한 쿼리를 지원한다. 예를 들어, 도서 데이터에서 제목과 출판년도만 조회하려면 다음과 같은 쿼리를 작성한다.

query {
  books {
    id
    title
    publicationYear
  }
}

복잡한 분석 데이터를 요청하려면 쿼리를 확장할 수 있다. 예를 들어, 특정 도서의 분석 메트릭을 함께 조회하려면 다음과 같다.

query {
  book(id: "123") {
    id
    title
    publicationYear
    analytics {
      averageRating
      totalReviews
    }
  }
}

이처럼 GraphQL은 데이터 분석에서 필요한 필드를 정확히 지정해, 데이터 처리 파이프라인을 간소화하고 효율성을 높인다.



캐싱과 성능 최적화

REST API는 HTTP GET 요청과 URL 기반 캐싱을 활용해 성능을 최적화한다. 예를 들어, 자주 조회되는 데이터셋(예: 인기 도서 목록)은 CDN을 통해 캐싱되어 빠르게 제공된다. 이는 대규모 데이터 배포나 반복적인 분석 작업에서 유리하다.

GraphQL은 POST 요청을 주로 사용하므로 전통적인 HTTP 캐싱이 어렵다.
이를 보완하기 위해 쿼리별 캐싱(예: Apollo Client)이나 서버 측 응답 캐싱을 구현해야 한다. 또한, 복잡한 쿼리에서 N+1 문제가 발생할 수 있다. 예를 들어, 여러 도서의 분석 데이터를 조회할 때 각 도서마다 별도의 데이터베이스 호출이 발생하면 성능이 저하된다.

이를 해결하기 위해 DataLoader를 사용해 데이터를 배치 처리한다. DataLoader는 관련 데이터를 한 번에 묶어 요청해 데이터베이스 호출을 최소화한다.



보안과 제약 관리

REST API는 URL과 HTTP 메서드를 기반으로 접근 제어를 설정하므로, 보안 관리가 비교적 단순하다. 예를 들어, 특정 데이터셋에 대한 조회 권한을 토큰 기반 인증으로 제한할 수 있다.

GraphQL은 클라이언트가 쿼리 구조를 자유롭게 정의할 수 있어, 복잡한 쿼리로 인한 서버 부하 위험이 있다.
예를 들어, 분석 대시보드에서 다수의 데이터 관계를 깊게 조회하는 쿼리는 서버 리소스를 과도하게 소모할 수 있다. 이를 방지하기 위해 쿼리 깊이 제한, 쿼리 복잡도 분석, 필드 화이트리스트 같은 보안 정책을 적용한다. 이는 데이터 집약적인 환경에서 안정적인 성능을 유지하는 데 필수적이다.



데이터 처리 관점에서의 고려사항

데이터 집약적인 작업에서는 데이터 요청의 효율성과 처리 속도가 핵심이다. REST API는 고정된 데이터 구조를 다룰 때 단순하지만, 동적이고 복잡한 데이터 요구사항에서는 추가적인 엔드포인트 설계나 서버 측 필터링이 필요하다. GraphQL은 데이터의 계층적 구조를 효과적으로 처리하며, 클라이언트가 분석에 필요한 데이터만 정확히 요청할 수 있다.

예를 들어, 데이터 분석에서 특정 조건(예: 특정 카테고리의 도서 중 평균 평점 4 이상인 데이터)을 조회하려면, REST API는 별도의 엔드포인트를 설계하거나 서버에서 데이터를 필터링해야 한다. 반면, GraphQL은 클라이언트 측에서 조건을 포함한 쿼리를 작성할 수 있다.

query {
  books(category: "Science", minRating: 4) {
    id
    title
    averageRating
    publicationYear
  }
}

이는 데이터 전처리 단계를 간소화하고, 분석 파이프라인의 효율성을 높인다. 또한, GraphQL의 서브스크립션 기능을 사용하면 실시간 데이터 업데이트(예: 새로운 분석 메트릭 추가)를 즉시 반영할 수 있다.

subscription {
  analyticsUpdated(bookId: "123") {
    averageRating
    totalReviews
  }
}


실무 활용 가이드

다양한 데이터 처리 요구사항에 따라 REST API와 GraphQL을 선택할 때 아래 표를 참고한다.

요구사항적합한 API 유형
동적이고 복잡한 데이터 조회 (예: 분석 대시보드, 맞춤형 보고서)GraphQL
고정된 데이터 구조와 단순한 데이터 조회REST API
대규모 데이터 배포와 CDN 캐싱이 중요한 경우REST API
클라이언트별 맞춤형 데이터 분석 요구가 많은 경우GraphQL
데이터 보안과 접근 제어가 중요한 민감한 환경REST API 우선 고려


하이브리드 아키텍처의 가능성

실무에서는 REST API와 GraphQL을 혼용하는 하이브리드 아키텍처를 고려할 수 있다. 예를 들어, 정적 데이터셋이나 캐싱이 중요한 공공 API는 REST로 유지하고, 동적이고 맞춤형 데이터 분석을 위한 내부 API는 GraphQL로 구현한다. 이를 통해 데이터 처리의 효율성과 시스템의 확장성을 동시에 확보할 수 있다.



결론

API 설계는 데이터 처리 요구사항, 성능 목표, 보안 필요성, 그리고 개발 팀의 역량을 종합적으로 고려해야 한다. REST API는 단순하고 검증된 방식으로 고정된 데이터 구조를 다룰 때 적합하며, GraphQL은 유연성과 효율성을 제공해 복잡한 데이터 분석 요구사항을 만족시킨다. 두 방식의 특성을 명확히 이해하고, 데이터 중심 애플리케이션의 특성에 맞게 선택하거나 조합하면 효율적이고 확장 가능한 시스템을 구축할 수 있다.

profile
Data Analytics Engineer 가 되

0개의 댓글