GraphQL을 사용하면 API 서버에서 엄격하게 정의된 endpoint들에 요청하는 대신, 한 번의 요청으로 가져오고 싶은 데이터를 가져올 수 있게 도와주는 쿼리를 보낼 수 있다.
GraphQL은 필요한 데이터를 최적화하여 가져올 수 있다.
Backend의 많은 로직을 Frontend로 분산함으로써 Frontend와 Backend의 협업 방식에 많은 변화를 가져올 수 있다.
Important difference between REST API and GraphQL
- Single Endpoint vs Multiple Endpoints
REST는 서로 다른 데이터 집합을 얻기 위해 별도의 endpoint가 있지만, GraphQL은 필요한 데이터만 선택해서 가져올 수 있는 하나의 endpoint만 제공한다.
예를 들어, REST는 게시물과 작성자 데이터를 모두 가져오기 위해 여러 요청을 다른 엔드포인트로 보내야 하지만 GraphQL을 사용하면 하나의 엔드포인트에만 연결해서 원하는 데이터를 모두 얻을 수 있다.
이는 중대형 웹 애플리케이션에 대한 endpoint를 유지하고 관리할 때 큰 이점이 된다. - 데이터 다운로드 (Over fetching and Under fetching)
REST의 주요 문제 중 하나는 데이터를 너무 많이 가져오거나 적게 가져오는 것이다.
정확히 원하는 데이터만 다운로드 할 수 있는 방법이 제공되지 않는데, 예를 들어 사용자의 이름, 나이 및 거주지를 다운로드하려는 경우 별도의 endpoint가 없는 한 전체 사용자 개체를 다운로드해야 한다.
모든 요구사항에 대해 새로운 endpoint를 추가하게 되면 endpoint가 폭발적으로 증가하여 유지관리가 어려워진다.
이 문제는 GraphQL을 사용함으로써 해결할 수 있다. Query의 형태로 정확히 필요한 내용을 지정하기 때문에 너무 적거나 너무 많이 다운로드하지 않고 딱 적당하게 원하는 정보만 다운로드 할 수 있다. - Response structure (응답 구조)
REST API의 문제 중 하나는 무엇을 얻고 있는지 100% 확신할 수 없다는 것이다. 즉, 알지 못하는 더 많은 속성을 얻을 수 있다. GraphQL을 사용하면 쿼리 구조와 정확하게 일치하는 응답 구조를 받기 때문에 구조를 미리 파악할 수 있다. - Relationship (관계)
REST와 GraphQL의 또 다른 차이는 GraphQL이 자동으로 관계를 핸들링 한다는 것이다.
예를 들어, 댓글이 있는 게시물을 요청하는 경우 쿼리에 지정만 하면 GraphQL은 게시물과 함께 댓글의 세부 정보도 가져온다.
REST를 사용하면 제공된 엔드포인트를 사용해서 데이터를 가져오기 위해 다른 요청을 추가적으로 보내야 한다. - Performance
REST와 GraphQL API의 가장 큰 차이점 중 하나는 아키텍처를 변경할 때 얻을 수 있는 즉각적인 성능 향상이다.
GraphQL을 사용하면 단 한 번의 요청으로 여러 리소스를 사용할 수 있기 때문에 많은 시간을 절약할 수 있다.
또 정확히 필요한 데이터만 얻을 수 있기 때문에 메모리와 구문 분석 문제(less parsing headache)가 줄어든다.
특히 제한된 리소스와 slow connection으로 작업해야 하는 모바일 애플리케이션에서 높은 성능 향상을 가질 수 있다.
- REST는 Resource에 대한 형태 정의와 데이터 요청 방법이 연결되어 있지만, GraphQL에서는 Resource에 대한 형태 정의와 데이터 요청이 완전히 분리되어 있다.
- REST에서는 Resource의 크기와 형태를 서버에서 결정하지만, GraphQL에서는 Resource에 대한 정보만 정의하고 필요한 크기와 형태는 client단에서 요청 시 결정한다.
- REST에서는 URI가 Resource를 나타내고 Method가 작업의 유형을 나타내지만, GraphQL에서는 GraphQL Schem가 Resource를 나타내고 Query, Mutation 타입이 작업의 유형을 나타낸다.
- REST에서는 여러 Resource에 접근하고자 할 때 각 유형에 맞는 여러 번의 요청이 필요하지만, GraphQL에서는 한 번의 요청으로 여러 Resource에 접근할 수 있다.
- REST에서 각 요청은 해당 엔드포인트에 정의된 핸들링 함수를 호출하여 처리하지만, GraphQL에서는 요청 받은 각 필드에 대한 resolver를 호출하여 작업을 처리한다.
GraphQL ?
GraphQL은 메타(facebook)에서 만든 API(Application Programming Interface)를 위한 쿼리 언어로 클라이언트로부터 쿼리를 전달받아 요청받은 데이터를 반환해준다.
메타에서 이야기한 GraphQL을 개발한 이유
RESTful API를 사용하면 다양한 기종에서 필요한 정보들을 일일히 구현하는 것이 힘들었다.
iOS와 Android에서 필요한 데이터가 조금씩 달랐고, 다를 때마다 새로운 API를 개발해야 했다.
GraphQL을 사용함으로써 Backend에서 처리해야 하는 로직이 Frontend로 분산되었다.
GraphQL의 핵심 아이디어는 간단한 문자열을 서버로 보내는 것이다. (query)
문자열(쿼리)은 서버에서 해석되고 쿼리의 구조를 따른 JSON payload를 응답한다.
아래 예제의 왼쪽은 질의(쿼리 언어), 오른쪽은 응답이다.
GraphQL의 장점
Over fetching과 Under fetching이 발생하지 않는다. 왜냐하면 GraphQL은 개발자가 요청한 쿼리에 따라 응답이 오기 때문이다.
- Over fetching : 요청한 영역의 정보보다 더 많은 정보를 받는다. 즉 쓸모없는 정보들도 함께 받게 되며 요청자는 알지 못하는 데이터를 받게된다.
- Under fetching : 원하는 영역을 얻기 위해 다른 요청을 해야 할 때 발생한다. 예를 들어, SNS를 시작하면 피드정보, 알림, 사용자 프로필 정보가 필요하다. 이 정보를 모두 얻기 위해선 세 개의 요청이 필요한데, 이처럼 REST에서 여러 번 요청하는 것이다.
- HTTP 요청의 횟수를 줄일 수 있다. 원하는 정보를 쿼리에 담아 한 번에 요청이 가능하기 때문이다.
- HTTP 응답의 사이즈를 줄일 수 있다. 필요한 정보만 부분적으로 요청해서 받기 때문이다.
GraphQL의 단점
- 고정된 요청과 응답만 필요한 경우 쿼리로 인해 요청의 크기가 REST 보다 커진다.
- 재귀적인 쿼리가 불가능하다. 결과에 따라 응답의 깊이가 얼마든지 깊어질 수 있는 API를 만들 수 없다.
REST ?
REST(Representational State Transfer)는 웹 서비스를 개발할 때 일련의 제약 조건을 준수하는 아키텍처 스타일이다. REST 또는 RESTful AP는 REST 표준을 따르는 웹 서비스 API로 SOAP와 달리 REST API는 XML 형식으로 제한되지 않으며 필요한 내용에 따라 여러 데이터 형식을 반환할 수 있다. REST API에서 지원되는 데이터 형식에는 JSON, XML 및 YAML이 있다.
REST는 모든 리소스들을 각각의 Endpoint에 연결해서 Endpint는 해당 리소스와 관련된 내용만 처리하는 방법론이다.
REST 요청은 endpoint, HTTP method, Header, Body(본문)으로 구성된다.
endpoint에는 온라인 리소스를 식별하는 데 도움이 되는 URI가 포함되어 있다.
HTTP 메서드는 GET, POST, PUT, PATCH, DELETE가 있다.
데이터를 작업할 때 RESTful API는 HTTP 메서드를 사용하여 CRUD 작업을 수행한다.
Header는 caching, authentication 등과 같은 목적으로 클라이언트 및 서버에 정보를 제공한다.
Body(본문(에는 요청의 payload와 같은 클라이언트가 서버로 보내려는 정보가 들어있다.
예를 들어, 특정 리소스(User)에 대한 정보를 CRUD 하는 API를 구성한다고 하면 Endpoint는 다음과 같다.
- 생성 : POST /user
- 조회 : GET /user/{user_id}
- 수정 : PUT /user/{user_id}
- 삭제 : DELETE /user/{user_id}
References
https://1eemember.tistory.com/54
https://velog.io/@jeon_131/GraphQL%EA%B3%BC-REST
'IT 기본지식' 카테고리의 다른 글
NAS와 SAN Storage의 차이? (0) | 2022.08.25 |
---|---|
HTML과 web 브라우저, web 서버 (0) | 2022.08.24 |
Docker(Container)와 VM의 차이는 무엇인가? (0) | 2022.07.25 |
Docker Container와 Image란 무엇인가? (2) | 2022.07.25 |
public/private IP란? | LAN, NAT, Mac Address (0) | 2022.07.24 |
댓글