GraphQL에서 공식적으로 지원하는 자료형은 다음 5가지밖에 없다.
Kotlin/Java를 사용하면 이 외에도 Long, Date와 같은 자료형을 사용하게 되는데, 이러한 자료형을 GraphQL에서 필드로 사용하려면 scalar Long
이런식으로 정의해서 써야한다. 하지만 이 경우 세부내용을 정의해야하는데 (how to serialized, deserialized, and validated...) 일일이 하기 힘드니깐 라이브러리 graphql-java-extended-scalars
를 사용하기로 했다.
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-extended-scalars</artifactId>
<version>19.0</version>
</dependency>
@Configuration
public class GraphQlConfig {
@Bean
public RuntimeWiringConfigurer runtimeWiringConfigurer() {
return wiringBuilder -> wiringBuilder.scalar(ExtendedScalars.DateTime);
}
}
scalar Date
scalar Long
type Query {
getHistoryList(from: Long, to: Long) : [HistoryModel]
}
type HistoryModel {
seq: Long,
startTime: Long,
endTime: Long,
startDt: Date,
endDt: Date
}
graphql-java-kickstart를 사용하는 경우 위와 같이 configuration 파일에서 RuntimeWiringConfigurer
을 사용할 수 없다.
GraphQLScalarType
로 대체해서 사용해서 설정해주면 된다.
@Configuration
public class GraphQLScalarConfig {
@Bean
public GraphQLScalarType date() {
return ExtendedScalars.Date;
}
@Bean
public GraphQLScalarType graphqlLong() {
return ExtendedScalars.GraphQLLong;
}
}
[참고]graphql-java-kickstart in pom.xml
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-java-servlet</artifactId>
<version>${graphql-servlet.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>${graphql-starter.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>${graphql-tool.verison}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
JSON 타입을 scalar로 어떻게 선언할 수 있을까요?