-
GraphQL vs REST APIgood tips for dev 2022. 11. 30. 17:21

GraphQL은 Server API를 구성하기 위해 Facebook에서 만든 쿼리 언어이다.
개발자들은 Server API를 사용해서 클라이언트와 서버의 통신을 구현한다. Server API를 개발하는 방법 중 가장 많이 사용되는 방식은 REST와 GraphQL이다.
GraphQL이 REST와 비교해서 가지는 차이점은 크게 다음과 같다.
- GraphQL API는 보통 하나의 엔드포인트를 가진다.
- 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
'good tips for dev' 카테고리의 다른 글
코드 가독성에 대해 (feat: KISS, Boy scout rule) (1) 2024.01.14 [Monorepo] 모노레포는 멀티레포로부터 어떻게 구원을 해줄까?feat:Turborepo (0) 2023.09.06 [Yarn Berry] Yarn Berry가 node_modules의 문제를 어떻게 해결할까? (0) 2023.09.05 mixed content 에러시 http://localhost 허용? (feat:CORS error) (0) 2023.07.22