https://velog.io/@cadenzah/graphql-input-type

사실 좀 궁금했던 문제이다. ObjectType 과 같은데 왜 굳이 input 타입으로 따로 명시할까?

뮤테이션의 입력 인자가 객체라면, input 타입 이어야 하는 이유가 무엇인가요?

type Sample {
  id: String
  name: String
}

input SampleInput {
  name: String
}

type RootMutation {
  addSample(sample: Sample): Sample # <-- 이것 대신 아래를 사용
  addSample(sample: SampleInput): Sample
}

답변

위가 "공식적인 이유" 입니다. 하지만 둘을 구분하는 실무적인 이유가 몇 가지 더 존재합니다.

기능

Object 타입과 input 타입은 둘다 필드를 가지지만, 이 필드들은 각 타입이 스키마 내에서 사용되는 방식에 따라 서로 다른 특성을 가집니다.

Object 타입이 가지는 필드에 대한 리졸버 함수를 정의합니다. 그런데 input 타입의 맥락에서는 통하지 않죠. input 타입의 필드는 리졸브 할 수 없습니다. 이미 명시적인 값을 가지기 때문입니다. 또한 기본값이라는 개념 또한 input 에서 만 제공되는 개념입니다.

타입 시스템의 제한

유니온과 인터페이스 같은 추상 타입은 입력 상황에서는 성립할 수 없으므로 입력으로 사용될 수 없습니다. Object 타입과 input 타입을 분리하면, input 에 추상 타입이 사용 되는 일이 없도록 보장할 수 있습니다.