본문 바로가기
Back-end

GraphQL Ruby

by 탄이. 2019. 1. 14.

GraphQL Ruby

개요

  • GraphQL 은 페이스북에서 만든 어플리케이션 레이어 쿼리 언어입니다.

  • 기존의 웹 혹은 모바일 어플리케이션의 API 를 구현 할 때는, 통상적으로 REST API 가 사용됩니다.

  • 기존의 REST API 를 사용하여 API 를 구현을 한다면, 우리가 클라이언트사이드에서 어떠한 기능이 필요 할 때마다 그때 그때 새로운 API를 만들어주었어야했습니다.

  • 예를들어 여러분의 어플리케이션에 Account 라는 모델이 있고, /accounts 라는 endpoint 가 있다고 가정해봅시다.

    • 만약에 특정 id 를 가진 계정의 정보를 가져오려면 다음과 같이 하겠죠.

      • GET /accounts/1

      •   {
        "account": {
          "id": "1",
          "username": "velopert",
          "email": "public.velopert@gmail.com",
          "friends": [
            "2",
            "3"
          ],
          "first_name": "Minjun",
          "last_name": "Kim"
        }
        }
    • 위 데이터를 보시면 친구의 id들을 friends 라는 field 에 담습니다.

    •   "friends": [
          "2",
          "3"
        ]
    • 이 목록에 따라서, 친구 계정들의 목록을 가져오려면, 이런 API를 만들어야겠죠.

      • GET /accounts/1/?include_friend_details=username,first_name

      • GET /accounts_with_friend_details/1

    • 이런식으로 진행하다가보면, 나중에 어플리케이션의 규모가 커지면 수많은.. 정말 수많은 endpoint가 생성되게 됩니다.

    • 만약에, 다음과 같이 클라이언트측에서 쿼리를 만들어서 서버로 보내면 우리가 원하는대로 결과를 반환해주면 좋지 않을까요?

쿼리

  •   query {
      account(id: "1") {
          username
          email
          firstName
          lastName
          friends {
              firstName
              username
          }
      }
    }

결과

  •   {
    "data": {
      "account": {
        "username": "velopert",
        "email": "public.velopert@gmail.com",
        "firstName": "Minjun",
        "lastName": "Kim",
        "friends": [
          {
            "firstName": "Jayna",
            "username": "jn4kim"
          },
          {
            "firstName": "Abet",
            "username": "abet"
          }
        ]
      }
    }
    }
  • 쿼리를 통하여 딱 필요한 데이터만 fetching 을 하기 때문에 overfetch 혹은 underfetch 를 할 걱정을 할 필요가 없습니다.

  • 이 GraphQL 기술은, 특정 언어에 제한된것이 아니여서, Node.js, Ruby, PHP, Python, Golang, 등 여러 환경에서 사용 할 수 있습니다.

  • 심지어, HTTP 프로토콜에 제한되어있지도 않아서, WebSocket 이나 MQTT 프로토콜 위에서 사용 할 수도 있답니다.

  • 데이터베이스도 어떤 데이터베이스를 사용하던 상관없습니다.

  • 따라서, 이미 구현된 시스템에 도입을 해도 기존에 있던 시스템이 무너지지 않기 때문에 부담 없이 적용을 할 수 있습니다.

  • GraphQL을 사용하면 큰 노력을 들이지 않고도, 다양한 형태의 데이터를 fetching 을 할 수 있는 시스템을 구현 할 수 있습니다.


댓글