[GraphQL] Spring Boot로 시작하기

본 포스트는 공식 레퍼런스를 참고해 GraphQL을 공부하며 직접 작성한 가이드 입니다.
본 포스트는 2021년 7월 최신 버전인 v16.2를 기준으로 작성되어 있습니다.

GraphQL 시작하기

Spring Boot 환경에서 gql을 시작하기 위해서는 gql 라이브러리를 추가해주어야 한다. 추가하는김에 gql playground도 추가해주자.

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>11.1.0</version>
</dependency>

<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>playground-spring-boot-starter</artifactId>
<version>11.1.0</version>
</dependency>

그리고 요청을 위한 쿼리를 하나 만들어주자.

1
2
3
4
# 웹툰 정보 가져오기
type Query {
getWebToon(id: ID!): WebToon
}

이 쿼리는 이름이 getWebToon 이고 파라미터로 id를 필수값으로 받으며 WebToon을 반환한다. 따라서 반환을 위한 WebToon에 대한 스키마를 정의해주자.

1
2
3
4
5
6
7
8
9
10
type WebToon {
id: ID!
webToonType: WebToonType
title: String
}

enum WebToonType {
Origianls
Canvas
}

이제 요청을 받을 컴포넌트와 관련 모델을 만들어주자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Slf4j
@Component
public class WebToonResolver implements GraphQLQueryResolver {
public WebToon getWebToon(UUID id) {
log.info("getWebtoon request accepted id: {}", id);

return WebToon.builder().id(id).title("여신강림").webToonType(WebToonType.Origianls).build();
}
}

@Builder
@Value
public class WebToon {
private UUID id;
private String title;
private WebToonType webToonType;
}

public enum WebToonType {
Origianls,
Canvas
}

루트쿼리에서 getWebToon을 호출하니까 GraphQLQueryResolver를 사용한다. 특정 타입에 종속된 쿼리를 매핑하고 싶으면 GraphQLResolver를 통해 할 수 있다. 이제 간단한 준비는 끝났다. 서버를 띄우고 playground에 접속한다. playground에서 내가 정의한 스키마에 대한 정보도 볼 수 있다.

이제 정의한 쿼리에 대해 요청을 날려 테스트를 해보자.

1
2
3
4
5
6
7
{
getWebToon(id: "3568e088-ec83-11eb-9a03-0242ac130003") {
id
title
webToonType
}
}

그럼 간단하게 쿼리에 대한 응답을 볼 수 있다.

1
2
3
4
5
6
7
8
9
{
"data": {
"getWebToon": {
"id": "3568e088-ec83-11eb-9a03-0242ac130003",
"title": "여신강림",
"webToonType": "Origianls"
}
}
}

Repository

모든 가이드의 예제 코드는 SongHayoung/springboot-graphql-tutorial에서 확인할 수 있습니다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2021/07/24/GraphQL/graphql-2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.