본문 바로가기
공부/프로그래밍

[nodejs-sequelize] timezone 적용, 조회시 시간 제대로 표기하기

by demonic_ 2019. 7. 8.
반응형

sequelize 를 사용하면 DB에 저장시 자동으로 생성일, 수정일을 업데이트 해주는 기능이 있다. 그 옵션이 timestamps 인데, 사용하려면 다음처럼 설정하면 된다

var seqConfig = {
  ...
  ,define: {
    timestamps: true
  }
}

sequelize = new Sequelize(config.database.name, config.database.username, config.database.password, seqConfig)

문제는 표준시간이 UTC가 0으로 설정되어 있다는 점이다(한국은 +9 여야 제시간으로 보인다)

그래서 막상 저장하면 9시간 전의 날짜가 저장되는 것이다.(예를들어 11:00 에 저장하면 2:00로

 

timezone을 설정하는 방법은 다음과 같다.

var seqConfig = {
  timezone: config.database.timezone,
  ...
  ,define: {
    timestamps: true
  }
}

문제는 여기서 끝이 아니다. timezone을 설정해서 저장하면 저장한 시간을 제대로 들어갔는데, find를 통해 조회하게 되면 timezone을 적용하기 이전시간이 다시 표기된다(예를들어 11:00 로 저장되어 있다면 2:00로 나오는 현상). 로드할 때 타임존을 사용하여 시간을 되돌리는 것이다.

 

nodejs 는 타임존 설정을 서버시간에 의존하여 설정되지 않는다. 그래서 now Date()를 사용하면 현재시간이 아닌 다른시간이 나올 때가 있다.

# 현재시간은 21:50 분인데, new Date()를 실행하면 9시간 이전인 12:50이 표기된다

$ node
> new Date();
2019-07-08T12:49:48.614Z

그래서 타임존을 설정하려면 'process.env.TZ'를 이용하는 방법은 있지만 new Date() 명령어를 사용했을 때 제대로 적용되진 않았다. 그나마 유력한 stackoverflow 글을 찾아본 것이 다음링크인데 이것도 내 경우엔 되지 않았다.

https://stackoverflow.com/questions/8083410/how-can-i-set-the-default-timezone-in-node-js

 

How can I set the default timezone in node.js?

How do I set the default timezone in node.js?

stackoverflow.com

그래서 다른 이번엔 다르게 접근하기로 했다. 저장할 때는 timezone 을 적용하도록 옵션을 유지하되, 로드할 때 날짜를 String 형태로 받는 것이다. 우선 옵션을 다음과 같이 추가한다.

var seqConfig = {
  ...
  timezone: config.database.timezone,
  dialectOptions: {
      charset: 'utf8mb4',
      dateStrings: true,
      typeCast: true
  }
  ,define: {
    timestamps: true
  }
}

위의 옵션중 핵심은 dialectOptions 의 dateStrings: true, 와 typeCast: true 부분이다. 이렇게하면 데이터를 로드할 때 String 형태로 가져오게 되며 timezone 의 값을 역으로 계산하지 않는다.

 

끝.

 

 

 

참고:

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 Sequelize t

devstudioonline.com

 

반응형

댓글