오늘은 REST API vs GraphQL 각 각의 개념과 차이점에 대해 알아보자👍
Server API (혹은 Server-side web API)는 적절한 요청을 하였을 때 그에 맞는 응답을 되돌려 주는 창구 (Endpoint)를 Web를 통해 노출한 것을 말한다.
이런 Server API 는 어떤 정보들(환율, 주식 시세, 뉴스 …)을 요청하고 수정하기 위해서 만들어지는 경우가 많다.
이 Server API 를 만드는 방법론 중 하나로 REST 라는 것이 있으며,
이 방법론은 많은 Server API 들을 구성하기 위해 사용되어왔고, 또 현재도 많이 사용되고 있다.
-REST는 REpresentational State Transfer 의 줄임말이다.
모든 Resource (자료, User, …) 들을 하나의 Endpoint 에 연결해놓고,
각 Endpoint 는 그 Resource 와 관련된 내용만 관리하게 하자는 방법론이다.
즉 자원(resource)의 표현(representation)에 의한 상태 전달
좁은 의미로 HTTP를 통해 CRUD(Create, Read, Update, Delete)를 실행하는 API를 뜻한다.
여기서 자원(Resource)은 해당 소트웨어가 관리하는 모든 것이다.
자원의 표현은 그 자원을 표현하기 위한 이름으로 예를들어 DB의 유저정보가 자원이라면 user를 자원의 표현으로 정한다
REST API는 그 형식(주소) 만으로 대략 이게 무슨 요청인지 알 게 해준다.
예시로 어떤 API가 Community site용 API이며, 이 API를 통해 사용자들이 글을 CRUD 할 수 있고 각 댓글에도 작성/수정/삭제 할 수 있다고 해보자
이때 API 의 Endpoint 를 다음과 같이 구성하면 REST 의 조건을 간략히는 만족하게 된다.
글 관련 API = /posts
글 작성 = POST /posts
글 수정 = PATCH /posts/[postid]
글 삭제 = DELETE /posts/[postid]
댓글 관련 API = /posts/[postid]/comments
댓글 작성 = POST /posts/[postid]/comments
댓글 수정 = PATCH /posts/[postid]/comments/[commentid]
댓글 삭제 = DELETE /posts/[postid]/comments/[commentid]
- 즉 RESTful하다라는 것은 REST API의 설계의도를 명확하게 지켜주는 것이다. 슬래시를 통해 계층관계를 표시한다던가 숫자는 id를 나타낸다든가 동사보단 명사를 위주로 쓴다든가 하는 등
REST API는 클라이언트 서버 프로토콜을 사용하기 때문에 (주로 HTTP)
REST ? 웹상에서 사용되는 여러 리소스를 stateless 클라이언트 서버 프로토콜중에서 HTTP URI 로 표현하고 그 리소스에 대한 행위를 HTTP method로 정의하는 것
URI ? 해당 사이트에 특정 자원에 위치를 나타내는 유일한 주소 ( EX) 나 )
*URL ? URI가 URL을 양식으로 사용한다 ex)내가 있는 장소 , 장소로 표현
naver.com/ => URI
naver.com/sports/ => URI
GraphQL 은 Graph Query Language 의 줄임말이다.
Query Language 는 정보를 얻기 위해 보내는 질의문(Query)을 만들기 위해 사용되는 Computer 언어의 일종이다.
GraphQL 은 이런 Query Language 중에서도 Server API 를 통해 정보를 주고받기 위해 사용하는 Query Language 이다.
다시말해, REST 방법론이 있는데도 새로운 언어인 GraphQL 이 탄생해야했던 배경은 무엇인가?
RESTful API 로는 다양한 기종에서 필요한 정보들을 일일히 구현하는 것이 힘들었다.
예로, iOS 와 Android 에서 필요한 정보들이 조금씩 달랐고, 그 다른 부분마다 API 를 구현하는 것이 힘들었다.
이 때문에 정보를 사용하는 측에서 원하는 대로 정보를 가져올 수 있고,
보다 편하게 정보를 수정할 수 있도록 하는 표준화된 Query language 를 만들게 되었다.
GraphQL API 는 주로 전체 API를 위해서 하나의 Endpoint 를 사용한다.
(RESTful API 는 Resource 마다 하나의 Endpoint 를 가지고, 그 Endpoint 에서 그 Resource 에 대한 (거의) 모든 것을 담당한다.)
GraphQL API 는 요청할 때 사용한 Query 문에 따라 응답의 구조가 달라진다.
GraphQL API 는 유연하다 백엔드에서 지정해놓는 틀이 거의 없기 때문이다.
graphQL 은 뷔페 RESTful API 는 세트메뉴와 같다
뷔페는 내가 먹고 싶은것만 먹을수 있지만 세트메뉴는 내가 필요하지 않은것도 들어있다.
1) HTTP 요청의 횟수를 줄일 수 있다.
2) HTTP 응답의 Size 를 줄일 수 있다.
1) File 전송 등 Text 만으로 하기 힘든 내용들을 처리하기 복잡하다.
2) 고정된 요청과 응답만 필요할 경우에는 Query 로 인해 요청의 크기가 RESTful API 의 경우보다 더 커진다.
3) 재귀적인 Query 가 불가능하다. (결과에 따라 응답의 깊이가 얼마든지 깊어질 수 있는 API 를 만들 수 없다.)
그렇다면 GraphQL 과 RESTful 중 어떤 것을 선택해서 사용해야하는가?
다음과 같은 기준으로 선택하면 될 것이다.