1. 의존성
스프링 부트 2.7 버전 이후로는 GraphQL이 정식으로 지원된다. https://start.spring.io 에서 GraphQL을 검색하여 초기에 라이브러리 설정이 된 상태로 이용하거나, 그렇지 않다면 아래의 구문을 build.gradle의 dependencies에 추가하면 된다.
implementation 'org.springframework.boot:spring-boot-starter-graphql'
testImplementation 'org.springframework.graphql:spring-graphql-test'
Java
복사
GraphQL을 이용한 API 통신을 지원하려면 어떤 스키마가 지원되는지 작성해야 하는데, 기본 경로는 main.resources에 graphql 디렉토리를 만들고 그 안에 *.graphqls 혹은 *.gqls라는 확장자로 된 파일에 기입해야 한다.
2. 예시
예시를 위해 아래와 같은 entity를 이용한다고 가정해보자.
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Sample {
@Id
@GeneratedValue
private Long id;
public Sample(Long id) {
this.id = id;
}
}
Java
복사
위 entity를 이용하여 findAll과 findById라는 Query를 지원하는 것을 GraphQL 설정에 명시한다면, 아래와 같은 sample.graphqls로 작성할 수 있다.
type Query {
findAll: [Sample]
findById(id: ID!): Sample
}
type Sample {
id: ID!
}
Java
복사
** 실제론 DTO를 만들어서 사용하고, entity를 반환하지 않도록 하자.
이와 같은 Query를 지원하기 위해, Controller에서 Mapping을 해줘야 하는데, 아래와 같이 @QueryMapping이라는 어노테이션을 이용할 수 있다.
** Mutation의 경우 @MutationMapping을 이용하면 된다.
@QueryMapping(value = "findAll")
public List<Sample> findAll() {
List<Sample> sampleList = new ArrayList<>(10);
IntStream.range(0, 10).forEach(e -> {
sampleList.add(new Sample(new Long(e)));
});
return sampleList;
}
@QueryMapping(value = "findById")
public Optional<Sample> findById(@Argument Long id) {
Sample sample = new Sample(id);
return Optional.ofNullable(sample);
}
Java
복사
위와 같은 QueryMapping이 정상적으로 동작하는지 확인하기 위해, GraphQL에서 지원하는 GraphiQL을 이용한다. 해당 기능은 스프링 부트에 별도 설정을 하지 않으면 이용할 수 없기 때문에 application.yml에 별도 설정을 해줘야 한다. 내 경우엔 GraphiQL을 이용할 수 있게 만들고, 이 때의 Query를 JPA 로깅처럼 확인할 수 있도록 아래와 같이 설정 값을 추가했다.
spring:
graphql:
graphiql:
enabled: true
schema:
printer:
enabled: true
Java
복사
** 그 외의 설정도 가능하다. 아래 링크를 참고하자.
3. 결과
이제 어플리케션을 구동하여 GraphiQL로 접속할 수 있는 주소로 들어가면 아래와 같은 화면을 볼 수 있다.
이 때 findAll이라는 Query를 수행해보면, Controller에 정의한대로 잘 동작하는 것을 볼 수 있다.