본문 바로가기

STUDY/TIL

GraphQL

GraphQL은 쿼리 데이터베이스용으로 만들어진 개념을 가져다가 인터넷에 적용해 만들어진 것입니다. GraphQL 쿼리 하나로 여기저기 흩어져 있는 데이터를 한데 모아 받습니다. SQL처럼 GraphQL 쿼리도 데이터를 변경하거나 삭제할 때 사용합니다.

GraphQL과 SQL은 둘 다 쿼리 언어이기는 하나, 사용 환경이 완전히 다릅니다.

 

(출처: 웹 앱 API 개발을 위한 GraphQL | 이프 포셀로, 알렉스 뱅크스 저)

 

SQL 쿼리

  • 데이터베이스로 보냄
  • SQL데이터는 데이터 테이블 안에 저장돼 있음
  • 데이터베이스용 쿼리언어
  • 주로 벡엔드 시스템에서 작성하고 호출

GraphQL쿼리

  • API로 보냄
  • GraphQL데이터는 저장 환경을 가리지 않음 - 단일 데이터베이스, 여러 개의 데이터베이스, 파일 시스템, REST API, 웹소켓, 또다른 GraphQL API로 부터 데이터를 받아올 수 있음
  • 인터넷용 쿼리언어
  • 주로 클라이언트 시스템에서 작성하고 호출
  • 명세에 따라 표준화 되어있음 - 프로그래밍 언어에 종속되지 않음

REST API VS GraphQL

REST API GraphQL
다양한 Endpoint가 존재 단 하나의 Endpoint - 한 번의 네트워크 호출로 처리
Endpoint마다 SQL 쿼리가 달라짐 gql 스키마의 타입에 따라 SQL 쿼리가 달라짐
REST의 가장 일반적인 문제인 언더페치와 오버페치가 존재 클라이언트 측에서 응답 형식을 지정할 수 있으므로
언더페치와 오버페치 문제를 해결할 수 있음

언더페치(underfetch) - REST API를 사용할 때 필요한 데이터를 완성하기 위해 여러번의 API 요청을 해야 하는 경우

오버페치(overfetch) - 필요한 정보 이외에 불필요한 정보까지 함께 요청하거나 응답받는 경우

 

출처: https://www.apollographql.com/blog/graphql-vs-rest-5d425123e34b/
출처: https://www.howtographql.com/basics/1-graphql-is-the-better-rest/

REST API를 사용할 경우 필요한 정보를 위해 몇 번의 요청을 해야하는 경우(언더페치)가 발생

 

 

출처: https://www.howtographql.com/basics/1-graphql-is-the-better-rest/

GraphQL API를 사용할 경우 필요한 데이터들을 쿼리로 작성하고 해당 형식과 거의 동일한 JSON응답을 받을 수 있음

 

Query: 데이터 요청 (SQL에서의 SELECT) - R

GraphQL에서는 SELECT대신 Query를 사용해 데이터 요청을 보냄. 쿼리 안에 서버에서 받고싶은 데이터를 필드로 작성.

쿼리 한 번에 여러 종류의 데이터를 모두 받을 수 있음. 

GraphQL API에서 쿼리에 사용할 수 있는 필드는 API 스키마에 정의.

응답받은 JSON은 쿼리가 요청한 데이터가 모두 들어있으며, 쿼리의 형태와 똑같음.

만약 응답 객체의 필드명을 다르게 설정하고 싶다면 각 필드에 별칭을 부여하면 됨.

원하는 쿼리 결과만 받고싶다면 쿼리 인자(query arguments)를 넣어 보낼 수 있음.

쿼리 필드와 관련 있는 키-값 쌍을 하나 이상 인자로 넣을 수 있음.

 

GraphQL쿼리에서 필드는 스칼라(scalar)타입객체(object)타입이 있으며 스칼라 타입은 Int, Float, String, Boolean, 그리고 ID(고유 식별자)가 해당되며 객체타입은 스키마에 정의한 필드를 그룹으로 묶어둔 것.

타입 여러 개를 한 번에 리스트에 담아 반환하고 싶다면 유니언 타입(union type)을 만들어 사용하면 됨.

 

Mutation: 데이터 조작 (INSERT, UPDATE, DELETE) - CUD

데이터를 수정하려면 뮤테이션을 사용. 애플리케이션의 전반적인 상태를 수정하고자 하는 의도로 사용.

데이터를 뮤테이션 하면 백엔트 데이터에 영향을 주게 됨.

 

Subscription: 소켓 연결로 전달되는 데이터 변경 사항을 감지

데이터 서브스크립션(구독)을 하게되면 GraphQL API를 사용해 실시간 데이터 변경 내용을 받을 수 있음.

페이스북의 좋아요 수를 새로고침 없이 실시간으로 보여주는 방법에 쓰임.

서브스크립션이 시작되면 웹소켓으로 변경 내용을 받아 볼 수 있음.

 

Introspection

인트로스펙션을 사용하면 현재 API 스키마의 세부 사항에 관한 쿼리를 작성할 수 있음. 

현재 서버에 정의된 스키마의 실시간 정보 공유를 가능하게 함.

 

Resolver

특정 필드의 데이터를 반환하는 함수. 스키마에 정의된 타입과 형태에 따라 데이터를 반환.

비동기로 작성할 수 잇으며 REST API, 데이터베이스, 혹은 기타 서비스의 데이터를 가져오거나 업데이트 작업을 할 수 있음.

 

 


+ 참고

 

웹 앱 API 개발을 위한 GraphQL | 이프 포셀로, 알렉스 뱅크스 저

 

 

GraphQL 개념잡기

GraphQL은 페이스북에서 만든 쿼리 언어입니다. GrpahQL은 요즘 개발자들 사이에서 자주 입에 오르내리고 있으나, 2019년 7월 기준으로 얼리스테이지(early-stage)임은 분명합니다. 국내에서 GraphQL API를 O

tech.kakao.com

 

Top 5 Reasons to Use GraphQL | Prisma

GraphQL is becoming the new standard for API development — learn the top reasons why in this article.

www.prisma.io