본문 바로가기

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

(25) Graphql-ruby - 유니언

반응형





  • interfaces 객체가 구현할 수 있는 필드들의 목록

  • unions 동일한 위치에 나타날 수 있는 타입들의 집합(필드는 공유하지 않음)


Unions


union 타입은 동일한 위치에 나타날 수 있는 타입들의 집합이다.

union MediaItem = AudioClip | VideoClip | Image | TextSnippet


이것은 검색 필드에서 사용될 수 있다. 예를 들어

searchMedia(term: "puppies") {
  ... on AudioClip {
    duration
  }
  ... on VideoClip {
    previewURL
    resolution
  }
  ... on Image {
    thumbnailURL
  }
  ... on TextSnippet {
    teaserText
  }
}

여기서 searchMedia 필드는 [MediaItem!] 을 리턴하는데, 각 멤버는 MediaItem union의 일부분이다. 그러므로 각 멤버에서 객체의 종류에 따라 다른 필드들을 선택하고 싶다. (예를 들어 VideoClip이면 previewURL 과 resolution 를 선택)


인터페이스는 비슷한 개념이긴 하기만 인터페이스에서는 모든 타입은 반드시 일부 필드를 공유해야 한다. 유니언은 객체 타입이 크게 공통되는 필드가 없을 때 유용하다.


같은 유니언 멤버들은 필드를 공유하지 않으며 선택은 항상 typed fragments(... on SomeType)를 통해 이루어진다.


Defining Union Types


유니언은 GraphQL::Schema::Union를 extend 한다. 먼저 베이서 클래스를 만들자.

class Types::BaseUnion < GraphQL::Schema::Union
end


그리고 해당 유니언을 너의 스키마에 extend 한다.

class Types::CommentSubject < Types::BaseUnion
  description "Objects which may be commented on"
  possible_types Types::Post, Types::Image

  # 옵션: 이 메서드가 정의되어 있다면 이는`Schema.resolve_type`를 오버라이드 할 것이다
  def self.resolve_type(object, context)
    if object.is_a?(BlogPost)
      Types::Post
    else
      Types::Image
    end
  end
end

possible_types(*types) 메서드는 하나 이상의 타입을 받는다. 이 타입들은 이 유니언에 속해있다.

유니언 클래스들은 인스턴스화 되지 않는다. 런타임에서 .resolve_type 메서드가 호출될 수 있다.(만약 정의되어 있다면) 

.resolve_type 에대한 더 많은 것은 Interfaces에서 알아보자.

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

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



반응형

'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글

(27) Graphql-ruby - Non-Null 타입  (0) 2019.01.01
(26) Graphql-ruby - 리스트  (0) 2019.01.01
(24) Graphql-ruby - 인터페이스  (0) 2019.01.01
(23) Graphql-ruby - input 객체  (0) 2019.01.01
(22) Graphql-ruby - enums  (0) 2019.01.01