GraphQL Scalar Long 타입 추가하기

Moondy·2022년 11월 4일
0

문제 상황

GraphQL에서 공식적으로 지원하는 자료형은 다음 5가지밖에 없다.

  • Int
  • Float
  • String
  • Boolean
  • ID

Kotlin/Java를 사용하면 이 외에도 Long, Date와 같은 자료형을 사용하게 되는데, 이러한 자료형을 GraphQL에서 필드로 사용하려면 scalar Long 이런식으로 정의해서 써야한다. 하지만 이 경우 세부내용을 정의해야하는데 (how to serialized, deserialized, and validated...) 일일이 하기 힘드니깐 라이브러리 graphql-java-extended-scalars를 사용하기로 했다.

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);
    }
}
  • .graphqls (스키마 파일)
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 사용하는 경우 Config 설정

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>
profile
DevOps를 살짝 찍먹하는 BackEnd 개발자

0개의 댓글