GraphQL - Docs를 통한 정리(뮤테이션)

Jihun Kim·2022년 4월 20일
0

GraphQL

목록 보기
3/16
post-thumbnail

이 글은 GraphQL Docs를 읽고 정리한 것입니다.

뮤테이션

뮤테이션

변경을 발생시키는 작업은 명시적으로 mutation을 통해 전송되는 것이 좋다
(앞서 정리한 query 타입의 경우 조회를 위한 것이다).

아래 예시의 경우 createReview 필드가 새로 생성된 리뷰의 starscommentary 필드를 반환한다. 이 때, 전달되는 review 변수는 input object type이다.

쿼리

mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}

// variables
{
  "ep": "JEDI",
  "review": {
    "stars": 5,
    "commentary": "This is a great movie!"
  }
}

실행 결과

{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}

뮤테이션의 다중 필드

  • 쿼리 필드는 병렬로 실행 되지만 뮤테이션 필드는 차례대로 실행 된다.
    - 만약 하나의 요청에서 두 개의 incrementCredits 뮤테이션을 보내면 첫 번째 요청이 완료된 다음 두 번째 요청이 완료 된다.

인라인 프래그먼트

  • 인터페이스나 유니언 타입을 반환하는 필드를 쿼리하는 경우, 인라인 프래그먼트를 사용 한다.
  • 특정 타입의 필드를 요청하기 위해서는 타입 조건과 함께 인라인 프래그먼트를 사용한다.
    - 아래 쿼리에서 hero 필드는 Character 타입을 반환하는데, 이 때 episode 인자에 따라 Droid 혹은 Human 타입을 반환하게 된다(유니언).
    - 즉, hero의 타입이 Droid이면 primaryFunction 필드를 반환하고 타입이 Human이면 height 필드를 반환한다.

쿼리

query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    ... on Droid {
      primaryFunction
    }
    ... on Human {
      height
    }
  }
}

// variables
{
  "ep": "JEDI",
}

실행 결과

{
  "data": {
    "hero": {
      "name": "R2-D2",
      "primaryFunction": "Astromech"
    }
  }
}

메타 필드

  • 만약 GraphQL 이용시 리턴 타입을 모른다면 메타 필드인 __typename을 요청해 객체 타입의 이름을 얻을 수 있다.

search는 Human, Droid, Starship 중 하나인 유니언 타입을 반환한다. 이 때 __typename 필드가 없다면 클라이언트는 다른 타입을 구별하지 못한다.
쿼리

{
  search(text: "an") {
    __typename
    ... on Human {
      name
    }
    ... on Droid {
      name
    }
    ... on Starship {
      name
    }
  }
}

실행 결과

{
  "data": {
    "search": [
      {
        "__typename": "Human",
        "name": "Han Solo"
      },
      {
        "__typename": "Human",
        "name": "Leia Organa"
      },
      {
        "__typename": "Starship",
        "name": "TIE Advanced x1"
      }
    ]
  }
}
profile
쿄쿄

0개의 댓글