스키마 - 정의
GraphQL 시스템은 스키마라고 불린다. 스키마는 해당 시스템의 모든 타입과 필드를 포함하며, 스키마는 쿼리를 실행하고 introspection system 이라는 것을 생성한다.
GraphQL 스키마는 GraphQL::Schema
를 확장한 클래스이다.
class MyAppSchema < GraphQL::Schema
max_complexity 400
query Types::Query
use GraphQL::Batch
# Define hooks as class methods:
def self.resolve_type(type, obj, ctx)
# ...
end
def self.object_from_id(node_id, ctx)
# ...
end
def self.id_from_object(object, type, ctx)
# ...
end
end
다음과 같은 스키마 설정 옵션들이 있다
-
- root objects, introspection and orphan types
- - object identification hooks
- - execution configuration
- - context class
- - default limits
- - plugins
GraphQL 시스템은 스키마라고 불린다. 스키마는 해당 시스템의 모든 타입과 필드를 포함하며, 스키마는 쿼리를 실행하고 introspection system 이라는 것을 생성한다.
GraphQL 스키마는 GraphQL::Schema
를 확장한 클래스이다.
class MyAppSchema < GraphQL::Schema
max_complexity 400
query Types::Query
use GraphQL::Batch
# Define hooks as class methods:
def self.resolve_type(type, obj, ctx)
# ...
end
def self.object_from_id(node_id, ctx)
# ...
end
def self.id_from_object(object, type, ctx)
# ...
end
end
다음과 같은 스키마 설정 옵션들이 있다
- - root objects, introspection and orphan types
- - object identification hooks
- - execution configuration
- - context class
- - default limits
- - plugins
Root Objects, Introspection and Orphan Types
GraphQL 스키마는 상호 연결된 타입의 망이며, 이를 찾기 위한 몇 가지 시작점이 있다.
Root types (query
, mutation
, 그리고 subscription
) 은 쿼리의 엔트리 포인트로, 객체 타입이다.
class MySchema < GraphQL::Schema
# Required:
query Types::Query
# Optional:
mutation Types::Mutation
subscription Types::Subscription
end
Introspection 은 스키마의 내장된 부분이다. 각각의 스키마는 기본적인 인트로스펙션 시스템이 있지만 커스터마이징도 가능하다.
class MySchema < GraphQL::Schema
introspection CustomIntrospection
end
Orphan Types 은 스키마 내에 있어야 하는 타입이다. 그러나 query
, mutation
or subscription
의 타입과 필드를 통해서는 발견될 수 없다. Orphan Types 에서 이 것의 특별한 사용 케이스를 보자.
class MySchema < GraphQL::Schema
orphan_types [Types::Comment, ...]
end
GraphQL 스키마는 상호 연결된 타입의 망이며, 이를 찾기 위한 몇 가지 시작점이 있다.
Root types (query
, mutation
, 그리고 subscription
) 은 쿼리의 엔트리 포인트로, 객체 타입이다.
class MySchema < GraphQL::Schema
# Required:
query Types::Query
# Optional:
mutation Types::Mutation
subscription Types::Subscription
end
Introspection 은 스키마의 내장된 부분이다. 각각의 스키마는 기본적인 인트로스펙션 시스템이 있지만 커스터마이징도 가능하다.
class MySchema < GraphQL::Schema
introspection CustomIntrospection
end
Orphan Types 은 스키마 내에 있어야 하는 타입이다. 그러나 query
, mutation
or subscription
의 타입과 필드를 통해서는 발견될 수 없다. Orphan Types 에서 이 것의 특별한 사용 케이스를 보자.
class MySchema < GraphQL::Schema
orphan_types [Types::Comment, ...]
end
Object Identification Hooks
GraphQL 스키마는 쿼리가 실행될 때, 객체를 찾거나 명확히 하기 위한 방법이 필요하다.
resolve_type
은 특정 객체에 해당하는 GraphQL 타입을 결정해야 할 때 사용된다. 이것은 인터페이스와 유니언 타입을 반환하는 필드를 위해 이뤄지는데, def self.resolve_type 이 사용된다.
class MySchema < GraphQL::Schema
def self.resolve_type(abstract_type, object, context)
# Disambiguate `object`, from among `abstract_type`'s members
# (`abstract_type` is an interface or union type.)
end
end
object_from_id
은 Relay’s node(id: ID!): Node
필드에 사용된다. 이것은 유니크한 ID 를 받고 해당 객체의 ID, 또는 해당 객체가 없거나 현재 사용자에게 숨김되어 있다면 nil 을 리턴한다.
class MySchema < GraphQL::Schema
def self.object_from_id(unique_id, context)
# Find and return the object for `unique_id`
# or `nil`
end
end
id_from_object
는 Relay’s Node.id
필드를 구현하는데 사용된다. 이것은 주어진 객체의 ID 를 리턴해야 한다. 이 ID 는 이후 해당 객체를 가져오기 위해 object_from_id
에 보내진다.
class MySchema < GraphQL::Schema
def self.id_from_object(object, type, context)
# Return a unique ID for `object`, whose GraphQL type is `type`
end
end
GraphQL 스키마는 쿼리가 실행될 때, 객체를 찾거나 명확히 하기 위한 방법이 필요하다.
resolve_type
은 특정 객체에 해당하는 GraphQL 타입을 결정해야 할 때 사용된다. 이것은 인터페이스와 유니언 타입을 반환하는 필드를 위해 이뤄지는데, def self.resolve_type 이 사용된다.
class MySchema < GraphQL::Schema
def self.resolve_type(abstract_type, object, context)
# Disambiguate `object`, from among `abstract_type`'s members
# (`abstract_type` is an interface or union type.)
end
end
object_from_id
은 Relay’s node(id: ID!): Node
필드에 사용된다. 이것은 유니크한 ID 를 받고 해당 객체의 ID, 또는 해당 객체가 없거나 현재 사용자에게 숨김되어 있다면 nil 을 리턴한다.
class MySchema < GraphQL::Schema
def self.object_from_id(unique_id, context)
# Find and return the object for `unique_id`
# or `nil`
end
end
id_from_object
는 Relay’s Node.id
필드를 구현하는데 사용된다. 이것은 주어진 객체의 ID 를 리턴해야 한다. 이 ID 는 이후 해당 객체를 가져오기 위해 object_from_id
에 보내진다.
class MySchema < GraphQL::Schema
def self.id_from_object(object, type, context)
# Return a unique ID for `object`, whose GraphQL type is `type`
end
end
Execution Configuration
Instrumentation 더보기
class MySchema < GraphQL::Schema
instrument :field, ResolveTimerInstrumentation
end
Tracing 더보기
class MySchema < GraphQL::Schema
tracer MetricTracer
end
query_analyzer
,
multiplex_analyzer
는 선행형 쿼리를 받는다.
Analysis 더보기
class MySchema < GraphQL::Schema
query_analyzer MyQueryAnalyzer.new
end
lazy execution 더보기
class MySchema < GraphQL::Schema
lazy_resolve Promise, :sync
end
type_error
는 런타임 도중 발생한 타입에러를 핸들링한다.
Invariants guide 더보기
class MySchema < GraphQL::Schema
def self.type_error(type_err, context)
# Handle `type_err` in some way
end
end
rescue_from
는 어플리케이션 에러 핸들러를 받는다. 예를 들면:
class MySchema < GraphQL::Schema
rescue_from(ActiveRecord::RecordNotFound) { "Not found" }
end
Instrumentation 더보기
class MySchema < GraphQL::Schema
instrument :field, ResolveTimerInstrumentation
end
Tracing 더보기
class MySchema < GraphQL::Schema
tracer MetricTracer
end
query_analyzer
,
multiplex_analyzer
는 선행형 쿼리를 받는다.
Analysis 더보기
class MySchema < GraphQL::Schema
query_analyzer MyQueryAnalyzer.new
end
lazy execution 더보기
class MySchema < GraphQL::Schema
lazy_resolve Promise, :sync
end
type_error
는 런타임 도중 발생한 타입에러를 핸들링한다.
Invariants guide 더보기
class MySchema < GraphQL::Schema
def self.type_error(type_err, context)
# Handle `type_err` in some way
end
end
rescue_from
는 어플리케이션 에러 핸들러를 받는다. 예를 들면:
class MySchema < GraphQL::Schema
rescue_from(ActiveRecord::RecordNotFound) { "Not found" }
end
Context Class
주로 context 는 GraphQL::Query::Context
의 인스턴스이지만 커스텀 서브클래스를 직접 만들어 연결할 수 있다.
class CustomContext < GraphQL::Query::Context
# 현재 사용자를 받기 위한 간단한 방법
def viewer
self[:viewer]
end
end
class MySchema < GraphQL::Schema
context_class CustomContext
end
주로 context 는 GraphQL::Query::Context
의 인스턴스이지만 커스텀 서브클래스를 직접 만들어 연결할 수 있다.
class CustomContext < GraphQL::Query::Context
# 현재 사용자를 받기 위한 간단한 방법
def viewer
self[:viewer]
end
end
class MySchema < GraphQL::Schema
context_class CustomContext
end
Default Limits
max_depth
와 max_complexity
는 들어오는 쿼리에 제한을 하도록 한다.
default_max_page_size
은 Connection
필드에 제한을 적용한다.
class MySchema < GraphQL::Schema
max_depth 10
max_complexity 300
default_max_page_size 20
end
max_depth
와 max_complexity
는 들어오는 쿼리에 제한을 하도록 한다.
default_max_page_size
은 Connection
필드에 제한을 적용한다.
class MySchema < GraphQL::Schema
max_depth 10
max_complexity 300
default_max_page_size 20
end
Plugins
플러그인은 #use 에 응답하는 객체로, API 오버헤드 없이 새로운 기능을 추가할 수 있다. 예를 들어 monitoring tools 같은 플러그 인이 있다.
class MySchema < GraphQL::Schema
use(GraphQL::Tracing::NewRelicTracing)
end
플러그인은 #use 에 응답하는 객체로, API 오버헤드 없이 새로운 기능을 추가할 수 있다. 예를 들어 monitoring tools 같은 플러그 인이 있다.
class MySchema < GraphQL::Schema
use(GraphQL::Tracing::NewRelicTracing)
end
* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.
* 출처: http://graphql-ruby.org/schema/definition.html
'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글
(9) Graphql-ruby - Generators (0) | 2018.12.31 |
---|---|
(8) Graphql-ruby - Introspection (0) | 2018.12.31 |
(6) GraphQL - 인트로스펙션 (0) | 2018.12.31 |
(5) GraphQL - 실행 (0) | 2018.12.31 |
(4) GraphQL - 유효성 검사 (0) | 2018.12.31 |