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 |