본문 바로가기

Project/이슈 정리

Node.js - sequelize 시간 저장, 조회시 UTC 기준으로 출력 문제

문제 상황

Node.js/sequelize 를 사용한 프로젝트에서 시간을 저장, 조회할 때 UTC 시간을 기준으로 처리되는 이슈를 발견하였다.

대처 방법 

1. 사용하고 있던 RDS의 timezone을 한국시간으로 변경

 

RDS 인스턴스 시간대 변경하는 법

 

Amazon RDS DB 인스턴스의 시간대 변경

Amazon Relational Database Service(Amazon RDS) DB 인스턴스의 시간대를 현지 시간대로 변경하려고 합니다. DB 인스턴스의 시간대를 변경하려면 어떻게 해야 합니까?

aws.amazon.com

 

2. sequelize의 config.json 파일 수정

  "development": {
    "username": "admin",
    "password": "*****",
    "database": "*****",
    "host": "*****",
    "dialect": "mysql",
    "timezone": "+09:00" //이 부분을 바꾸면 KST시간대로 DB에 저장이 가능하다.
    }

저장을 KST시간으로 하고나니, 더 큰 이슈가 발생되었다. 

 

sequelize는 UTC시간대로 고정되어 있어서 이전까지는 +9:00으로 저장이 되고, 조회 api 호출 시, -9:00으로 자동으로 바꿔서 나갔는데

저장시간은 한국시간으로 설정되었지만, 조회할 때 -9:00는 여전히 적용이 되어 방금 쓴 포스트에도 '9시간 전'이라는 표시가 계속되었다.

 

3. 조회 시, date -> string 타입 캐스팅 하기

 

찾아본 레퍼런스에서는 조회 시에 date를 아예 string으로 바꿔서 응답을 보내는 방법으로 해결한 사례도 많았다.

  "development": {
    "username": "admin",
    "password": "*****",
    "database": "*****",
    "host": "*****",
    "dialect": "mysql",
     dialectOptions: {
            useUTC: false, // 조회시에 string으로 타입캐스팅
            dateStrings: true,
            typeCast: true
      },
    "timezone": "+09:00" //이 부분을 바꾸면 KST시간대로 DB에 저장이 가능하다.
    
    }

이렇게 처리하면 되긴 한다. 

 

대신 '2022-04-11 18:23:50'과 같은 형식으로 바뀌어 처리가 된다.

 

나의 경우에는 기존에 클라이언트에게 "2022-04-11T 18:27:36.000Z"의 형식으로 응답을 주고 있어서 형식을 바꾸면 안 되었다...

 

https://devstudioonline.com/article/sequelize-set-timezone-and-datetime-format-for-mysql

 

Sequelize set timezone and datetime format for mysql

When you use Sequelize ORM to connect database then you might face issue time wrong time retrieval from the database. Because Sequelize returns UTC in select queries for DateTime fields. It this situation you need to change the configuration of Sequeliz

devstudioonline.com

 

4. 타입 캐스팅을 한 다음 dto에서 new Date로 다시 바꿔 응답 보내기

 

 dto에서 new Date()로만 씌워서 보냈더니 보내면서 이걸 다시 -9:00로 처리해버려서 결과는 똑같았다...

createdDate: new Date(review.createdAt+"z")

위와 같은 형식으로 "z"를 붙여서 Date를 만들어주면 "2022-04-11T 18:27:36.000Z" 형식의 한국시간으로 응답을 보낼 수 있었다.

 

 

이렇게 해서 기존 형식으로 한국 시간을 처리할 수 있었다.