백엔드 입장에서 REST API를 사용하다보면 정~~~말 비슷비슷한 작업을 수행하는데도 불구하고, 각 플랫폼별로 디자인이 다르고, 같은 플랫폼내에서도 유사한 화면이 많기 때문에 매번 별도의 API로 생성해야하는 일이 다분하다.
이럴때마다 "그냥 프론트에서 필요한 데이터를 가져가면 안되나?"라는 생각이 들었는데, 그게 graphql로 가능하다고 한다!
따라서 이번에는 graphql과 REST API가 어떤 점이 다르기 때문에 이게 가능한건지 기본적인 개념부터 한번 알아보려 한다.
Graphql에서 기본적인 개념을 알아보기 위해서는 우선 graphql에서 ql이 무엇인지를 알아야 한다.
REST API에서는 API를 통해 클라이언트와 서버간의 통신을 다루는 반면, graphql에서는 Query Language로 소통한다.
백엔드 개발자라면 다들 알다시피 RDB에 대해 SQL ( Structed Query Language )을 통해 데이터를 조작한다. 이를 프론트엔드, 즉 클라이언트 측에서 query를 날려 DB를 조작하는 개념으로 이해하면 좋을 것 같다.
단, 여기서 gql은 DB에 직접 연결해서 조작하는 것이 아니라, 서버 단의 gql 애플리케이션이 gql을 받아 해당 쿼리문에 해당하는 내용을 처리한 뒤 클라이언트에 반환해주는 형태로 구성된다.
즉, graphql은 API Endpoint로 처리되는 것이 아니기 때문에, gql 애플리케이션에 해당하는 Endpoint 하나로 통일되며 각 데이터 혹은 처리 방식은 Endpoint가 아닌 query에 의해 결정된다.
여기서 발생하는 추가적인 장점은 크게 두가지가 있다.
첫번째, Endpoint는 하나로 관리되고, 서버에 정의된 스키마의 실시간 정보를 공유받을 수 있는 인트로스펙션이 graphql에서 제공되기 때문에 별도로 API 명세서를 최신화하고 요구할 필요가 없으며 오히려 신뢰성 높은 정보를 얻을 수 있다.
두번째, 하나의 Endpoint에서 쿼리로 처리되기 때문에 여러 데이터에 대해 조작이나 조회가 필요할 경우, 한번의 네트워크 호출로 전부 처리가 가능하다. REST API의 경우에는 /posts/1 :GET
, /users/1 :GET
, /posts/1/comments :GET
과 같은 형태로 여러번의 네트워크 호출이 필요했지만, graphql에서는 쿼리로 이 모든 데이터 요청을 한번에 전달할 수 있는 것이다.
그럼 이제 위의 내용을 정리하고 추가적인 특징을 기반으로 graphql과 REST API의 장단점을 비교해보자
graphql이 뚜렷한 장점이 있긴하지만, graphql에서 분명 처리하기 힘든 부분들도 존재하고 이 부분들을 REST API에서 적절하게 커버할 수 있다는 것을 알 수 있었다.
또한, 두가지 방식 모두 뚜렷한 표준이 없기 때문에 제대로된 개념을 확립하고 서비스에 도입하여야 해당 방식의 장점을 100% 뽑아낼 수 있을 것이다.