1. GraphQL 이란?
  2. 장점
  3. 단점
  4. GraphQL vs. REST
  5. 사용 예시
  6. 참고자료
07
05

 

 

 

GraphQL 이란?

 

GraphQL은 쿼리 언어이자 API를 위한 서버측 런타임으로, 클라이언트에게 요청한 만큼의 데이터를 제공하는 데 우선 순위를 둔다. 클라이언트는 필요한 데이터의 구조를 지정할 수 있으며, 서버는 정확히 동일한 구조로 데이터를 반환한다. 

 

일반적인 REST API는 여러 URL에서 데이터를 받아와야 하지만 GraphQL API는 한번의 요청으로 앱에 필요한 모든 데이터를 가져온다. GraphQL을 사용하는 앱은 느린 모바일 네트워크 연결에서도 빠르게 수행할 수 있다.

 

GraphQL은 SQL과 마찬가지로 쿼리 언어이지만 둘 사이에는 차이가 있다. SQL은 주로 서버가 DB로부터 데이터를 효율적으로 가져오는 것이 목적이고, GQL은 클라이언트가 서버로부터 데이터를 효율적으로 가져오는 것이 목적이다. 따라서 SQL은 주로 백엔드에서 작성하고, GQL은 주로 클라이언트에서 작성한다.

 

 

 

 

 

 

 

장점

 

1. 하나의 Endpoint로 빠른 응답

  • REST API는 Endpoint (=API주소) 가 많은 반면, GraphQL은 Endpoint가 하나이다.
  • REST API는 원하는 값을 얻기 위해 여러 번 요청을 보내야 할 때가 존재하지만, GraphQL은 하나의 Endpoint에서 모든 작업을 처리하기 때문에 단 한 번의 요청으로 원하는 값을 얻을 수 있다.
  • 더 간편하며 HTTP의 요청 횟수도 줄일 수 있고, 요청 쿼리를 줄일 수 있어 더 빠르다.

 

2. 데이터 형태 정의

  • GraphQL은 쿼리를 커스텀해서 원하는 값만 얻는 것이 가능하다.
  • GraphQL이 쿼리를 서버에 요청하면 서버는 간단하고 안전하며 예측 가능한 형태로 응답을 반환한다. 따라서 요구 사항에 따라 특정 쿼리를 작성하여 원하는 데이터 형태를 얻을 수 있다.

 

3. UnderFetching & OverFetching 문제 X

  • REST API의 UnderFetching & OverFetching 문제를 해결할 수 있다.
    • UnderFetching : 하나의 endpoint로 필요한 모든 데이터 요청 처리 불가해서 여러번 요청하는 것
    • OverFetching : endpoint로 요청하여 받은 응답이 불필요한 데이터를 포함하는 것
  • 단, 고정된 요청과 응답만 필요한 경우에 쿼리로 인해 요청의 크기가 더 커질 수 있다.

 

4. API 버전 관리 X

  • 쿼리 요청에 따라 결과가 달라지기 때문에 API에 대한 버전 관리가 필요 없다.
  • Facebook도 애플리케이션에서 동일한 버전의 GraphQL API를 사용하고 있다.

 

 

 

 

 

단점

 

1. GraphQL 쿼리의 복잡성

  • 프론트에서 쿼리를 직접 작성해야하기 때문에 서버쪽 스키마를 제대로 알고 있어야한다.
  • REST API든 GraphQL이든, 하나의 쿼리에서 여러 필드에 접근해야 할 때 리소스를 DB에서 검색해야한다. 따라서 클라이언트에서 한 번에 너무 많은 중첩 필드 데이터를 요청하면 문제가 생길 수 있다. 이를 위해 최대 쿼리 깊이, 쿼리 복잡성 가중치, 재귀 방지 등이 필요하다.

 

2. GraphQL 캐싱

  • GraphQL은 하나의 Endpoint에서 동일한 Entity에 대해서라도, 각각의 쿼리가 다를 수 있기 때문에 캐싱하기 복잡하다.
  • REST API는 URL 기준으로 캐싱하면 쉽다.

 

3. GraphQL 요청 제한

  • REST API에서는 하루에 얼마만큼의 요청만 허용하도록 지정할 수 있지만 GraphQL 에서는 이러한 명령문을 지정하기 어렵다.

 

 

 

 

 

GraphQL vs. REST

  • GraphQL : 서로 다른 모양의 다양한 요청들에 대해 응답할 수 있어야 할 때
  • REST : HTTP와 HTTPs에 의한 캐싱을 잘 사용하고 싶을 때, 요청의 구조가 정해져 있을 때

 

 

 

 

 

사용 예시

 

  • query (R)
// users 테이블의 id 1의 nickname, avatar, createdAt과
// 연관 관계에 있는 folders 테이블의 permission을 가져온다.
query getUser {
  user(id: 1) {
    nickname
    avatar
    createdAt
    folders {
      permission
    }
  }
}

 

  • mutation (CUD)
// nickname test를 input으로 user 레코드를 만들고 id, nickname, avatar를 가져온다
mutation createUser {
  createUser(nickname: "test") {
    id
    nickname
    avatar
  }
}

 

 

 

 

 

참고자료

 

 

 

'CS > 기타' 카테고리의 다른 글

캐싱 전략  (0) 2022.07.29
스택 / 레지스터 기반 VM  (0) 2022.07.27
바이트코드와 기계어  (0) 2022.05.17
CS 관련 Github repo 정리  (0) 2022.03.30
Web Server와 WAS  (0) 2022.03.26
COMMENT