ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GraphQL vs REST API
    good tips for dev 2022. 11. 30. 17:21

     

    GraphQL은 Server API를 구성하기 위해 Facebook에서 만든 쿼리 언어이다.       

     

    개발자들은 Server API를 사용해서 클라이언트와 서버의 통신을 구현한다. Server API를 개발하는 방법 중 가장 많이 사용되는 방식은 REST GraphQL이다.

     

    GraphQL이 REST와 비교해서 가지는 차이점은 크게 다음과 같다.

    1. GraphQL API는 보통 하나의 엔드포인트를 가진다.
    2. GraphQL API는 요청할 때 사용하는 쿼리에 따라 다른 응답을 받을 수 있다.

    REST API는 여러가지 엔드포인트를 가지며 각각의 엔드포인트가 동일한 응답을 반환한다.그러나 GraphQL은 보통 하나의 엔드포인트만을 사용하며 요청하는 쿼리에 따라 다른 응답을 반환하는 방식이다.

     

    REST API
    → example.com/class
    → example.com/class/(반 index)
    → example.com/class/(반 index)/students
    → example.com/class/(반 index)/students/(학생 index)
    
    GraphQL
    → example.com
        (하나의 엔드포인트에 다른 쿼리를 사용해 요청)

     

    만약  데이터요청이 학생의 점수만 갖고오고 싶어도 REST API 같은 경우는 다른 데이터들을 같이 갖고와야한다.

    하지만 GrpahQL은 하나의 엔드포인트에 다른 쿼리로 요청함으로서 특정 응답을 받을 수 있다.

    엔드포인트에 따라 정해진 응답 값만 받아올 수 있는 REST API와 달리 GraphQL은 쿼리 작성을 통해 필요한 데이터만 골라 받아올 수 있다.

     

     

    스타워즈의 루크스카이워커 정보를 REST API 로 get 요청할때

    method: 'GET';

    https://swapi.dev/api/people/1

     

    {
        "name": "Luke Skywalker",
        "height": "172",
        "mass": "77",
        "hair_color": "blond",
        "skin_color": "fair",
        "eye_color": "blue",
        "birth_year": "19BBY",
        "gender": "male",
        "homeworld": "http://swapi.dev/api/planets/1/",
        "films": ["http://swapi.dev/api/films/1/", "http://swapi.dev/api/films/2/", "http://swapi.dev/api/films/3/", "http://swapi.dev/api/films/6/"],
        "species": [],
        "vehicles": ["http://swapi.dev/api/vehicles/14/", "http://swapi.dev/api/vehicles/30/"],
        "starships": ["http://swapi.dev/api/starships/12/", "http://swapi.dev/api/starships/22/"],
        "created": "2014-12-09T13:50:51.644000Z",
        "edited": "2014-12-20T21:17:56.891000Z",
        "url": "http://swapi.dev/api/people/1/"
    }

    REST API를 통해서 인물의 정보를 받아오면 필요한 정보 이외에도 너무나 많은 정보까지 함께 받아야 한다. 여기서 이름,,몸무게의 데이터만 필요하다고 할 때 GraphQL API를 사용하면 다음과 같이 요청 할 수 있다.

     

     

    GraphQL 요청

    query {
        person(personID: 1) {
            name
            height
            mass
        }
    }

     

     

    GraphQL 결과

    {
        "data": {
            "person": {
                "name": "Luke Skywalker",
                "height": 172,
                "mass": 77
            }
        }
    }

    REST API로는 3개의 데이터를 가져오기 위해 13개의 불필요한 데이터까지 함께 가져와야 했지만, GraphQL은 클라이언트에서 필요한대로 쿼리를 작성해 원하는 데이터만을 가져올 수 있다.

     

    GraphQL의 장단점

    이러한 특징들로 GraphQL이 REST API와 비교해서 가지는 장점은 다음과 같이 정리 할 수 있다.


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

    RESTful의 경우 필요한 리소스 별로 요청 해야하고, 필요한 데이터들이 부분적으로 나눠서 개발되어 있다면 그만큼 요청 횟수가 늘어난다. 하지만 GraphQL은 원하는 정보를 하나의 쿼리에 모두 담아 요청 할 수 있다.

    2. HTTP 응답 사이즈를 줄일 수 있다.

    Restful의 경우 응답의 형태가 정해져있기 때문에 필요한 정보만 부분적으로 요청하는 것이 힘들고, 자연스럽게 데이터의 사이즈가 클 수 밖에 없다.

    Facebook이 GraphQL을 개발한 초기 이유 중 하나는 모바일 사용의 증가라고 한다. GraphQL을 사용함으로써 데이터 사이즈를 최소화하여 모바일 환경의 부담을 줄일 수 있다.

    3. 프론트엔드와 백엔드 개발자의 부담을 덜 수 있다.

    Restful API를 사용한다면 프론트엔드 개발자는 API의 request/response 형식에 의존하게 된다. 따라서 새로운 엔드포인트를 효율적이게 개발하기 위해서는 프론트엔드와 백엔드 개발자의 커뮤니케이션이 강제되는 경우가 많았다.

    하지만 GraphQL은 request/response 의존도가 많이 없기 때문에, 개발자들의 API 개발 부담을 덜 수 있다.

     

    그렇다면 GraphQL은 모든 RESTful 서비스를 대체 할 수 있을까? GraphQL에도 단점이 존재한다.

     

     

    1. 고정된 요청과 응답만 필요할 때에는 query로 인해 요청의 크기가 Restful보다 커질 수 있다.

     

    2. 캐싱이 REST보다 복잡하다.

     

    3. 파일 업로드 구현 방법이 정해져있지 않아 직접 구현해야 한다.

     

     

     

    결론

    REST가 가지는 한계 때문에 개발된 GraphQL이지만, GraphQL이 완벽하게 REST를 대체 할 수는 없다.

    REST에 더 적합한 서비스에는 REST가 사용되는 것이 바람직하므로, GraphQL과 REST의 장단점을 파악해 서비스에 맞는 방식을 고르는 것이 중요하다.

     

    참고 및 출처 링크 https://jongminfire.dev/graph-ql%EC%9D%B4%EB%9E%80

Designed by Tistory.