GraphQL
에 대하여 얘기는 많이 들었지만, 한 번도 써본적이 없어 이 참에 해보려 한다.
GraphQL을 정확하게 이해하기 전에는 그저 새로운 프레임워크, 라이브러리정도로 생각했으나, 전혀 새로운
개념이라는 것을 알게 되었다.
GraphQL
의 기본에 대한 포스팅은 2회에 걸쳐 진행할 예정인데, 이론적인 부분과 실제로 구성되어 있는 것들을 살펴 보고자 한다.
처음에 이름을 들었을 때, 맨 처음든 생각은 왜 그래프
라는 단어가 들어갔을까 라는 점이다.
해당 의문에 대한 답은 GraphQL 홈페이지에서 확인할 수 있었는데, 다음과 같이 서술되어 있다.
GraphQL을 사용하면 비즈니스 도메인을
그래프
로 모델링 할 수 있습니다.
스키마를 정의하여 비즈니스 도메인을 그래프로 연결할 수 있다는 말인데, 구조를 알기 전까지는 이해하기 어려운 문장이다.
한 문장으로만 요약하자면, Facebook이 개발한 Query언어
라고 할 수 있겠다.
사내에서 REST API
서버를 구축하며 재미있고, 즐거우며 Front-end 개발자와 협업 하는 것이 굉장이 용이하다는 생각을 하였다.
그러나 개발하는 서비스의 덩치가 점점 커지며 다음과 같은 문제점
들에 당면하게 되었는데 생각보다 나를 괴롭게 만들었다.
여러번
API가 호출 됨새로
만들어야함유지보수
의 어려움한 문장으로 요약하면, 관리해야 할 EndPoint
의 증가로 인하여 발생되는 문제점이라 할 수 있다.
GraphQL의 가장 큰 특징은 다음 그림과 같이 EndPoin가 하나
라는 점이다.
기존에 REST API에서는 정보를 얻기 위해 여러번 네트워크를 호출하거나, 다양한 API를 호출해야 했다.
하지만 GraphQL은 단 하나
의 Endpoint를 제공하며, 단 한 번
의 요청으로 모든 정보를 가져온다.
위의 그림과 같이 Cient-side와 Server-side에서 각각 모듈을 활용하여 통신을 주고 받을 수 있으며, 다음과 같은 언어를 지원한다.
또한, Client-side에서 지원되는 라이브러리는 다음과 같이 2가지 종류가 존재하나, 글을 쓰는 현재(2020년11월)에는 Apollo
가 대세이다.
이러한 매력적인 장점을 제공함에도, 여전히 GraphQL을 기반으로 OpenAPI를 제공하는 회사는 거의 없는 것 같다.
GraphQL 홈페이지에 들어가면 현재 GraphQL을 사용하는 기업들의 목록이 나와있는데, 다음과 같은 기업들이 함께한다.
이 중, Github
은 API v3에서는 REST
를 사용하다가 v4에서는 GraphQL
로 갈아탔는데, 위 링크의 글을 읽어보면 조금 더 GraphQL의 장점을 알 수 있다.
또한 Github Explorer
에서 GraphQL을 사용해볼 수 있도록 지원을 하는데, 로그인 이후 본인 계정의 정보를 조회해볼 수 있다.
GraphQL은 위에서 언급한 특징을 기반으로 다음과 같은 장점을 지닌다.
단 한 개
의 Endpoint를 지님으로써, API나 View를 따로 구성할 필요가 없어진다.
요청을 보낼때는 정해진 한 군데로만 요청을 보내면 되고, 그 외의 API를 신경쓸 필요가 없어져, 유지보수가 용이해진다.
GraphQL은 한번의 요청으로 원하는 모든 데이터를 서버로부터 요청하여 가져온다.
따라서 기존에 REST API만을 사용할때 발생하는 Overfetching
이나 Underfetching
등의 문제가 발생하지 않는다.
Overfetching
원하는 data 이상의 정보를 요청받는 것, data의 정제에 리소스가 낭비
Underfetching
원하는 data의 정보를 요청받기 위해 여러번 요청을 보내는 것, 네트워크를 통해 여러번 접근을 하여 리소스 낭비
Facebook의 GraphQL blog에서는 iOS, Android에 따라 다른 기종
을 위해 제공하는 API 구현이 힘들었다고 한다.
RESTful API로는 일일히 다른 기종을 위해 API를 구현해야 했다고 말하며, 표준화
된 쿼리언어를 개발했다고 한다.
React와 함께 사용하는 어플리케이션에서는 Flux 아키텍처
를 구현한 Redux
를 제공하는데, 이는 다음과 같은 방식으로 진행된다.
기존의 Redux와 Universal Router를 사용한 SSR은 위의 사진처럼 실행되고 이는 다음과 같은 단점
을 야기한다.
라우팅 경로마다
구현해야 함액션과 리듀서
를 구현해야 함복잡
없음
이를 Apollo
기반의 서비스에서 React Router v4
라이브러리를 사용하여 다음과 같이 진행할 수 있게 된다.
Redux와 Universal Router를 사용할 때보다 프로세스가 간결
해졌다.
또한 Redux와 Universal Router 조합에서 생겨난 단점이 보완되고 다음과 같은 장점
이 추가되었다.
상관없이
컴포넌트별로 필요한 리소스만 가져올 수 있음재사용
가능한 컴포넌트의 개발이 용이해짐하나의 라우터 코드
로 클라이언트 렌더링과 서버 렌더링을 실행할 수 있음위의 내용은 https://d2.naver.com/helloworld/2838729의 글을 참조한 부분이며, Redux에 대한 지식이 부족하여
원문 그대로
의 내용을 들고 왔습니다.
GraphQL의 단점으로 알려진 것들로는 다음과 같은 특징이 있다.
HTTP의 캐싱 전략은 각각 URL에 각자의 정책을 설정하는 방식으로 이루어 지는데, RESTful API는 이를 그대로 사용이 가능하다.
그러나 GraphQL은 하나
의 URL로 처리하기에, HTTP에서 제공하는 캐싱 전략을 그대로 사용하는 것은 불가능
하다.
따라서 GraphQL만의 캐싱 방법
을 제공하게 되는데, 대표적으로는 영속쿼리(persisted query)
, 아폴로엔진(Apollo Engine)
등이 있다.
GraphQL은 지속적으로 성장하는 생태계로써, 완성된 명세가 존재하지 않는다
. 따라서 이 외의 것들은 직접
개발할 수 밖에 없게 된다.
대표적인 예로 파일업로드가 있는데, 다만 이에 대해 몇가지 대안이 있다.
GraphQL은 클라이언트가 필요한 데이터를 스스로 결정하여 요청하게 된다.
따라서 GraphQL의 다양한 요청형태에서 잘못된 요청을 필터링하기가 까다롭다
.
GraphQL을 공부하며 GraphQL이 무엇인지 특징 및 장점에 대해 알아보았다.
다음 포스팅에서는 GraphQL의 구조
에 대해 알아볼 예정이다.