본문 바로가기
  • 분조장의 개발 블로그
GraphQL

Spring Boot에서 GraphQLResolver<T> 사용하기

by 무아니 2021. 5. 17.

Resolver 유형

Spring Boot에서 GraphQL 쿼리 요청을 처리하기 위해선 세 유형의 Resolver(interface타입)을 구현할 수 있습니다.

  • GraphQLResolver<T>
    • query, mutation 요청 구현
    • 스키마의 input 타입에 대하여  보다 복잡한 요청이 필요할 때 사용
  • GraphQLQueryResolver
    • query 요청을 담당
  • GraphQLMutationResolver
    • mutation 요청을 담당

그런데 GraphQLResolver<T>의 복잡한 요청이란 무엇일까요? 나머지 두 Resolver 와 어떻게 다른 걸까요?

 

GraphQLResolver<T> 알아보기

예시)

GraphQL 스키마

type Person {
 name: String!
 age: Int
 complexValue: Int!
}

type Query {
 hello: String!
 bye: String!
 person(who: String!): Person!
}

Resolver 구현

@Component
public class PersonResolver implements GraphQLResolver<Person> {

  public int getComplexValue(Person person) {
    System.out.println("Fetching value for person '" + person.getName() + "'");
    return veryComplexFetchingOfValue(person.getName());
  }
 
  // private 입니다.
  private int veryComplexFetchingOfValue(String name) {
    if (name.equals("Muuu")) {
      return 42;
    }
    return 3;
  }
  
}

GraphQLResolver<T> 인터페이스는 Object Resolver 라고도 하는데, 이를 정의하고자 할 때는 resolve 하고 싶은 대상에 기반한 인터페이스를 구현해야 합니다.

위 예시에선 GraphQLResolver<Person>을 구현하고 있는데, 이는 해당 resolver가 정의한 Person 객체로부터의 모든 resolver임을 뜻하며 이를 사용하여 Person에 대한 query 또는 mutation 요청을 받아 로직을 수행할 수 있습니다.

 

정리

  • GrapyQLResolver<Person>에 Person이 들어간 것은 쿼리문에서 input으로 Person을 사용하는 요청을 했을 때 이 인터페이스 구현체에서 처리하게 된다는 의미입니다.
  • 이를 반영한 첫번째 메서드에서 Person 타입의 parameter가 들어간 것을 볼 수 있습니다.
  • 즉, 복잡한 요청이란 요청하는 쿼리문을 query, mutation 구분 없이 특정 input 타입을 기준으로 구분하는 것을 의미하고 이 때 GraphQLResolver<T>를 이용 한다고 보면 될 것 같습니다!

 

참고 링크 : https://karl.run/2018/09/05/spring-boot-schema-first-graphql/

댓글