티스토리 뷰

# GraphQL

GraphQL은 Graph Query Language의 줄임말으로 페이스북에서 개발하였으며, 서버 API를 구성하기 위해 만든 데이터베이스 쿼리 언어이다.

쿼리문의 작성이 직관적이며 API를 호출할 때 쿼리문을 원하는 형식으로 작성하여 원하는 데이터만 응답받도록 할 수 있다.

기존 서버 API에서 주로 사용되던 RESTful API는 사용자가 원하는 형태의 모든 API를 구현하는데에 어려움이 있었으며 이러한 니즈는 GraphQL의 등장배경이 되었다.

https://graphql.org/ 에 접속하여 GraphQL의 쿼리문의 형식과 그에 따른 응답을 예제로 볼 수 있다.

# EndPoint

위에 적었듯 GraphQL의 등장배경에는 RESTful API의 구현방식 상 각기 다른 요구 사항에 대하여 EndPoint를 다르게 세팅해주어야 하는(여러 API를 만들어야 하는) 문제가 있었다.

 

 

 - 학급 관리 API => /class

    - 학생 관련 => class/{class_number}/student

        - 학생 추가 => class/{class_number}/student/update  [POST]

        - 학생 삭제 => class/{class_number}/student/update/{student_id}  [DELETE]

        - 학생 조회 => class/{class_number}/student/lists [GET]

    - 선생님 관련 => class/{class_number}/teacher

        - 선생님 할당 => class/{class_number}/teacher/update  [POST]

        - 선생님 변경 => class/{class_number}/teacher/change [POST]

        - 선생님 조회 => class/{class_number}/teacher/who [GET]

    - 학급 정보 조회 => class/{class_number}/info

        - 반 성적 조회 => class/{class_number}/info/grade

             - 평균 조회 => class/{class_number}/info/grade/avg

             - 반 등수 조회 => class/{class_number}/info/grade/rank

             - 최고점 조회 => class/{class_number}/info/grade/highest

  ................................

 

예를 들자면 이런식으로 하나의 API를 구성하려면 엄청나게 많은 Endpoint로 관리되어야 하며, 요구 사항이 복잡해질 수록 더욱 복잡한 형태가 될 것이다.

이러한 형태의 API는 GUI(Graphical User Interface) 형태로 표현된다면 그나마 사용자 입장에서 직관적으로 사용하기 쉽겠지만 단순히 JSON으로 메세지만 오가는 API라면 반드시 표나 문서등으로 정리가 필요할 것이다.

GraphQL은 이러한 1 Resource 1 Endpoint 형태의 문제를 해결하기 위하여 등장하였으며 N Resource 1 Endpoint의 형태를 가진다.

간단한 예로 표현하면 하나의 Endpoint에서 제공하는 쿼리문이 아래와 같이 존재한다고 한다면

 

 query{

      class{

           classNumber

           students{

               name

               age

               grade

           }

           teacher{

               name

               age

           }

      }

 }

 

이 쿼리 그대로 API에 요청을 한다면 아래와 같은 결과를 얻을 수 있다.

 

 query{

      class{

           classNumber

           students{

               name

               age

               grade

           }

           teacher{

               name

               age

           }

      }

 }

{

     "data":{

         "class": [

          {

              "classNumber":1,

              "students":[

               {

                   "name": "jason",

                   "age": 9319,

                   "grade": "A"

               },

               {

                   "name":"grace",

                   "age": 27,

                   "grade":"A+"

               },

               {

                   "name":"jinseo",

                   "age":27,

                   "grade":"F"

               }],

               "teacher":{

                   "name":"ace",

                   "age": 46

               }

          },

          {

              "classNumber":2

              "students":[

               {

                   "name": "lucas",

                   "age": 23,

                   "grade": "C+"

               }],

               "teacher":{

                   "name":"paul",

                   "age": 49

               }

          }]

     }

}

 

이번에는 선생님의 정보만 얻고싶다면 쿼리문을 작성할 수 있다.

 

 query{

      class{

           teacher{

               name

               age

           }

      }

 }

{

     "data":{

         "class": [

          {

               "teacher":{

                   "name":"ace",

                   "age": 46

               }

          },

          {

               "teacher":{

                   "name":"paul",

                   "age": 49

               }

          }]

     }

}

 

이번에는 선생님의 정보 중 나이는 필요없고 이름만 얻고싶다면 위의 쿼리문에서 age를 지워주면 된다.

 

 query{

      class{

           teacher{

               name

           }

      }

 }

{

     "data":{

         "class": [

          {

               "teacher":{

                   "name":"ace"

               }

          },

          {

               "teacher":{

                   "name":"paul"

               }

          }]

     }

}

 

이처럼 GraphQL에서는 원하는 Resource에 맞게 쿼리문을 요청하는 사용자가 직접 작성하면 되므로 여러개의 endpoint가 필요하지 않다.

또한 Graphiql이나 Playground를 이용한다면 별도의 문서작업 없이 정의 된 스키마를 보고 원하는 쿼리를 작성할 수 있다.

 

# 장단점

GraphQL은 단일 endpoint를 사용하므로 단 한번의 호출으로 원하는 Resource를 얻을 수 있기 때문에 REST API에 비하여 HTTP 요청의 횟수를 줄일 수 있다.

또한 응답의 형태를 내가 원하는 부분만 쿼리문으로 작성하여 컨트롤 할 수 있기 때문에 HTTP 응답의 Size도 줄일 수 있다.

하지만 GraphQL이 장점만 가진다면 REST API를 사용할 이유가 없지 않은가

GraphQL은 고정과 요청과 고정 된 응답을 필요로 하는 경우에는 Query 때문에 REST API에 비하여 요청의 크기가 증가한다.

또 Text로 처리되지 않는 요청을 처리하기에 비효율적이며 재귀적인 Query가 불가능하다.

 

이처럼 GraphQL과 RESTful방식은 서로 장단점을 가지고 있기 때문에 원하는 경우에 맞게 API를 작성해주면 되고 꼭 둘중 하나를 선택할 필요 없이 GraphQL이 효율적인 경우에는 GraphQL으로 RESTful이 효율적인 경우에는 RESTful로 API를 구현해주면 된다.

'서버 관련 > Backend 지식' 카테고리의 다른 글

GraphQL 스키마 작성하기 (GraphQL Schema)  (0) 2020.04.18
GraphQL(Graph Query Language) 란?  (0) 2020.04.16
REST API 란?  (0) 2020.04.09
댓글
댓글쓰기 폼