GraphQL

Graph QL 이란? - GraphQL과 RESTful API

효모. 2020. 8. 20. 23:42

GraphQL 이란

API를 위한 쿼리 언어

graph QL(이하 sql)은 Server API를 구성하기 페이스북에서 만들어진 쿼리 언어입니다. 보다 더 익숙한 쿼리 언어인 sql과 한번 비교해 봅시다

  SQL GQL
목적 데이터베이스 시스템에 저장된 데이터를 가져옴 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져온다.
호출    
위치 백엔드 시스템에서 작성하고 호출 클라이언트 시스템에서 작성하고 호출

표와 같이, gql 은 데이터를 더욱 효율적으로 주고받기 위한 목적으로 만들어진 쿼리 언어입니다.

여기서 데이터를 주고 받는 다는 것은, 마치 카페에서 커피를 주문하는 것과 비슷합니다.

카페에서 우리는 카운터라는 창구(Endpoint) 에서 "달고 휘핑크림이 들어간 커피 주세요!"와 같이 적절한 요청을 하고 그에 맞는 응답을 되돌려줍니다. 이러한 창구를 Web 을 통해 노출한 것Server API라고 부르고, Server API를 구현하기 위한 방법론으로 REST라는 것이 있으며, 많은 Server API들이 RESTful API로 구현되어 현재도 많이 사용되고 있습니다.

그러나 REST에 존재하는 몇 가지 단점이 있어 이를 보완하기 위해 출시된 것이 바로 GraphQL입니다.

gql 애플리케이션은 gql 쿼리를 입력받아 쿼리를 처리한 결과를 다시 클라이언트로 돌려주는 방식으로 사용됩니다.

GraphQL 파이프라인

<GraphQL 파이프라인 구조>

RESTful API vs GraphQL

그래서, 어떤 단점이 있었기에 GraphQL이 나왔어야 했을까요? Rest API로 구현된 요청을 보면서 알아보도록 하겠습니다.

REST API의 문제점

rest api의 특성이자 강점은, 리소스와 URI를 조합해서, 예측 가능하고 일정한 정보와 작업을 요청할 수 있도록 하는 것 입다.

학생으로 예를 들어, RESTful API의 요청을 보겠습니다.

example.com/class

example.com/class/(반 index)

example.com/class/(반index)/students

example.com/class/(반index)/students/(학생index)

와 같이 읽고, 쓰고, 수정, 삭제될 수 있습니다.

우선, 만약 국어 교사가 1반 학생들의 국어 성적을 보고자 한다면, {학번, 이름, 성적} 만으로도 충분할 것입니다. 하지만 REST API에서는 하나의 Endpoind에서 돌려줄 수 있는 응답의 구조가 정해져 있는 경우가 많습니다. 따라서 국어 교사는 다음과 같이 필요 없는 정보까지 얻게 됩니다.

#[GET]example.com/class/1/students

[
    {
        "studentIndex":"1",
        "studentName":"김치킨",
        "grade_korean":100,
        "grade_english":50,
        "grade_math":56,
        "phone":"010-0000-0000"
    },
    {
        "studentIndex":"2",
        "studentName":"이떡볶",
        "grade_korean":100,
        "grade_english":50,
        "grade_math":56,
        "phone":"010-0000-0000"
    },
]

정보가 많아서 나쁠 것 없겠지만, 전송되는 데이터의 size가 커질 것입니다.

두 번째로, REST api는 Endpoint에서 그 리소스에 대한 거의 모든 것을 담당합니다. 그래서 어떤 정보를 얻으려면, 각 Resourve 종류 별로 요청을 해야 하고, 요청 횟수가 필요한 Resource의 종류에 비례합니다.

국어 교사가 각 반의 정보와 그 반의 학생의 성적 정보를 보려고 한다고 가정하면,
우선은 반에 대한 정보를 요청한 후,

#[GET]example.com/class
[
    {
        "classIndex":1,
        "teacher": "홍길동",
        "room":"201A"
    },
    {
         "classIndex":2,
        "teacher": "김영희",
        "room":"201B"
    }
]

이 정보를 가지고 검색된 반에 대해 다시 요청하게 되겠지요.

#[GET]example.com/class/1/students

[
    {
        "studentIndex":"1",
        "studentName":"김치킨",
        "grade_korean":100,
        "grade_english":50,
        "grade_math":56,
        "phone":"010-0000-0000"
    },
    {
        "studentIndex":"2",
        "studentName":"이떡볶",
        "grade_korean":100,
        "grade_english":50,
        "grade_math":56,
        "phone":"010-0000-0000"
    },
]

#[GET]example.com/class/2/students
#[GET]example.com/class/3/students
.
.

GraphQL로 작성한다면

같은 API를 GraphQL로 작성한다면,

  1. 다양한 Depth의 정보를 한 번의 요청으로 가져올 수 있기 때문에 클라이언트 구현 측에서 편해집니다.
  2. //반 번호가 1번인 { class(class_index:1){ class_index, room, teacher, students { studentIndex, studentName, grade_korean } } }
  3. 필요한 정보만 가져와야 할 경우 그 항목만을 가져오는 Query를 작성해서 서버에 요청을 보낼 수 있으므로 Http 응답의 사이즈를 줄일 수 있습니다.
  4. { class(class_index:1){ students { studentIndex, studentName, grade_korean } } }

Restful API로는 다양한 기종에서 필요한 정보들을 일일이 구현하는 것이 힘들었습니다.

예로, iOS와 android에서 필요한 정보들이 조금씩 달랐고, 다른 부분마다 따로 API를 구현해야 하는 점이 불편했는데,

이 때문에 정보를 사용하는 측에서 원하는 대로 정보를 가져올 수 있고,

보다 편하게 정보를 수정할 수 있도록 표준화된 쿼리 언어를 만들게 된 것입니다.

정리해보겠습니다.

장점

  1. HTTP 요청의 횟수를 줄일 수 있습니다.
  2. HTTP 응답의 Size를 줄일 수 있습니다.

단점

하지만 모든 기술이 그렇듯 장점만 있는 것은 아닙니다.

  1. File 전송 등 Text 만으로 하기 힘든 내용들을 처리하기 위해서는 외부 서비스에 의존하거나 복잡해져야 합니다.
  2. 고정된 요청과 응답만 필요할 때는 Query로 인해 요청의 크기가 RESTful API 보다 더 커집니다.
    받아야 할 항목이 많고 고정돼있을 경우에는, 복잡한 GQL query를 작성하기보다 URI 한 줄이 더 간단합니다.
  3. 재귀적인 Query 가 불가능합니다.. (결과에 따라 응답의 깊이가 얼마든지 깊어질 수 있는 API를 만들 수 없습니다. )

결론

그래서 API를 작성할 때 REST Api를 사용해야 할까요, GraphQL을 작성해야 할까요?

1597934201432

\

만드는 서비스가 누구에게 어떤 정보를 제공하느냐에 따라 다음과 같은 기준에 따라 선택할 수 있습니다.

  1. GQL
    • 서로 다른 모양의 다양한 요청에 응답할 필요가 있을 때
    • 대부분의 요청이 crud에 해당할 때
  2. REST
    • HTTP와 HTTPs에 의한 캐싱을 잘 활용하고 싶을 때
    • File 전송 등 단순한 텍스트로 처리되지 않는 요청들이 있을 때
    • 요청의 구조가 정해지지 않았을 때

하지만 하나의 백엔드 서버에 두 설루션을 모두 사용해서 구현할 수 있으므로, 꼭 둘 중 하나를 선택할 필요는 없습니다. 각 정보와 요청마다 유리한 쪽을 골라서 잘 선택하도록 합시다.


참고 문서

kakao tach/GraphQL 개념잡기
GraphQL과 RESTful API
얄팍한 코딩 사전/GraphQL이 뭔가요?