본문 바로가기

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

(21) Graphql-ruby - 스칼라

반응형



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



반응형