GraphQL & Apollo-Server 리뷰

영태·2022년 8월 9일
0

[REVIEW]

목록 보기
5/7
post-thumbnail

GraphQL이란?

  • API를 위한 쿼리언어
  • 이미 존재하는 데이터로 쿼리를 수행하기 위한 서버 측 런타임
  • REST API를 대체할 수 있으며, 단일 API호출로 다양한 데이터 소스에서 데이터를 끌어오는 요청을 구성할 수 있습니다

런타임이란?

  • 프로그래밍 언어가 구동되는 환경
  • node.js를 우리가 JavaScript의 런타임이라고 부르듯 GraphQL은 언어를 통해 프로그램을 구동하는 하나의 환경이라고 이해하면 됩니다

GraphQL의 특징, 장단점

장점

  • 하나의 엔드포인트를 사용하고 한 군데로만 요청을 보내면 됩니다.
    • 이렇게 되면 하나의 API나 View를 따로 구성할 필요가 없어집니다
    • 유지 보수가 용이합니다
  • Fit한 데이터
    • 한번의 요청으로 원하는 모든 데이터를 서버로부터 가져옵니다. 따라서 OverFetching이나 UnderFetching 등의 문제가 발생하지 않습니다.

Overfetching
원하는 data 이상의 정보를 요청받는 것, data의 정제에 리소스가 낭비

Underfetching
원하는 data의 정보를 요청받기 위해 여러번 요청을 보내는 것, 네트워크를 통해 여러번 접근을 하여 리소스 낭비

  • 기종에 상관없는 API
    • Rest-API 상으로는 IOS,안드로이드 등 다른 기종을 위해 제공하는 API 구현이 쉽지 않습니다
    • 이를 해결하기 위한 표준화된 쿼리 언어가 graphql입니다

단점

  • Http 캐싱
    • Http의 캐싱 전략은 각각 URL에 각자의 정책을 설정하는 방식입니다
    • Restful API에서는 이 방식을 그대로 사용 가능합니다
    • 한편 graphql은 하나의 URL(ex) http://~~~/graphql)로 처리하기 때문에 Http의 캐싱 전략을 그대로 사용하는 것이 불가능합니다
    • 이를 위한 graphql만의 캐싱 방법
      • 자동화된 영속쿼리 (APQ)
        • SHA-256 해시된 고유 식별자와 함께 서버 측에 캐시되는 쿼리 문자열
      • 아폴로 엔진을 통해 설정값에 따라 APQ에 따른 캐싱을 할 수 있습니다
    • 파일 업로드
      • 지속 성장 중이기에 완성된 명세가 존재하지 않습니다
      • 따라서 이외의 것들은 직접 개발해야 하는데, 대표적인 것이 파일 업로드입니다.
        • 방법
          • apollo-upload-server와 같은 라이브러리 사용
          • 파일 업로드를 위해 분리된 API 사용
          • Base64 인코딩
    • 요청 필터링의 어려움
      • 잘못된 요청을 필터링하기가 까다롭다
    • 고정된 크기의 요청이 많을 때는 RestAPI 보다 요청량이 많을 수 있습니다.
    • 재귀적인   Query 문을 사용하지 못합니다.

GraphQL을 사용한 이유

기존 REST api의 한계

  • 특정 기능을 위해 여러번의 API 호출이 필요합니다
  • 특정 요청에 fit한 응답을 돌려주기 위해서는 API를 새로 만들어야 한다
  • API 유지보수의 어려움
  • 서비스의 덩치가 커지고 관리해야할 엔드포인트가 증가함에 따라 위와 같은 문제점들이 발생합니다
  • RESTful API 상의 UnderFetching
    • RestApi는 일반적으로 url을 통해서 요청을 하고 결과값을 반환합니다.
    • 하지만 만약에 웹이 처음에 켜지고 너무 많은 요청들이 들어오면 서버가 과부화 될 수 있습니다
    • 하지만 GraphQL에서는 단 한번의 요청만으로 페이지에 필요한 모든 데이터를 가져올 수 있습니다.
  • RESTful API 상의 OverFetching
    • RestApi에서는 예를 들어 유저의 정보를 가져오는데 get /users를 쓸겁니다.
    • 근데 클라이언트는 이름만 필요하는데 /getNames를 하나 새롭게 만드는 것도 불편하고 /users를 통해서 유저 정보 중 이름만 반환하는 것은 디비에 유저의 정보에 접근 하는데 결국 사용하는 것은 이름밖에 없기 때문에 비효율 적입니다.
    • 하지만 GraphQL에서는 자기가 필요한 데이터만 추출해서 받아올 수 있습니다.
    • 그래서 RestAPI와는 다르게 url이아닌 Query문을 통해서 요청을 하게 됩니다.

한 문장으로 요약하면, 관리해야 할 EndPoint의 증가로 인하여 발생되는 문제점이라 할 수 있습니다

정리

텍스트 데이터나 다양한 정보가 필요한 경우에는 GraphQL이 더 좋을 수 도 있습니다.

하지만 파일 형태의 데이터를 주고 받거나 형식적인 요청이 정해져있을 때 Rest를 쓰는 것이 더 좋습니다.

profile
개발 공부중

0개의 댓글