Objects
GraphQL 객체타입은 GraphQL API 에서 빵과 버터와 같은 존재이다. 각 객체는 데이터를 보여주는 필드가 있고 이름으로 쿼리할 수 있다. 예를 들어 우리는 User를 다음과 같이 쿼리할 수 있다.
user {
handle
email
}
그리고 다음과 같이 값을 돌려받을 수 있다.
{
"user" => {
"handle" => "rmosolgo",
"email" => nil,
}
}
일반적으로 GraphQL 객체 타입은 User
, Product
, Comment
과 같이 어플리케이션의 모델에 응답한다. 때때로 객체타입은 GraphQL Schema Definition Language (SDL)를 사용하여 설명된다.
type User {
email: String
handle: String!
friends: [User!]!
}
이 뜻은 User 객체가 세가지 필드를 가지고 있다는 것을 뜻한다.
email
은String
또는nil
을 리턴한다handle
은String
을 리턴하지만 절대로nil
을 리턴하지는 않는다(!
는 해당 필드가 절대로nil
을 리턴하지 않음을 뜻함)friends
, 는User
s로 구성된 리스트를 리턴한다 ([...]
뜻은 해당 필드가 리스트를 리턴함을 뜻함,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
'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글
(22) Graphql-ruby - enums (0) | 2019.01.01 |
---|---|
(21) Graphql-ruby - 스칼라 (0) | 2019.01.01 |
(19) Graphql-ruby - 쿼리에 before/after hook 호출하기 (0) | 2019.01.01 |
(18) Graphql-ruby - tracing (0) | 2019.01.01 |
(17) Graphql-ruby - 멀티플렉스 (0) | 2019.01.01 |