본문 바로가기

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

(23) Graphql-ruby - input 객체

반응형





Input Objects


input 객체타입은 GraphQL 수행을 위한 복잡한 input들이다. 이 것은 mutation이나 search 필드와 같이 복잡한 구조의 인풋을 필요로 할 때 좋다. GraphQL 요청에서는 이렇게 사용할 수 있다.

mutation {               [ 여기서부터 input 객체 .............................]  
  createPost(attributes: { title: "Hello World", fullText: "This is my first post", categories: [GENERAL] }) {
  }
}


Ruby hash 처럼, input 객체는 키와 값으로 이루어져 있다. 그러나 hash와 달리, 이 키와 값 타입은 GraphQL 시스템의 일부분으로써 정의되어 있어야 한다. 예를 들어, 여기 input 객체가 있다고 보자.

input PostAttributes {
  title: String!
  fullText: String!
  categories: [PostCategory!]
}

input 객체는 3가지 가능한 키를 가지고 있다:

  • title 은 필수이다(!가 표시되어 있으므로), 그리고 반드시 String
  • fullText 또한 필수인 문자열
  • categories 은 선택적이다. 그리고 만약에 존재한다면 PostCategory 값의 리스트를 반드시 가지고 있어야 한다.

Defining Input Object Types


input 객체 타입은 GraphQL::Schema::InputObject 를 extend 하며, argument(...) 메서드로 정의할 수 있다.

# app/graphql/types/base_input_object.rb
# 베이스 클래스 추가
class Types::BaseInputObject < GraphQL::Schema::InputObject
end

class Types::PostAttributes < Types::BaseInputObject
  description "Attributes for creating or updating a blog post"
  argument :title, String, "Header for the post", required: true
  argument :full_text, String, "Full body of the post", required: true
  argument :categories, [Types::PostCategory], required: false
end

 argument(...) 메서드에 관한 더 자세한 설명은argument section of the Objects guide 에서 볼 수 있다.


Using Input Objects


input 객체는 정의 클래스의 인스턴스로서 필드 메서드에 전달 될 수 있다. 즉, 필드 메서드 안에서 다음과 같은 방법으로 해당 객체의 모든 키값에 접근 가능하다.
  • 이름에 해당하는 메서드 호출(언더스코어 형태로)
  • [] 를 이용하여 캐멀케이스 된 이름으로 argument 호출(이전 버전의 GraphQL-Ruby 와의 호환성을 위해서이다.)
mutation {
  createPost(attributes: { title: "Hello World", fullText: "This is my first post", categories: [GENERAL] }) {
  }
}
# 이 필드는 `attributes` 라고 불리는 argument를 받는다
# 해당 argument는`PostAttributes`의 인스턴스이다
field :create_post, Types::Post, null: false do
  argument :attributes, Types::PostAttributes, required: true
end

def create_post(attributes:)
  puts attributes.class.name
  # => "Types::PostAttributes"
  # 언더스코어를 사용하여 메서드의 값에 접근할 수 있다.
  puts attributes.full_text
  # => "This is my first post"
  # 또는 hash 스타일을 사용할 수 있다. 이 경우는 camelCase로(이전 버전과의 호환성때문에):
  puts attributes[:fullText] 
  # => "This is my first post"
end


Customizing Input Objects


커스터마이징을 위해 input 객체 클래스에 메서드를 추가하거나 오버라이드 할 수 있다. 다음과 같이 두 가지 인스턴스 변수가 기본적으로 있다.


너가 클래스에 정의한 추가적인 메서드들은 위와 같이 필드를 resolve 하는데 사용할 수 있다.

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

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


반응형

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

(25) Graphql-ruby - 유니언  (0) 2019.01.01
(24) Graphql-ruby - 인터페이스  (0) 2019.01.01
(22) Graphql-ruby - enums  (0) 2019.01.01
(21) Graphql-ruby - 스칼라  (0) 2019.01.01
(20) Graphql-ruby - 객체  (0) 2019.01.01