본문 바로가기

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

(7) Graphql-ruby - 스키마 정의

반응형



    스키마 - 정의

    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

    Root Objects, Introspection and Orphan Types

    GraphQL 스키마는 상호 연결된 타입의 망이며, 이를 찾기 위한 몇 가지 시작점이 있다.

    Root types (querymutation, 그리고 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
    


    Execution Configuration

    Instrumentation 더보기

    class MySchema < GraphQL::Schema
      instrument :field, ResolveTimerInstrumentation
    end
    


    Tracing 더보기

    class MySchema < GraphQL::Schema
      tracer MetricTracer
    end
    


    query_analyzermultiplex_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
    


    Default Limits

    max_depth 와  max_complexity 는 들어오는 쿼리에 제한을 하도록 한다. 

    Complexity and Depth 더보기

    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


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

    * 출처: 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