본문 바로가기

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

(22) Graphql-ruby - enums

반응형





Enums


Enum 타입은 분리된 값들의 집합이다. enum 필드는 반드시 enum 값들 중 하나의 가능한 값을 리턴해야 한다. GraphQL Schema Definition Language(SDL) 에서는 enum은 다음과 같이 표현된다.

enum MediaCategory {
  AUDIO
  IMAGE
  TEXT
  VIDEO
}

즉, MediaCategory값은 AUDIOIMAGETEXT, VIDEO 중에 하나이다. 이것은 ActiveRecord enums 과 비슷하다.

GraphQL 쿼리에서, enum은 문자열이 아니라 identifier로 씌여진다. 예를 들어

search(term: "puppies", mediaType: IMAGE) { ... }

(IMAGE 가 따옴표가 없는 것을 보아라.)


 그러나 GraphQL 응답 또는 변수들은 JSON을 사용하여 전해지기 때문에 Enum 값들은 문자열로 보여진다. 예를 들어:

# graphql 컨트롤러에서는:
params["variables"]
# { "mediaType" => "IMAGE" }


Defining Enum Types


너의 어플리케이션에서 enum은 GraphQL::Schema::Enum 를 extend 하고  value(...) 메서드를 이용해서 정의된다.


# 베이스 클래스 정의
# app/graphql/types/base_enum
class Types::BaseEnum < GraphQL::Schema::Enum
end

# app/graphql/types/media_category.rb
class Types::MediaCategory < Types::BaseEnum
  value "AUDIO", "An audio file, such as music or spoken word"
  value "IMAGE", "A still image, such as a photo or graphic"
  value "TEXT", "Written words"
  value "VIDEO", "Motion picture, may have audio"
end

각 값들은 다음과 같은 것들을 가질 수 있다:

  • description (두번째 argument로, 또는 description: 키워드를 사용할 수 있다.)
  • deprecation reason (deprecation_reason: 키워드 사용), 이 값이 사라졌다는 것을 표시
  • 상응하는 Ruby 값 (as value:), 아래에 더 자세히 나와있다.


디폴트로, Ruby 문자열은 GraphQL enum 값들에 상응한다. 그러나 value: 옵션을 제공할 수 있다. 예를 들어, 문자열 대신 심벌을 사용하고자 한다면 다음과 같이 표현할 수 있다.

value "AUDIO", value: :audio

그러면 GraphQL에 AUDIO:audio로 변환될 것이고, 루비 값인 :audio는 "AUDIO"로 GrapQL 응답에서 변환될 것이다. 

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

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



반응형