스키마의 대부분은 객체 타입이다!
서비스에서 가져올 수 있는 객체의 종류와 그 객체의 필드를 표현한다.
Character
: GraphQL 객체 타입 name
, apperasIn
: Character의 필드 String
: 내장 스칼라 타입 -> 스칼라 객체로 해석!
: 해당 필드가 non-null임을 표현[Episode]
: Episode 객체의 배열(array)임을 표현 length(unit: LengthUnit = METER)
: 인자 스키마에 대한
진입점 (Entry point)
정의
위 특이점 제외, 나머지는 객체 타입과 정확히 동일한 방식으로 작동!
// 쿼리
query {
hero {
name
}
droid(id: "2000") {
name
}
}
// GraphQL 서비스
type Query {
hero(episode: Episode): Character
droid(id: ID!): Droid
}
하위 필드가 없는 쿼리의 끝
name
, appearIn
은 스칼라 타입이다. Int
: 부호가 있는 32비트 정수Float
: 부호가 있는 부동소수점 값String
: UTF-8 문자열Boolean
: true 혹은 false ID
: 고유 식별자특정 값들로 제한되는 특별한 종류의 스칼라
허용된 값 중 하나
임을 검증항상 값의 열거형 집합 중 하나
가 될 것임을 타입 시스템을 이용해 소통스키마의 다른 타입, 또는 쿼리 변수 선언에서 타입을 활용하면 값의 유효성 검사를 할 수 있는 타입 수정자 (type modifiers)를 적용할 수 있다.
!
를 이용해 Non-Null로 표시 :: null값이 발생하면 GraphQL 실행 오류 발생 -> 유효성 검사 오류 반환[]
를 이용해 리스트로 표시 :: 해당 타입의 배열을 반환. 배열이 필요한 인자에 대해 유효성 검사 작동 👾 요따구로 섞어 쓸 수도 있답니다~~
myField: [String!]
- 리스트 자체는 null일 수 있지만, element는 null일 수 없다.
myField: null // valid
myField: [] // valid
myField: ['a', 'b'] // valid
myField: ['a', null, 'b'] // error
뭔가를 구현하기 위해 타입이 포함해야 하는 특정 필드들을 포함하는 추상 타입
// 인터페이스
interface Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
}
// 인터페이스를 구현한 타입
type Human implements Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
starships: [Starship]
totalCredits: Int
}
type Droid implements Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
primaryFunction: String
}
인터페이스와 유사하지만, 타입 간 공통 필드를 특정하지 않는다.
- 유니온 타입의 멤버는 구체적인 객체여야 한다.
- 인터페이스 혹은 유니온 타입에서 다른 유니온 타입을 사용할 수 없다.
SearchResult
를 반환할 때마다 Human
, Droid
, Startship
를 얻을 수 있다. SearchResult
를 반환하는 필드를 쿼리하려면, 어떤 필드라도 쿼리할 수 있도록 조건부 프래그먼트
를 활용해야 한다. {
search(text: "an") {
... on Human {
name
height
}
... on Droid {
name
primaryFunction
}
... on Starship {
name
length
}
}
}
뮤테이션에서 생성될 전체 객체를 전달할 때 사용!
일반 객체 타입과 동일하지만, type 대신 input을 사용한다.
/// input 객체
input ReviewInput {
stars: Int!
commentary: String
}
// 뮤테이션
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!"
}
}
}