Lists
GraphQL 은 다른 타입들을 아이템으로 포함하는 순서있는 리스트 타입이라는 것을 가지고 있다.
필드는 스칼라 값(예를 들면 String
)을 리턴하거나 스칼라 값의 리스트(예를 들면 [String]
, 스트링의 리스트)를 리턴한다.
type Spy {
# 스파이의 진짜 이름
realName: String!
# 스파이의 별칭들
aliases: [String!]
}
필드는 다른 타입의 리스트를 리턴할 수 있다.
enum PostCategory {
SOFTWARE
UPHOLSTERY
MAGIC_THE_GATHERING
}
type BlogPost {
# 이 포스트가 가지고 있는 0개 이상의 카테고리
categories: [PostCategory!]
# 해당 포스트와 연관된 다른 포스트
relatedPosts: [BlogPost!]
}
인풋 또한 리스트가 될 수 있다. 다음과 같이 argument 는 리스트 타입을 받을 수 있다.
type Query {
# `categories` 에 의해 필터된 최근의 포스트 리턴
posts(categories: [PostCategory!]): [BlogPost!]
}
GraphQL이 JSON 형태로 받거나 보낼 때, 리스트들은 JSON 배열의 형태로 표현된다.
List Types in Ruby
Ruby 에서 리스트 타입을 정의하기 위해서 [...]
를 사용한다.
# 리스트 타입을 리턴하는 필드
# 위의 `aliases: [String!]` 와 동일하다
field :aliases, [String], null: true
# 리스트 타입을 받는 argument
argument :categories, [Types::PostCategory], required: false
input 에서는 GraphQL 리스트들은 Ruby 배열로 변환된다. 리스트 타입을 리턴하는 필드에서는 #each에 응답하는 모든 객체가 리턴될 수 있다. 그리고 이 것들은 GraphQL 리스트로 enumerate 될 수 있다.
멤버 중 nil이 존재할 수 있는 리스트를 정의하기 위해서는 null: true를 사용하면 된다.(디폴트는 null: false)
# `previousEmployers: [Employer]!` 와 동일
field :previous_employers, [Types::Employer, null: true], "Previous employers; `null` represents a period of self-employment or unemployment" null: false
Lists, Nullable Lists, and Lists of Nulls
리스트 타입과 non-null 타입을 섞어쓰는 것은 조금 복잡하다. 네 가지 가능한 케이스가 있다.
- 필드의 Null 가능성: 해당 필드가 null을 리턴할 수 있는가 아니면 항상 리스트를 리턴해야 되는가?
- 리스트 아이템의 null 가능성: 리스트가 존재한다면, 이 리스트는
null
을 포함할 수 있는가?
여기 네가지 경우가 있다.
필드가 nullable | 필드가 non-null | |
아이템 nullable | [Integer, null: true], null: true # => [Int] | [Integer, null: true], null: false # => [Int]! |
아이템 non-null | [Integer], null: true # => [Int!] | [Integer], null: false # => [Int!]! |
(첫번째 줄이 GraphQL-Ruby 표현식이고 두번째 줄 # =>
로 시작하는 부분이 GraphQL SDL 표현식이다.)
Non-null lists with non-null items
여기 예시 필드가 있다.
field :scores, [Integer], null: false
# In GraphQL,
# scores: [Int!]!
위의 예시에서 scores
는 null
을 리턴하지 않을 것이다. 이것은 반드시 리스트를 리턴해야 한다. 추가적으로, 리스트는 null을 포함할 수 없다. 이것은 오직 Int만 포함할 수 있다. 이 리스트는 비어있을 수는 있지만 null을 포함할 수는 없다([] 이런식으로는 가능하나 [null]은 불가)
Valid | Invalid |
---|---|
[] | null |
[1, 2, ...] | [null] |
| [1, null, 2, ...] |
Non-null lists with nullable items
field :scores, [Integer, null: true], null: false
# In GraphQL,
# scores: [Int]!
scores
는 null
을 리턴할 수는 없다. 이 것은 항상 리스트를 리턴해야 한다. 그러나 이 리스트는 null
또는/그리고 Int를 포함할 수 있다.
Valid | Invalid |
---|---|
[] | null |
[1, 2, ...] | |
[null] | |
[1, null, 2, ...] |
Nullable lists with nullable items
field :scores, [Integer, null: true], null: true
# In GraphQL,
# scores: [Int]
scores
은 null
또는 리스트를 반환할 수 있다. 추가적으로 이 리스트는 null 또는/그리고
Int
를 포함할 수 있다.
Valid | Invalid |
---|---|
null | |
[] | |
[1, 2, ...] | |
[null] | |
[1, null, 2, ...] |
Nullable lists with non-null items
field :scores, [Integer], null: true
# In GraphQL,
# scores: [Int!]
scores
은 null
또는 리스트를 반환할 수 있다. 그러나 리스트가 존재한다면 이 리스트 Int
만 포함할 수고 null은 포함할 수 없다.
Valid | Invalid |
---|---|
null | [null] |
[] | [1, null, 2, ...] |
[1, 2, ...] |
* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.
* 출처: http://graphql-ruby.org/type_definitions/lists.html
'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글
(28) Graphql-ruby - Authorization 의 모든 것 (0) | 2019.01.01 |
---|---|
(27) Graphql-ruby - Non-Null 타입 (0) | 2019.01.01 |
(25) Graphql-ruby - 유니언 (0) | 2019.01.01 |
(24) Graphql-ruby - 인터페이스 (0) | 2019.01.01 |
(23) Graphql-ruby - input 객체 (0) | 2019.01.01 |