GraphQL이란?

Donggu(oo)·2023년 1월 30일
0

GraphQL

목록 보기
1/3
post-thumbnail

1. GraphQL이란?


  • GraphQL이란 SQL(Structed Query Language)와 마찬가지로 쿼리 언어이다. 그러나 SQL은 데이터베이스 시스템에 저장된 데이터를 효율적으로 가지고 오는 것이 목적이고, GraphQL은 웹 클라이언트가 데이터를 서버로 부터 효율적으로 가져오는 것을 목적으로 한다.

  • GraphQL에서는 모든 데이터가 그래프 형태로 연결되어 있다고 전제한다. 그래프를 누구의 입장에서 정렬하느냐(클라이언트가 어떤 데이터를 필요로 하느냐)에 따라 트리 구조를 이룰 수 있다.

  • 이를 통해 GraphQL은 클라이언트 요청에 따라 유연하게 트리 구조의 JSON 데이터를 응답으로 전송할 수 있다. 즉, GraphQL은 REST API 방식의 고정된 자원이 아닌 클라이언트 요청에 따라 유연하게 자원을 가져올 수 있다.

2. GraphQL의 특징


  • GraphQL은 HTTP를 통해 API 서버로 요청을 보내고 응답을 받는다.

  • 응답을 받을 시, 데이터 결과를 JSON 형식으로 받는다.

  • GraphQL은 서버 개발자가 작성한 각 필드에 대응하는 resolver 함수로 각 필드의 데이터를 조회할 수 있다.

  • GraphQL은 GraphQL 라이브러리가 조회 대상 schema가 유효한지 검사한다.

3. GraphQL의 장단점


1) 장점

1-1. 하나의 endpoint 요청

  • /graphql이라는 하나의 endpoint로 요청을 받고 그 요청에 따라 query , mutation을 resolver 함수로 전달해서 요청에 응답한다. 모든 클라이언트 요청은 POST 메소드를 사용한다.

1-2. No over & underfetching

  • 여러 개의 endpoint 요청을 할 필요없이 하나의 endpoint에서 쿼리를 이용해 원하는 데이터를 정확하게 API에 요청하고 응답으로 받을 수 있다.

1-3. 강력한 playground

  • graphql 서버를 실행하면 playground라는 GUI를 이용해 resolverschema 를 한 눈에 보고 테스트 해 볼 수 있다. (POSTMAN 과 비슷)

1-4. 클라이언트 구조 변경에도 지장이 없음

  • 클라이언트 구조가 바뀌어도 필요한 데이터를 결정하고 받는 주체가 클라이언트이기 때문에 서버에 지장이 없다. 클라이언트에서는 무슨 데이터가 필요한 지에 대해서만 요구사항을 쿼리로 작성하면 된다.

2) 단점

2-1. 재학습 필요

  • REST API에 친숙한 개발자의 경우 GraphQL를 학습하는 데 시간이 필요하다.

2-2. 캐싱이 REST보다 훨씬 복잡함

  • HTTP에선 각 메소드에 따라 캐싱이 구현되어 있다. 하지만 GraphQL에선 POST 메소드만을 이용해 요청을 보내기 때문에 각 메소드에 따른 캐싱을 지원받을 수 없다. 그래서 이를 보완하기 위해 Apollo 엔진의 캐싱과 영속 쿼리 등이 등장하게 되었다.

2-3. 요청의 크기 증가

  • 고정된 요청과 응답만 필요할 경우에는 Query 로 인해 요청의 크기가 RESTful API 의 경우보다 더 커진다.

4. GraphQL과 REST API


1) REST API의 한계점

1-1. Overfetch

  • Overfetch는 경우 클라이언트가 필요없는 정보까지 제공받는 경우를 말한다.

  • 예를 들어 유저의 이름만 필요한 상황에서 REST API를 사용한다면, 응답 데이터에는 유저의 주소, 생일 등과 같이 실제로는 클라이언트에게 필요없는 정보까지 모두 포함되어 있다.

1-2. Underfetch

  • Underfetch는 endpoint가 필요한 정보를 충분히 제공하지 못하는 경우를 말한다. Underfetch의 경우 클라이언트는 필요한 정보를 모두 확보하기 위해 추가적인 요청을 보내야 한다.

  • 예를 들어 유저 정보 뿐만 아니라 유저의 목록 및 유저가 보유한 팔로워까지 필요하다면, 필요한 정보를 모두 가져오기 위해 REST API에서는 각각의 자원에 따라 엔드포인트를 구분하기 때문에 3가지 엔트포인트에 요청을 보내야한다.

1-3. 클라이언트 구조 변경 시 엔드포인트 변경 또는 데이터 수정이 필요

  • REST API에서는 자원의 크기와 형태를 서버에서 결정하기 때문에 클라이언트가 직접 데이터의 형태를 결정할 수 없다. 이로 인해 만약 클라이언트에서 필요한 데이터의 내용이 변할 경우 다른 endpoint를 통해 변경된 데이터를 가져오거나 수정을 해야한다.

2) REST API와 GraphQL의 차이점

  • REST API는 Resource에 대한 형태 정의와 데이터 요청 방법이 연결되어 있지만, GraphQL에서는 완전히 분리되어 있다.

  • REST API는 Resource의 크기와 형태를 서버에서 결정하지만, GraphQL에서는 Resource에 대한 정보만 정의하고, 필요한 크기와 형태는 클라이언트 단에서 요청 시 결정한다.

  • REST API는 URI가 Resource를 나타내고 Method가 작업의 유형을 나타내지만, GraphQL에서는 GraphQL Schema가 Resource를 나타내고 Query, Mutation 타입이 작업의 유형을 나타낸다.

  • REST API는 여러 Resource에 접근하고자 할 때 여러 번의 요청이 필요하지만, GraphQL에서는 한번의 요청에서 여러 Resource에 접근할 수 있다.

  • REST API에서 각 요청은 해당 엔드포인트에 정의된 핸들링 함수를 호출하여 작업을 처리하지만, GraphQL에서는 요청 받은 각 필드에 대한 resolver를 호출하여 작업을 처리한다.

0개의 댓글