GraphQL은 어떻게 탄생했나요?

GraphQL의 인터넷에서 실제로 그것이 무엇인지 쉽게 이해하지 못하는 고정 관념에 대한 정의를 찾을 수 있습니다.

개발자로서 우리는 때때로 기술의 단순한 목적을 이해해야 할 필요가 있습니다. 그러면 스스로 배우고 코딩할 수 있습니다. 그래서 저는 GraphQL에 대한 저의 이해를 공유하기 위해 이 기사를 작성했습니다. 이 기사는 GraphQL을 시작하는 데 도움이 될 것입니다.

GraphQL이 실제로 무엇인지 제대로 이해하기 위해 이 기사를 두 부분으로 나눕니다.
  • REST의 문제
  • 솔루션

  • REST의 문제



    1. REST의 하드 코딩된 정적 구조


  • REST에서 일반적으로 응답 필드는 고정되어 있습니다. 모든 필드가 필요한지 여부에 관계없이 해당 API로 고정된 개체 필드를 얻습니다.
    모든 국가의 이름이 필요하다고 가정해 보겠습니다. API를 http://yourserver../countries에 요청하면 응답이 제공되며 응답은 다음과 같습니다.

  • [
        {
            "name": "Afghanistan",
            "topLevelDomain": [
                ".af"
            ],
            "alpha2Code": "AF",
            "alpha3Code": "AFG",
            "callingCodes": [
                "93"
            ],
            "capital": "Kabul",
            "altSpellings": [
                "AF",
                "Afġānistān"
            ],
            "region": "Asia",
            "subregion": "Southern Asia",
            "population": 27657145,
            "latlng": [
                33.0,
                65.0
            ],
            "demonym": "Afghan",
            "area": 652230.0,
            "gini": 27.8,
            "timezones": [
                "UTC+04:30"
            ],
            "borders": [
                "IRN",
                "PAK",
                "TKM",
                "UZB",
                "TJK",
                "CHN"
            ],
            "nativeName": "افغانستان",
            "numericCode": "004",
            "currencies": [
                {
                    "code": "AFN",
                    "name": "Afghan afghani",
                    "symbol": "؋"
                }
            ],
            "languages": [
                {
                    "iso639_1": "ps",
                    "iso639_2": "pus",
                    "name": "Pashto",
                    "nativeName": "پښتو"
                },
                {
                    "iso639_1": "uz",
                    "iso639_2": "uzb",
                    "name": "Uzbek",
                    "nativeName": "Oʻzbek"
                },
                {
                    "iso639_1": "tk",
                    "iso639_2": "tuk",
                    "name": "Turkmen",
                    "nativeName": "Türkmen"
                }
            ],
            "translations": {
                "de": "Afghanistan",
                "es": "Afganistán",
                "fr": "Afghanistan",
                "ja": "アフガニスタン",
                "it": "Afghanistan",
                "br": "Afeganistão",
                "pt": "Afeganistão",
                "nl": "Afghanistan",
                "hr": "Afganistan",
                "fa": "افغانستان"
            },
            "flag": "https://restcountries.eu/data/afg.svg",
            "regionalBlocs": [
                {
                    "acronym": "SAARC",
                    "name": "South Asian Association for Regional Cooperation",
                    "otherAcronyms": [],
                    "otherNames": []
                }
            ],
            "cioc": "AFG"
        },
    .
    .
    .
    


    So you want to fetch just name and you're getting other fields for free!
    Actually it's not free and that is the second problem of REST.



    그래서 여러분 중 일부는 우리 프로젝트에서 필요한 경우 유일한 이름을 가져오기 위해 다른 API가 있어야 한다고 말합니다. 저는 확실히 그렇게 할 수 있다고 말합니다. 하지만 우리가 해야 할까요?
    중간 규모에서 대규모 프로젝트에 대해 몇 개의 API를 만들어야 합니까?
    실현 불가능, 그렇지?

    2. 성능



    따라서 위의 국가 가져오기 예에서 UI에 표시되지 않는 추가 데이터를 얻고 있다고 생각할 것입니다. 음, 다음과 같은 몇 가지 문제가 발생합니다.
  • API 응답의 다운로드 시간을 늘림
  • 데이터베이스의 필드를 처리하고 필요한 경우 일부 계산도 수행하지만 결국 해당 필드는 필요하지 않습니다.
  • 불필요한 데이터로 인해 브라우저 속도가 느려집니다.

  • 3. 여러 API 호출



    REST에서는 UI에 구조를 구축하기 위해 많은 API 호출을 수행해야 합니다. 예를 들어, 학생의 결과 관련 데이터를 테이블에 표시하려면 먼저 학생을 가져와야 합니다. 그런 다음 각 학생에 대해 결과를 가져오기 위해 API 호출을 수행해야 합니다. 따라서 100명의 학생에 대해 101개의 API 호출이 있습니다. 그리고 실질적으로 API 호출 오버헤드가 증가하고 성능도 저하됩니다.

    해결책



    그래서 위에서 언급한 문제들이 GraphQL을 탄생시켰습니다.
    이를 통해 위에서 논의한 문제를 어떻게 해결할 수 있는지 봅시다.
  • GraphQL에서는 호출 응답에서 원하는 필드를 언급해야 하며 원하는 것만 얻습니다. 따라서 응답 필드는 더 이상, 더도 적습니다.
    GraphQL에서는 모든 것에 대해 POST 요청을 해야 하고 POST 메서드 본문에 원하는 필드 이름을 언급해야 백엔드가 해당 필드에 대해서만 계산을 처리하고 수행하고 응답을 다시 보낼 수 있습니다.

  • 국가의 예

    the size of country data with every field is 254.69KB
    the size of country data with the only name is 3.53KB



  • 따라서 브라우저의 일부 공간을 절약하고 다운로드 시간도 단축됩니다.
  • 단일 호출로 모든 것을 가져올 수 있습니다. 단일 API 요청에서 실제로 가능하지 않지만 많은 API 호출을 저장할 수 있는 필수 데이터를 얻는 방식으로 GraphQL 구조를 설계할 수 있습니다.

  • 따라서 기본적으로 GraphQL은 HTTP 요청-응답을 동적이고 유연하게 만듭니다. 마법이 아니라 백엔드 API도 구성해야 하지만 REST의 기존 문제를 해결하는 멋진 개념/아키텍처입니다.

    좋은 웹페이지 즐겨찾기