본문 바로가기

카테고리 없음

TIL-220808

GraphQL - Graph Query Langugae 

GraphQL 환경 - 객체를 가져오듯이 구체적인 요청이 가능하다.

GraphQL은 마치 SQL과 비슷해보인다. 둘다 쿼리 언어이기도하고.

하지만 SQL은 DB에서 저장된 데이터를 효율적으로 가져오기 위해 사용되며

GraphQL은 웹클라이언트가 서버로부터 데이터를 가져오기위해 사용됩니다.

 

정확히는 서버 API를 구성하기 위해 만들어진 언어이고.

 

기존의 Rest API에서는 정확히 원하는 정보만 가지고올 수 있는 것이 어려웠고

그렇기 때문에 Over fetching 이라는 문제가 생겼다.

 

Over-fetching이란 

목적을 위해 필요한 데이터를 받기위해 해당 대상의 모든 데이터를 받는 문제를 말한다.

예를 들어 특정 유저의 user_id / username / profile_image 만 필요한 경우에

그외 포함하고있는 모든 데이터를 같이 받게되는 문제가 있다.

 

또한 Under-fetching의 문제도 있는데. 

 

Under-fetching이란

하나의 컨트롤러를 표현하기위해 2번이상의 API 호출이 발생하는 상황을 말한다.

예를들어 유저의 특정시점대의 과거 프로필 이미지를 보여주고싶은데

과거 프로필 이미지 주소가 profile_image 안에 포함되어 있지만

생성된 날짜를 조회하기 위해서는 다른 데이터에 조회해야하는경우 호출을 두번해야한다.

 

하지만 GraphQL은 이름처럼 데이터들을 그래프처럼 엮어 정확히 필요한 데이터만

한번에 같이 CRUD할 수 있도록 해주는 언어이자, 방법론이다.

그래프 - 자료구조 예시

 

Restful API와는 다르게 데이터의 요청과 응답이 매우 합리적이고 필요한만큼만 일어나기에 서버자원을 절약하기에도 좋으며.

1번의 사용을 위해 1번의 호출만 필요하므로 웹상에서 비동기 실행시에 발생하는 오류에 대해서도 원천적으로 봉쇄가 가능하다.

 

다만 단점으로는

GraphQL은 Restful API에 비하여 상대적으로 시간소모가 많고 복잡하다.

[물론 API를 만든 후 미들웨어를 이용해 GraphQL로 불러오도록 하는 방법도 있다. 마찬가지로 미들웨어를 만들고 API에 맞게 설정을 해줘야하기에 시간과 노력이 조금 더 들어간다는 표현이 맞겠다.]

또한, 특정 연산에서  A와 B가 사용되었다가, C,D도 함께 들어가야하는 경우. 

기존의 API 호출을 바꾸지 않아도 되는  경우가 있지만, GraphQL은 호출 코드를 매번 수정해야하는 번거로움이 있고.

고정된 요청과 응답의 경우 Restful API보다 요청의 크기가 커지게되며.

재귀적인 Query가 불가능하다.