본문 바로가기

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

(20) Graphql-ruby - 객체

반응형





Objects


GraphQL 객체타입은 GraphQL API 에서 빵과 버터와 같은 존재이다. 각 객체는 데이터를 보여주는 필드가 있고 이름으로 쿼리할 수 있다. 예를 들어 우리는 User를 다음과 같이 쿼리할 수 있다.

user {
  handle
  email
}

그리고 다음과 같이 값을 돌려받을 수 있다.

{
  "user" => {
    "handle" => "rmosolgo",
    "email" => nil,
  }
}


일반적으로 GraphQL 객체 타입은 UserProductComment 과 같이 어플리케이션의 모델에 응답한다. 때때로 객체타입은 GraphQL Schema Definition Language (SDL)를 사용하여 설명된다.

type User {
  email: String
  handle: String!
  friends: [User!]!
}


이 뜻은 User 객체가 세가지 필드를 가지고 있다는 것을 뜻한다.

  • email 은 String 또는 nil 을 리턴한다
  • handle String 을 리턴하지만 절대로 nil 을 리턴하지는 않는다(! 는 해당 필드가 절대로 nil을 리턴하지 않음을 뜻함)
  • friends, 는 Users로 구성된 리스트를 리턴한다 ([...] 뜻은 해당 필드가 리스트를 리턴함을 뜻함, User! 은 해당 리스트가 User 객체를 포함하는데 해당 객체는  nil 이 될 수 없음을 뜻함) 그리고 해당 필드는 nil 이 될 수 없음


Ruby를 이용하면 다음과 같이 정의가 가능하다.

class User < GraphQL::Schema::Object
  field :email, String, null: true
  field :handle, String, null: false
  field :friends, [User], null: false
end

*참고: 만약 [User] 안에 있는 User 객체에 null 을 허용하고 싶다면 [User, null: true] 과 같이 표현 하면 된다. Default로 리스트 안에 있는 값은 non-null 즉 [User, null: false] 이다.


앞으로의 가이드에서는 GraphQL 객체 타입을 Ruby에서 정의하는 방법을 설명할 것이다. GraphQL 객체 타입에 대한 전반적인 설명은 GraphQL docs 에서 볼 수 있다. 


Object classes


GraphQL::Schema::Object 를 연장한 클래스는 Object types 을 설명하고 그들의 행동을 커스터마이징 할 수 있다.

객체필트는 field(...) 클래스 메서트로 생성할 수 있으며, 아래 자세히 설명되어 있다.

필드와 argument 이름은 언더스코어(_) 로 지정되어야 한다. 이들은 기본 GraphQL 타입에서는 camelCase로 변환될 것이고 스키마 자체에서는 camelCase가 될 것이다. 

# 어딘가에 베이스 클래스 정의
class Types::BaseObject < GraphQL::Schema::Object
end

# 그리고...
class Types::TodoList < Types::BaseObject
  description "A list of items which may be completed"

  field :name, String, "The unique name of this list", null: false
  field :is_completed, String, "Completed status depending on all tasks being done.", null: false
  # 관련된 객체:
  field :owner, Types::User, "The creator of this list", null: false
  # 리스트:
  field :viewers, [Types::User], "Users who can see this list", null: false
  # 커넥션:
  field :items, Types::TodoItem.connection_type, "Tasks on this list", null: false do
    argument :status, TodoStatus, "Restrict items to this status", required: false
  end
end


Fields


객체 필드는 해당 객체의 데이터를 보여주거나 해당 객체를 다른 객체에 연결한다. 객체 타입에 field(...) 클래스 메서드를 사용하여 필드를 추가할 수 있다.

객체 필드에 대해서 더 알아보기 위해서는 Fields guide 를 보자.


Implementing interfaces


만약 객체가 인터페이스를 구현한다면, implements를 사용해서 추가할 수 있다.

# 이 객체는 인터페이스를 구현함
implements GraphQL::Relay::Node.interface
implements Types::UserAssignableType

객체가 인터페이스를  implements 할 때:

  • 이 객체는 해당 객체에서 GraphQL 필드 정의를 상속받는다. 
  • 이 객체는 객체 정의에 해당 모듈을 포함시킨다.


Interfaces guide 에서 더 읽어보기

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

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


반응형