[Nest] Redis에 Date타입 꺼내쓰기

ShinJuYong·2022년 6월 22일
2

Nest

목록 보기
8/13
post-thumbnail

왜했니

검색한 결과를 1차적으로 RDBMS(MySQL)에서 뽑은뒤,
잠시 Cache (Redis)에 저장해 속도를 높이려했다

근데 여기서 Redis에 Set된 데이터를 Front로 Return할때

Date.Serialize()... Error! 이렇게 뜨는게아닌가

해당부분을 해결하려고 계속 검색한결과

  1. Redis는 Date타입이 들어오면 String형태로 저장시킨다
  2. 그러면 TZ같은것도 통째로 Strinf형태로 저장이됨..
  3. 그 형태의 String을 Date타입으로 강제로 형변환을 하니 Return 시킬때 형이 안맞다고 에러를 내는거였음

이거때문에 몇시간정도 매달리다가 이것저것 찾아보니..

Scalars 라는걸 발견했다

GraphQL에는 Int, Float, String, Boolean 및 ID와 같은 기본 유형이 포함됩니다. 그러나 때때로 사용자 정의 원자 데이터 유형 (예: 날짜)을 지원해야 할 수도 있습니다.

Nest.js에서 Code First방식으로 Scalar를 지정하는법을 찾다가 레퍼런스 문서를 발견해서 내 방식대로 수정해봤다

import { Scalar, CustomScalar } from '@nestjs/graphql';
import { Kind, ValueNode } from 'graphql';

@Scalar('Date', (type) => Date)
export class DateScalar implements CustomScalar<number, Date> {
  description = 'Date custom scalar type';

  parseValue(value: any): Date {
    return new Date(value); // value from the client
  }

  // 스트링형태로 들어온다면
  // 스트링 형태로 들어온놈을 new Date()로 바꿔서 리턴시켜줫다
  serialize(value: any): any {
    if (typeof value == typeof 's') {
      const result = new Date(value);
      return result;
    }

    return value; // value sent to the client
  }

  parseLiteral(ast: ValueNode): Date {
    if (ast.kind === Kind.INT) {
      return new Date(ast.value);
    }
    if (ast.kind === Kind.STRING) {
      return new Date(ast.value);
    }

    return null;
  }
}

그후 AppModule에 글로벌로 쓸수있게 등록했다

그후엔 에러 해결!

참고한곳


Scalarsgitbook

0개의 댓글