본 포스트는 공식 레퍼런스를 참고해 GraphQL을 공부하며 직접 작성한 가이드 입니다. 본 포스트는 2021년 7월 최신 버전인 v16.2를 기준으로 작성되어 있습니다.
Scalar
GraphQL에서는 다양한 기본 스칼라를 제공해주고 있다. IDIntString 등등이 이에 해당하는데 각각 스스로의 타입을 의미한다. 다양한 필터가 제공되는 스칼라 확장 라이브러리도 존재하고 그 외에도 개발자가 커스텀하게 스칼라를 만들 수 있도록 지원하기도 하는데, 이번엔 그 방법을 소개한다.
우리는 웹툰에 회차 정보를 넣는 작업부터 시작한다. 먼저 스키마부터 정의하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
type Episode { episodeNo: ID! title: String releaseDate: Date }
@Slf4j @Component publicclassEpisodeResolverimplementsGraphQLResolver<WebToon> { public List<Episode> episodes(WebToon webToon, List<Integer> episodeNos) { log.info("request episode data for webToon id : {}", webToon.getId()); log.info("episode no of requests : {}", episodeNos.stream().map(Object::toString).collect(Collectors.joining(", ")));
{ "errors":[ { "message":"Variable 'episodeNos' has an invalid value : The value must be greater than or equal to zero", "locations":[ { "line":1, "column":42 } ], "extensions":{ "classification":"ValidationError" } } ], "data":null }
다만 여기서 노출 시간 포멧이 yyyy-MM-dd로 되어있다. 이제 이를 변경하기 위해 직접 스칼라 타입을 만들어 패턴을 바꿔보자. 스칼라를 구현하기 위해선 변환을 담당해줄 Coercing만 잘 구현해주면 만들 수 있다. 직접 만든 스칼라를 빈으로 등록해주고 요청을 보내보자.
1 2 3 4 5 6 7 8 9 10
publicclassDateScalarextendsGraphQLScalarType { publicDateScalar(final DateTimeFormatter dateFormatter) { super("Date", "Sumfi Custom Date Scalar With Own Formatter", newCoercing<LocalDate, String>() { ... }); } }
@Bean public GraphQLScalarType date() { returnnewDateScalar(DateTimeFormatter.ofPattern("yyyy.MM.dd")); }