Search

GraphQL 설정

Created
2022/10/18 06:31

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에 정의한대로 잘 동작하는 것을 볼 수 있다.

4. 참고 자료