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
그래서 다른 이번엔 다르게 접근하기로 했다. 저장할 때는 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
'공부 > 프로그래밍' 카테고리의 다른 글
[jenkins] 에러로그 Disk Full(DNSQuestion) (0) | 2019.07.28 |
---|---|
[nodejs] AWS S3 파일업로드 (0) | 2019.07.22 |
[Linux-centos7] letsencrypt 갱신 실패시 대처법 (0) | 2019.07.02 |
[AWS, Springboot] SqsListener 사용 시 pool_size 문제 및 메세지처리 팁 (0) | 2019.06.16 |
[java] LocalDateTime(또는 LocalDate)을 Json으로 변환할 때 데이터 포멧 (0) | 2019.05.11 |
댓글