반응형
Scalars
GraphQL 에서 스칼라는 "leaf" 값이다. 몇 개의 내장 스칼라 타입들이 있는데 직접 커스텀 스칼라 타입을 정의하는 것도 가능하다. (Enums 도 leaf 값이다) 내장된 스칼라 값들은 다음과 같다.
String
, JSON 또는 Ruby 에서의 string 과 같다.Int
, JSON 또는 Ruby 에서의 integer 과 같다.Float
, JSON 또는 Ruby 에서의 float과 같다.Boolean
, JSON 또는 Ruby 에서의 boolean 과 같다 (true
또는false
).ID
, 객체의 id를 표현하는 고유한 String 값ISO8601DateTime
, ISO 8601-encoded datetime
필드들은 이름으로 각 내장 스칼라 값들을 반환할 수 있다.
# String field:
field :name, String,
# Integer field:
field :top_score, Int, null: false
# or:
field :top_score, Integer, null: false
# Float field
field :avg_points_per_game, Float, null: false
# Boolean field
field :is_top_ranked, Boolean, null: false
# ID field
field :id, ID, null: false
# ISO8601DateTime field
field :created_at, GraphQL::Types::ISO8601DateTime, null: false
커스텀 스칼라 필드 역시 다음과 같이사용 가능하다.
# `homepage: Url`
field :homepage, Types::Url, null: true
Schema Definition Language (SDL)에서 스칼라의 이름은 단순하다.
scalar DateTime
Custom Scalars
GraphQL::Schema::Scalar
를 extend 함으로써 자신만의 스칼라를 구현할 수 있다.# app/graphql/types/base_scalar.rb
# 베이스 클래스 선언
class Types::BaseScalar < GraphQL::Schema::Scalar
end
# app/graphql/types/url.rb
class Types::Url < Types::BaseScalar
description "A valid URL, transported as a string"
def self.coerce_input(input_value, context)
# 들어오는 객체를 `URI` 형태로 parse
url = URI.parse(input_value)
if url.is_a?(URI::HTTP) || url.is_a?(URI::HTTPS)
# 만약 유효하다면, URI 객체 리턴
url
else
raise GraphQL::CoercionError, "#{input_value.inspect} is not a valid URL"
end
end
def self.coerce_result(ruby_value, context)
# It's transported as a string, so stringify it
ruby_value.to_s
end
end
두 가지 클래스 메서드를 정의해야 한다.
self.coerce_input
는 GraphQL 인풋을 받아 이를 Ruby 값으로 변환self.coerce_result
는 필드의 리턴 값을 받아 GraphQL 이 JSON 으로 응답할 수 있도록 준비시킴
만약 들어오는 데이터가 부정확하다면 이 메서드는 GraphQL::CoercionError
를 일으키고 클라이언트에게 errors 를 키 값으로 한 데이터를 리턴할 것이다.
스칼라 클래스들은 초기화되지 않았다. 오직 .coerce_*
메서드 들만 실행하는 동안 호출되었다.
* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.
* 출처: http://graphql-ruby.org/type_definitions/scalars.html
반응형
'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글
(23) Graphql-ruby - input 객체 (0) | 2019.01.01 |
---|---|
(22) Graphql-ruby - enums (0) | 2019.01.01 |
(20) Graphql-ruby - 객체 (0) | 2019.01.01 |
(19) Graphql-ruby - 쿼리에 before/after hook 호출하기 (0) | 2019.01.01 |
(18) Graphql-ruby - tracing (0) | 2019.01.01 |