본문 바로가기

배움의 즐거움/프로그래밍

(26) Graphql-ruby - 리스트

반응형





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]은 불가)


ValidInvalid
[]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를 포함할 수 있다.


ValidInvalid
[]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를 포함할 수 있다.


ValidInvalid
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은 포함할 수 없다.

ValidInvalid
null[null]
[][1, null, 2, ...]
[1, 2, ...] 


* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.

* 출처: http://graphql-ruby.org/type_definitions/lists.html


반응형