반응형
반응형

 

 

 

📝Json gzip 압축

GraphQL에서는 Accept-Encoding: gzip으로 Json 압축 기능도 제공한다

https://graphql.org/learn/best-practices/#json-with-gzip

 

GraphQL Best Practices | GraphQL

Copyright © 2024 The GraphQL Foundation. All rights reserved. For web site terms of use, trademark policy and general project policies please see https://lfprojects.org

graphql.org

 

반응형
반응형

📝Mutation

/** ─── 호출 ───**/
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}

/** ─── 호출 변수 ───**/
{
  "ep": "JEDI",
  "review": {
    "stars": 5,
    "commentary": "This is a great movie!"
  }
}

/** ─── 응답 ───**/
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}

Mutation의 경우는 데이터의 조회를 제외한 모든 것에 사용됩니다 특히 데이터 생성, 삭제, 수정에 해당하죠

 

쿼리 필드는 병렬로 실행되는 반면 변형 필드는 순차적으로 실행됩니다

한 요청에 두 개의 Mutation을 보내면 두번째 Mutation이 시작되기 전에 첫 번째 Mutation이 완료되어 우리 자신과의 경쟁 조건이 발생하지 않도록 보장합니다

 

쿼리와 마찬가지로 변형 필드가 객체 유형을 반환하는 경우 중첩 필드를 요청할 수 있습니다

이는 업데이트 후 객체의 새 상태를 가져오는 데 유용합니다

 

📝Query

HTTP에서 Get 방식 통신에 해당하는 걸로 데이터를 조회할 때 사용한다

 

기본 예제 1

/** ─── 호출 ───**/
Query Hero {
  hero {
    name
  }
}

// 생략
{
  hero {
    name
  }
}


/** ─── 응답 ───**/
{
  "data": {
    "hero": {
      "name": "R2-D2"
    }
  }
}

단일 작업 및 복잡하지 않는 단일 요청일 때 query 키워드랑 쿼리 이름을 생략할 수 있지만 생략해서 혼돈만 초래할 뿐 그냥 적어주자

 

기본 예제 2

/** ─── 호출 ───**/
Query Hero {
  hero {
    name
    # Queries can have comments!
    friends {
      name
    }
  }
}


/** ─── 응답 ───**/
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

 

📝Query 파라미터

파라미터 사용 예제 1

# Human 타입 정의
type Human {
  id: ID!
  name: String!
  height: Float
}

# 쿼리 타입 정의
type Query {
  human(id: ID!): Human
}

/** ─── 호출 ───**/
{
  human(id: "1000") {
    name
    height
  }
}

/** ─── 응답 ───**/
{
  "data": {
    "human": {
      "name": "Luke Skywalker",
      "height": 1.72
    }
  }
}

 

 

정의한 쿼리 타입 토대로 파라미터를 넣어서 요청할 수 있다

 

파라미터 사용 예제 2

enum Unit {
  METER
  FOOT
}

# Human 타입 정의
type Human {
  id: ID!
  name: String!
  height(unit: Unit = METER): Float
}

/** ─── 호출 ───**/
{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}

/** ─── 응답 ───**/
{
  "data": {
    "human": {
      "name": "Luke Skywalker",
      "height": 5.6430448
    }
  }
}

 

📝Query 별칭

별칭 예제

/** ─── 호출 ───**/
{
  empireHero: hero(episode: EMPIRE) {
    name
  }
  jediHero: hero(episode: JEDI) {
    name
  }
}

/** ─── 응답 ───**/
{
  "data": {
    "empireHero": {
      "name": "Luke Skywalker"
    },
    "jediHero": {
      "name": "R2-D2"
    }
  }
}

두 필드는 hero로 충돌이 될 예정이였지만 alias로 인해 문제 없이 진행되게 했다

 

📝Query Fragment

fragment 예제

fragment comparisonFields on Character {
  name
  appearsIn
  friends {
    name
  }
}


/** ─── 호출 ───**/
{
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields
  }
}

/** ─── 응답 ───**/
{
  "data": {
    "leftComparison": {
      "name": "Luke Skywalker",
      "appearsIn": [
        "NEWHOPE",
        "EMPIRE",
        "JEDI"
      ],
      "friends": [
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        },
        {
          "name": "C-3PO"
        },
        {
          "name": "R2-D2"
        }
      ]
    },
    "rightComparison": {
      "name": "R2-D2",
      "appearsIn": [
        "NEWHOPE",
        "EMPIRE",
        "JEDI"
      ],
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

fragment를 이용해 재사용할 수 있게 하고 반복적인 코드를 줄일 수 있습니다
on Type명으로 꼭 타입을 지정해줘야합니다 여기에서는 Character라는 타입입니다

 

📝Query 동적 파라미터

동적 파라미터 예제 1

/** ─── 호출 ───**/
query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

/** ─── 호출 변수 ───**/
{
  "episode": "JEDI"
}

/** ─── 응답 ───**/
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

변수를 이용해 동적으로 데이터를 받을 수 있다

 

동적 파라미터 예제 2

query HeroNameAndFriends($episode: Episode = JEDI) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

기본값 설정도 가능함

 

📝지시문

/** ─── 호출 ───**/
query Hero($episode: Episode, $withFriends: Boolean!) {
  hero(episode: $episode) {
    name
    friends @include(if: $withFriends) {
      name
    }
  }
}

/** ─── 호출 변수 ───**/
{
  "episode": "JEDI",
  "withFriends": false
}

/** ─── 응답─**/
{
  "data": {
    "hero": {
      "name": "R2-D2"
    }
  }
}

지시문으로 필드를 동적으로 받을 수 있다

  • @include(if: Boolean)
    • 인수가 다음인 경우에만 결과에 이 필드를 포함합니다
  • @skip(if: Boolean)
    • 인수가 이면 이 필드를 건너뛰십시오

 

 

반응형