GraphQL

2022. 1. 10. 18:19Cloud Native/Database

    목차
반응형

About GraphQL

GraphQL은 REST API의 한계점을 해결하고자 나온 통신 규약입니다. 그러나 상세한 입맛에 맞는 구현이 이뤄져야 하며, 사용하는데 있어서도 어느 정도의 시간이 필요합니다.

Facebook에서 만든 query language 입니다. QL이라는 suffix가 붙어 있어서 SQL과 유사할까 하는 생각이 들지만, 그렇지는 않습니다.

  • GraphQL
    • 데이터를 서버에어 효율적으로 가져오는 것이 목적
    • 즉, query 문이 client에서 작성됩니다.
    • 특정 통신 방식 및 저장 방식에 종속적이지 않습니다.
  • SQL
    • DB에 저장된 데이터를 효율적으로 가져오는 것이 목적
    • 즉, query 문이 server에서 작성됩니다.

GraphQL 특징

  • GraphQL로의 통신은 보통 HTTP POST method 혹은 websocket을 이용합니다.
  • GraphQL query 처리
    • query는 parsing 된 후 resolver에서 실제 data를 가져온 후 결과를 JSON 형태로 리턴 합니다.
      • resolver는 NoSQL, Redis(In-memory DB), RDB 등 다양한 source가 될 수 있습니다.

REST API와 비교

REST API는 URL의 조합을 통해 다양한 endpoint를 정의할 수 있습니다. 그러나 GraphQL은 하나의 endpoint만 존재합니다. 데이터의 type은 query 조합을 통해 결정합니다.

  • REST API의 한계
    • Over-fetching
      • GET /movie/1/
        • response로 movie에 대한 모든 정보를 반환한다고 가정
        • 이 때 title name만 필요할 경우에도 모든 데이터를 다 받아서 name만 추출하여 사용해야 함
      • 이런 낭비를 over-fetching이라고 함
    • Under-fetching
      • Over-fetching과 반대로 서로 다른 여러 데이터들을 조합하여 하나의 데이터 format으로 만들고자 할 때
      • 불 필요하게 여러번 API를 호출해야 하는 것이 바로 under-fetching
  • GraphQL은?
    • 위와 같은 REST API의 제약/한계를 극복하고자 나타난 것이 GraphQL 임
    • endpoint는 통상 1개를 생성하고 client가 필요한 data에 대한 query를 작성하여 query에 따른 결과를 얻음

query

query {
    movie(movie_no: 1) {
        movie_name
    }
}

resp

{
    "data": {
        "movie": {
            "movie_name": "Gone with wind"
        }
    }
}

Over-fetching에 대항하는 GraphQL

query

query {
    screen {
        screen_no
    }
    movie(movie_no: 1) {
        movie_name
    }
}

resp

{
    "screen": {
        "screen_name": "screen_1",
        ...
    }
    "movie": {
        "movie_name": "Gone with wind"
    }
}

GraphQL query

  • query
    • data를 read 하는데 사용합니다.
  • mutation
    • 데이터를 update 하는데 사용합니다.

Resolver

GraphQL에서 data를 가져오는 과정은 resolver가 담당합니다. 이를 구현하여 실제 data를 저장하는 부분을 마치 plugin 처럼 구현하여 사용하게 됩니다. 즉, 통일된 GraphQL query 문을 통해 다양한 concrete database를 사용할 수 있습니다. 불편할 수도 있으나, 이는 GraphQL이 데이터를 저장하는 목적이 아니라 query문을 통해 쉽게 데이터에 대한 CRUD를 지원하고자 하는 database framework임을 알 수 있는 부분입니다.

반응형

'Cloud Native > Database' 카테고리의 다른 글

ORM (Object Relational Mapping) w/ Pydantic and SQLAlchemy  (0) 2022.05.06
master table, transaction table  (0) 2022.04.30
개념적 모델링, 논리적 모델링  (0) 2022.04.30
정규화  (0) 2022.04.30
PostgreSQL  (0) 2022.01.11