flutter) artemis 패키지 GraphQL LocalTime to Dart DateTime 변환 오류

반응형

graphql 관련하여 스키마와 *.graphql 파일들을 기반으로

graphql을 편하게 이용할 수 있게 .graphql.dart 파일 코드를 작성해주는 패키지이다.

Apollo 와 비슷한 작업을 도와준다고 한다.

 

graphql 은 dart에서와 다르게 dateTime이 아닌 localTime, localDate 등등 기존의 시간 관련 표시를 해주는 타입을 가지고 있다.

그래서 이를 dart에서 쓸 수 있는 타입으로 변경을 해줘야하는데

이것도 artemis에서 도와준다.

 

예시 또한 공식 문서와 깃허브에 올라와 있으니 확인해서 이용하면 된다.

 

그런데 사용해보니 기존 예시랑 다르게 파일이 작성되어서 오류가 나는 현상이 발생했다.

 

빌드시 참고하는 build.yaml 파일에서

targets:
  $default:
    sources:
      - lib/**
      - schema.graphql
    builders:
      artemis:
        options:
          schema_mapping:
            - output: lib/graphql/graphql_api.dart
              schema: schema.graphql
              queries_glob: lib/**/*.graphql
          scalar_mapping:
            - graphql_type: Long
              dart_type: int
            - custom_parser_import: "package:{프로젝트명}/model/coercers.dart"
              graphql_type: LocalTime
              dart_type: DateTime
            - graphql_type: Map_String_StringScalar
              dart_type: Map<String, String>
            - graphql_type: BigDecimal
              dart_type: double

 

여기서 확인할 부분은 LocalTime to DateTime인데

이렇게 custom parser를 이용해서 필요한 데이터 타입을 건드릴 수 있도록 도와준다.

 

참고하는 coercers.dart는

import 'package:intl/intl.dart';

final timeFormatter = DateFormat('HH:mm:ss');

// LocalTime
DateTime fromGraphQLLocalTimeToDartDateTime(String time) =>
    DateTime.parse('1970-01-01T${time}Z');
String fromDartDateTimeToGraphQLLocalTime(DateTime date) =>
    timeFormatter.format(date);

예시대로 이렇게 해주었는데

 

작성된 graphql.dart에서는 @JsonKey에서 Nullable이 붙은

'fromGraphQLLocalTimeNullableToDartDateTimeNullable' 으로 작성되어 있어서 오류가 발생했다.

해당 부분 때문에 coercer.dart에서 메소드 명을 바꿔주었다.

그 이후 실행을 해보니 들어온 데이터를 process해주는 과정에서

invalid date type 이 뜨면서 데이터를 이용할 수가 없었다.

 

따라서 파일을 이와 같이 수정해주었다.

import 'package:intl/intl.dart';

final timeFormatter = DateFormat('HH:mm:ss');

// LocalTime
DateTime? fromGraphQLLocalTimeNullableToDartDateTimeNullable(String? time) =>
    DateTime.parse('1970-01-01T${time}Z');

String? fromDartDateTimeNullableToGraphQLLocalTimeNullable(DateTime? date) =>
    timeFormatter.format(date!);
 

input type과 output type이 Nullable해야 process가 올바르게 진행되었다.

 

예시처럼 했는데 안되는 분들은 이렇게 수정해주면 될 것 같습니다.

반응형