스키마 설정
스키마 설정중첩 뮤테이션 사용하기

중첩 뮤테이션 사용하기

중첩 뮤테이션을 사용하면 GraphQL의 루트 타입 이외의 타입에 대해 뮤테이션을 실행할 수 있습니다.

아래 쿼리는 루트 타입의 뮤테이션 필드 updatePost를 사용하는 표준 뮤테이션을 실행합니다:

mutation {
  updatePost(input: {
    id: 5,
    title: "New title"
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      title
    }
  }
}

위의 쿼리는 중첩 뮤테이션으로도 실행할 수 있습니다. 먼저 필드 post로 포스트 객체를 조회한 후, Post 타입에 속하는 뮤테이션 필드 update를 해당 포스트 객체에 적용합니다:

mutation {
  post(by: {id: 5}) {
    update(input: {
      title: "New title"
    }) {
      status
      post {
        title
      }
    }
  }
}

뮤테이션을 중첩하여 다른 뮤테이션의 결과에 대해 데이터를 수정할 수도 있습니다:

mutation {
  createPost(input: {
    title: "First title"
  }) {
    status
    postID
    post {
      update(input: {
        title: "Second title",
        contentAs: { html: "Some content" }
      }) {
        status
        post {
          title
          content
          addComment(input: {
            commentAs: { html: "My first comment" }
          }) {
            status
            commentID
            comment {
              content
              date
            }
          }
        }
      }
    }
  }
}

단순화된 루트 타입

중첩 뮤테이션을 사용하면 루트 타입이 QueryRootMutationRoot에서 쿼리와 뮤테이션을 모두 처리하는 단일 Root 타입으로 변경됩니다:

스키마 문서의 중첩 뮤테이션

뮤테이션 필드 시각화

Voyager 클라이언트를 사용하여 어떤 필드가 뮤테이션 필드인지 시각화할 수 있습니다.

중첩 뮤테이션에서는 스키마의 모든 타입에 쿼리 필드와 뮤테이션 필드가 모두 포함될 수 있습니다. 이를 구분하기 위해 뮤테이션 필드의 설명 앞에 "[Mutation] " 레이블이 추가됩니다.

예를 들어, Root 타입의 필드는 다음과 같습니다:

GraphiQL 문서의 Root 타입 설명

엔드포인트에서 중첩 뮤테이션 사용하기

스키마가 중첩 뮤테이션을 사용할지 여부는 2가지 레벨에서 정의할 수 있습니다. 우선순위 순서로:

1. 스키마 설정에서 정의

커스텀 엔드포인트 또는 persisted query가 중첩 뮤테이션을 사용하도록 하려면 해당 스키마 설정에서 정의할 수 있습니다:

스키마 설정의 뮤테이션 스킴

2. 설정에서 정의된 기본 모드

스키마 설정의 값이 "Default"인 경우, 설정에서 정의된 모드가 사용됩니다:

중첩 뮤테이션 설정
중첩 뮤테이션 설정

중첩 뮤테이션 구성하기

스키마에 대해 선택할 수 있는 동작은 세 가지입니다:

1. 중첩 뮤테이션을 활성화하지 않음

이 옵션은 스키마의 중첩 뮤테이션을 비활성화합니다(대신 표준 동작을 사용합니다).

2. 중첩 뮤테이션을 활성화하고 모든 뮤테이션 필드를 루트에 유지

중첩 뮤테이션이 활성화되면 뮤테이션 필드가 스키마에 두 번 추가될 수 있습니다:

  • Root 타입 아래에 한 번
  • 특정 타입 아래에 한 번

예를 들어:

  • Root.updatePost
  • Post.update

이 옵션에서는 루트 타입의 "중복된" 뮤테이션 필드가 유지됩니다.

3. 중첩 뮤테이션을 활성화하고 루트에서 중복 뮤테이션 필드를 제거

위와 동일한 옵션이지만, 루트 타입에서 "중복된" 뮤테이션 필드를 제거합니다.

예를 들어:

  • Root.updatePost는 제거됩니다
  • Post.update를 사용할 수 있습니다

GraphQL 사양

이 기능은 현재 GraphQL 사양에 포함되어 있지 않지만, 요청이 제기된 바 있습니다: