⚡GraphQL SPQR이란?
GraphQL 은 웹 API를 위한 쿼리 및 조작 언어이다. GraphQL을 보다 원활하게 사용할 수 있도록 만든 라이브러리 중 하나는 SPQR 이다.
기존 접근 방식에서는 GraphQL을 프로젝트에 추가하려면 두 단계를 따라야 한다. 먼저 GraphQL 스키마 파일을 프로젝트에 추가해야 한다. 둘째, 스키마에서 각 유형을 나타내는 각각의 Java POJO를 작성해야 합니다. 이는 스키마 파일과 Java 클래스의 두 위치에서 동일한 정보를 유지 관리한다는 것을 의미한다. 이러한 접근 방식은 오류가 발생하기 쉽고 프로젝트를 유지 관리하는 데 더 많은 노력이 필요하다.
GraphQL Schema Publisher & Query Resolver, 간단히 말해서 SPQR은 위의 문제를 줄이기 위해 만들어졌다. 주석이 달린 Java 클래스에서 GraphQL 스키마를 생성하기만 하면 된다. 여기까지의 내용이 Spring boot에서 정의한 내용이다.
우리 회사에서 SPQR을 사용하게된 이유는 다음과 같다.공식 문서 기준으로 GraphQL을 사용하려면 스키마를 생성하고 테이블 관련 Entiy을 작성하고 GraphQL의 타입을 자바 클래스로 만들어서 호출 및 응답용으로 생성해서 사용해야 한다. 화면 및 테이블이 적다고 한다면 공식 문서 기준으로 작업을 해도 크게 작업량이 많지 않을수 있지만 우리의 경우 조회하는 데이터 및 화면이 너무 많아서 공식 문서 기준으로 작업을 하자니 작업량이 많아지게 되었다. 그래서 찾아보다가 해당 라이브러리를 발견했고 사용하게 되었다. 해당 라이브러리의 사용방법에 대해서 설명을 하겠다.
⚡설정
<!-- maven pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.leangen.graphql</groupId>
<artifactId>spqr</artifactId>
<version>0.11.2</version>
</dependency>
<!-- gradle build.gradle -->
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web:{springBootVersion}")
implementation group: 'io.leangen.graphql', name: 'spqr', version: '0.11.2'
}
Model Book 클래스 작성
public class Book {
private Integer id;
private String author;
private String title;
}
인터페이스
public interface IBookService {
Book getBookWithTitle(String title);
}
서비스
@Service
public class BookService implements IBookService {
private static final Set<Book> BOOKS_DATA = initializeData();
@Override
public Book getBookWithTitle(String title) {
return BOOKS_DATA.stream()
.filter(book -> book.getTitle().equals(title))
.findFirst()
.orElse(null);
}
}
아래의 내용은 Graphql-spqr을 resolver로 만드는 방법을 제시한다.
@GraphQLMutation 및 @GraphQLQuery 의 어노테이션을 사용한다.
여기서 제일 중요한 어노테이션을 @GraphqlApi이다.
해당 어노테이션이 붙어 있는 경우, 여기서 사용하는 DTO 기준으로 스키마를 내부적으로 자동으로 생성을 해준다.!!!
@GraphQLApi // 여기서 제일 중요한 어노테이션.
@RequiredArgsConstructor
@Service
public class BookResolver {
// 해당 어노테이션을 사용하지 않는것을 권장.
// @Autowired
// IBookService bookService;
// 조회용이 아닌경우 해당 어노테이션을 사용.
// @GraphQLMutation(name = "addBook")
@GraphQLQuery(name = "getBookWithTitle")
public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) {
return bookService.getBookWithTitle(title);
}
}
위의 @GrahqlApi 어노테이션을 사용하는 경우, 따로 Controller가 필요 없고 /graphql로 호출이 가능 해집니다.
만약에 spqr을 사용하지 않는다면 Controller를 생성하고, 호출해야되는 스키마를 작성해야한다. 이 과정에서 만약 조회해야 하는 데이터가 늘어나거나 한다면 스키마, 조회용 DTO 두군데 모두 수정을 해야한다. 이 과정 자체가 우리에겐 너무 귀찮은 일이 였고 손이 많이 가는 일이였다. 내 기준에서는 해당 라이브러리를 사용해서 DTO의 관리가 잘된다면 작업량이 많이 줄어드는 일이였다.
분명 내가 Graphql을 정확히 알지 못해서 그럴수도 있고 더 좋은 방법이 존재할수도 있다. 그래서 계속해서 찾아보고 테스트 소스를 작성하면서 추가적으로 다른 방향성도 한번 찾아보고 있다.
'Spring' 카테고리의 다른 글
[JPA] QueryDSL에서 서브 쿼리 사용 정리 (0) | 2023.01.29 |
---|---|
[Spring] SpringBoot + RabbitMQ 연동 내용 정리. (0) | 2022.10.21 |
Spring Boot JPA 사용 방법 정리 (0) | 2022.08.04 |
Spring Data JPA에 대한 개념 및 사용 방법 정리 (0) | 2022.06.02 |
Spring Boot AOP 내용 및 사용 방법 정리 (0) | 2022.05.20 |