본문 바로가기

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

(14) Graphql-ruby - 쿼리 실행하기

반응형


Executing Queries


GraphQL::Schema 로 쿼리를 요청한 후 Ruby Hash를 결과로 받을 수 있다. 예를 들어, 문자열로부터 쿼리를 실행하려면,

query_string = "{ ... }"
MySchema.execute(query_string)
# {
#   "data" => { ... }
# }

Or, you can execute multiple queries at once:

MySchema.multiplex([
  {query: query_string_1},
  {query: query_string_2},
  {query: query_string_3},
])
# [
#   { "data" => { ... } },
#   { "data" => { ... } },
#   { "data" => { ... } },
# ]

다른 옵션들도 있다:


  • variables: $variable 형태로 값 지정 (더보기 query variables)
  • context: resolve 함수로 전달된 어플리케이션 내 데이터 받음
  • root_value: 객체로 root-level resolve 함수에 제공됨
  • operation_name: 전해진 문자열에서 named operation 선택
  • document: 이미 parse 된 쿼리를 받음(문자열 형태가 아니라) GraphQL.parse 참고
  • validate: false 값이면 해당 쿼리에 대해 유효성검사 건너띔
  • max_depth:, max_complexity: schema-level 값 오버라이드


위의 몇몇 옵션들은 아래에 더 자세히 설명되 있고 GraphQL::Query#initialize 를 통해서 더 많은 정보를 볼 수 있다.


Variables


GraphQL은 쿼리 문자열을 파라미터로 표시하기 위해서 query variables 을 제공한다. 쿼리 문자열이 변수를 가지고 있다면, 해당 값을 { String => value } 와 같이 hash pair로 보여줄 수있다. 키 값은 반드시 "$" 를 포함해야 한다.


예를 들어, 쿼리에 변수를 제공하기 위해서:

query_string = "
  query getPost($postId: ID!) {
    post(id: $postId) {
      title
    }
  }"

variables = { "postId" => "1" }

MySchema.execute(query_string, variables: variables)


만약 변수가 GraphQL::InputObjectType 라면, nested hash 를 제공하면 된다. 예를 들자:

query_string = "
mutation createPost($postParams: PostInput!, $createdById: ID!){
  createPost(params: $postParams, createdById: $createdById) {
    id
    title
    createdBy { name }
  }
}
"

variables = {
  "postParams" => {
    "title" => "...",
    "body" => "..."
  },
  "createdById" => "5",
}

MySchema.execute(query_string, variables: variables)


Context


앱에 따라 구체적인 값들을 context 형태로 GraphQL에 제공할 수 있다. 이 값은 다음과 같이 여러 곳에서 사용이 가능하다.

  • resolve 함수
  • Schema#resolve_type hook
  • ID generation & fetching


context 의 일반적인 사용은 현재 사용자나 uth token을 사용할 때이다. context 값을 제공하기 위해서, Schema#execute 에 hash를 전달해보자.


context = {
  current_user: session[:current_user],
  current_organization: session[:current_organization],
}

MySchema.execute(query_string, context: context)


그리고 난면, 해당 값들에 실행이 진행되는 동안 접근 할 수 있다.

field :post, Post, null: true do
  argument :id, ID, required: true
end

def post(id:)
  context[:current_user] # => #<User id=123 ... >
  # ...
end

context 는 너가 전달한 Hash가 아니라, GraphQL::Query::Context 의 인스턴스이라는걸 명심해야 한다. 


Root Value


root_value 를 사용하여 root 객체를 제공할 수 있다. 예를 들면:

current_org = session[:current_organization]
MySchema.execute(query_string, root_value: current_org) # object 

That value will be provided to root-level fields, such as mutation fields. For example:

class MutationType < GraphQL::Schema::Object
  field :create_post, Post, null: true

  def create_post(**args)
    object # => #<Organization id=456 ...>
    # ...
  end
end

GraphQL::Relay::Mutation 필드 또한 객체 형태의 root_value: 를 받는다.


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

* 출처: http://graphql-ruby.org/queries/executing_queries.html



반응형