[14.5.8 버전]
데이터를 가져오는 API의 방법으로 대표적인 REST(Representational State Transfer) API가 있다. REST API는 API 작동 방식에 대한 조건을 부여하여 모든 데이터들을 하나의 endpoint(연결점)에 연결해놓고, 각 Endpoint 는 그 Resource 와 관련된 내용만 관리하게 하자는 방법론이다.
즉, 자원(resource)의 표현(representation)을 통한 상태를 전달하며, 좁은 의미로 HTTP를 통해 CRUD(Create, Read, Update, Delete)를 실행하는 API를 뜻한다. resource의 표현은 그 자원을 표현하기 위한 이름으로, 예를들어 DB의 유저정보가 resource라면 user를 resource의 표현으로 정한다.
이런 REST 의 조건을 만족하는 API 를 RESTful API 라고 부르고, 이런 방식으로 API를 작성하는 것을 RESTful 하다고 한다. 이러한 API가 이전까지는 잘 사용되었지만, 실제 개발 프로세스에서 다음의 몇 가지 제한과 어려움이 드러나게 되었다.
RESTful API는 프론트에서 원하는 정보만 가져오기 어렵다.
필요한 정보를 각각의 endpoint로 구현하는 것이 힘들었다. 예시로, ios와 android에서 필요한 정보들이 조금씩 달랐고, 그 다른 부분마다 API를 구현하는 것이 힘들었다.
Facebook처럼 같은 홈 화면이어도, 모바일 웹 / 모바일 앱 / pc 웹 경우 각각 다른 UI로 화면을 구성할 필요가 생겼다. 동일한 DB로 다양한 UI를 구성하는 기능이 요구된 것이다.
이러한 문제점을 해결하기 위해서 facebook에서 만든 API용 쿼리 언어인 GraphQL 를 제작했다. 프론트에서 쿼리를 통해 서버의 데이터를 요청하는 데이터 통신 기술이라 할 수 있다.
GraphQL은 API의 데이터에 대한 완전하고 이해하기 쉬운 사용을 제공하고 클라이언트에게 필요한 것을 정확히 요청할 수 있는 권한을 제공하며 시간이 지남에 따라 API를 더 쉽게 발전시켜준다.
또한 GraphQL은 기존의 REST API의 단점과 한계를 해소시켜준다. 그렇다면 두 API 간의 어떤 차이가 있을까? 유저의 정보와, 유저의 포스트, 유저의 팔로워 수를 요청하는 API 예시를 통해 알아보자.
// REST API
/api/users/{id}
/api/users/posts?userid={id}
/api/users/followers/:userid
REST API - 3가지의 정보가 필요하르모 3번의 API 요청이 필요하다.
# GraphQL # GraphQL의 주석은 '#' 이다.
query {
User(id: id) {
name
posts { title }
followers { name }
}
}
GraphQL - 단 하나의 요청으로 3가지의 정보를 받을 수 있다.
두드러지는 차이점은 아래와 같다.
불필요한 데이터
REST
어떤 특정 데이터를 위해 REST API는 엔드포인트로 데이터를 요청한다. 하지만 요청의 반환값에는 클라이언트가 필요하지 않은 데이터도 포함될 수 있는 오버패칭 문제가 있다.
GraphQL
클라이언트가 필요한 데이터만 요청하는 쿼리를 작성하여 필요한 데이터만 가져올 수 있다. 때문에 기존 REST API의 오버패칭 문제를 해소하였다.
버전 관리의 유연성
REST
새로운 버전을 추가하거나 기존 엔드포인트를 변경해야 할 경우, 클라이언트와 서버 간의 호환성을 유지하기 위해 추가적인 관리가 필요하다.
GraphQL
API 스키마를 정의하고 버전을 클라이언트가 관리함으로써 클라이언트와 서버 간의 호환성을 유지하면서 새로운 필드와 타입을 추가하거나 변경할 수 있다.
이러한 배경과 동기로 인해 GraphQL은 데이터 요청 및 조작에 있어 REST API의 한계를 극복하고 더 유연하고 효율적인 방식으로 데이터를 다룰 수 있는 새로운 접근 방식으로 등장하게 되었다. 다음 포스트에서 GraphQL에 더 자세히 알아보자.