ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GraphQL이란 무엇인가?
    SW개발/GraphQL 2019. 2. 10. 21:25

    1. GraphQL?

       - GraphQL의 정의와 특징



    1) GraphQL이 뭐에요?

    구글창에 GraphQL이라고 치면 아래와 같은 정의가 나온다.

    출처: 위키백과


    위에 설명된 내용에서 알 수 있듯이 GraphQL은 


    1. Query Language 이다.

    2. REST 구조를 대체할 수 있다.

    3. 클라이언트는 필요한 데이터의 구조를 지정하여 필요한 데이터만 받아낼 수 있다.


    이렇게 요약할 수 있다.


    그리고 이것들을 하나로 요약하면, GraphQL의 핵심은


    클라이언트가 필요한 리소스(이 용어가 어렵다면 data라고 생각하면 됩니다.)를 url 경로가 아니라 Query를 통해 표현한다는 것!


    이걸 좀 더 간단하게 말하면, 클라이언트에게 필요한 데이터만 쿼리를 통해 가져올 수 있다는 것!


    GraphQL은 SQL처럼 데이터의 집합에서 특정 데이터를 불러오는 데이터 질의 언어이다. 라이언트가 미리 선언한 데이터 구조대로 서버에 데이터를 요청하면 서버는 요청받은 구조로 데이터를 반환하는 특징이 있다. 데이터 모델에 따라 GraphQL 스키마(schema)를 선언해 두면 선언한 스키마의 하위 필드에서 원하는 필드만 HTTP 요청의 본문(body)으로 보내고 응답으로 데이터를 받을 수 있다.


    그런데, 우리는 여기서 의문을 한 가지 갖게 된다.



    "GraphQL을 왜 쓰는거야? 대체 뭐가 좋은데?"



    2) GraphQL로 해결할 수 있는 문제들.


    (1) Over-fetching


    Over-fetching이란, 내가 요청한 정보보다 더 많은 정보를 서버로부터 받게 되는 현상이다.

    예를들어, 모든 유저들의 이름을 웹사이트에 보여주고 싶다고 할 때, 기존에 우리가 많이 사용하는 REST API에서는 /users/1 과 같은 방법으로 서버에 요청하게 된다. 하지만 이런 요청방식은 서버의 db의 users 스키마에서 사용자명만 주는게 아니라, 성별이나 프로필 사진같은 것들을 같이 던져주는 문제가 발생하게 된다. 결국 이 과정에서 우리가 원하는 결과를 얻기위해서는 URL을 두 번 호출해야하는 문제가 발생하고, 이것을 Over-fetching이라고 한다.

    즉, 내가 원하는 것보다 서버로부터 불필요한 data를 함께 받는 것을 Over-fetching이라고 한다.


    (2) Under-fetching


    Under-fetching이란, 하나의 작업을 하기 위해서 여러 End-point에 요청을 보내야 할 때를 말한다.

    여기서 말하는 End-point란, /main/page1 과 같이 어떤 경로를 통해 얻게되는 것을 뜻한다.


    예를들어, 인스타그램 앱을 시작하면 인스타 피드, 알림, 사용자 프로필 등의 많은 정보를 받게 된다. 그리고 앱을 처음에 시작하기 위해서는 다양한 End-point에 여러 요청이 오고가야 한다. 하지만, 기존의 REST 방법으로는 한 번의 요청으로 하나의 End-point만 연결 가능하기 때문에 n개의 End-point로부터 필요한 데이터를 받으려면, n번의 요청을 보내야만 한다.

    즉, 이처럼 하나의 작업을 하기 위해서 여러 End-point에 요청을 보내야 하는 것을 Under-fetching이라고 한다.


    (3) GraphQL은 Over-fetching과 Under-fetching을 해결할 수 있다!


    GraphQL은 Query 개념을 사용하여 Over-fetching과 Under-fetching이라는 이 두 문제를 해결한다. 즉, 필요한 정보를 Query라고 하는 필터를 거치게 하여 필요한 정보를 한 번에 가져올 수 있기 때문에 이 두 문제가 해결 가능하다!


    그런데... 우리는 위의 글을 읽으면서 의문이 하나 생긴다. 


    "위에서 자꾸 REST랑 비교하는데, REST랑은 무슨 차이가 있나요?"



    3) GraphQL과 RESTful의 차이점


    (1) 연결되는 End-point의 갯수.

     

    결론부터 말하면, 

    GraphQL과 End-point은 1:n

    RESTful과 End-point는 1:1의 관계!


    RESTful API는 Resource마다 하나의 Endpoint를 가지고, 그 Endpoint에서 그 Resource에 대한 (거의) 모든 것을 담당하지만, GraphQL은 전체 API를 위해서 단 하나의 Endpoint만을 사용한다. 즉, REST는 Resource를 기준으로 EndPoint를 나누기 때문에 Resource와 Endpoint가 1:1관계이고, GraphQL은 Resource와 Endpoint가 n:1의 관계를 이루게 된다.


    (2) GraphQL API는 요청할 때 사용한 Query문에 따라 응답의 구조가 달라진다.


    RESTful API는 하나의 Endpoint에서 돌려줄 수 있는 응답의 구조가 정해져있는 경우가 많다. 반면, GraphQL은 사용자가 응답의 구조를 자신이 원하는 방식으로 바꿀 수 있다. 아래의 그림들을 보면 REST API와 GraphQL의 차이를 실감할 수 있다.



    <REST API와 GraphQL API의 차이>


    출처: https://fullstackmark.com/post/17/building-a-graphql-api-with-aspnet-core-2-and-entity-framework-core


    <REST API로 데이터를 받아오는 예제>


    출처: https://www.howtographql.com/basics/1-graphql-is-the-better-rest/

    <GraphQL로 데이터를 받아오는 예제>



    결국, 위의 그림에서 알 수 있듯이, GraphQL이 갖는 장점은


    1. HTTP 요청의 횟수를 줄일 수 있다.

    RESTful 은 각 Resource 종류 별로 요청을 해야하기 때문에, 요청 횟수는 Resource 의 종류에 비례한다. 반면, GraphQL 은 원하는 정보를 하나의 Query 에 모두 담아 요청하기 때문에 한 번의 요청으로 여러 Resource를 동시에 얻을 수 있다.


    2. HTTP 응답의 Size 를 줄일 수 있다.

    RESTful 은 응답의 형태가 정해져있고, 따라서 필요한 정보만 부분적으로 요청하는 것이 힘들다. 하지만, GraphQL 은 원하는 대로 정보를 요청하는 것이 가능하다.



    4) 결론


    1. GraphQL은 Query Language

    2. 클라이언트가 필요한 리소스(이 용어가 어렵다면 data라고 생각하면 됩니다.)를 url 경로가      아니라 Query를 통해 표현한다.

    3. 다양한 End-point로부터 필요한 데이터만을 받아오고자 한다면, REST API보단, GraphQL API를 쓰는게 이득!

Designed by Tistory.