DB와 NodeJS의 TimeZone이 서로 다를 때 해결방법

이때가 오후 4:56분일때다...

 

매일 $ npm run start:dev를 통해 NestJS 서버를 run시키지만, TimeZone 이슈가 발생하기 전까지 생각하지도 못했던 부분이었다.

아래의 코드처럼 createdAt 칼럼을 기준으로 유저 테이블에 하루동안 얼마나 많은 유저가 누적이 되었는지를 가져오는 쿼리를 구성할 때, new Date()를 통해 현재 시각을 가져오고, .setDate()를 통해 하루 이전의 시각을 가져와 그 사이에 있는 유저를 가져오도록 하려했다.

 

async getUsersPerDay(){
    const from = new Date();
    const to = new Date();
    from.setDate(from.getDate() - 1);
    
    return await this.repository
      .createQueryBuilder('user')
      .where('user.createdAt >= :from', { from: from })
      .andWhere('user.createdAt < :to', { to: to })
      .andWhere('user.role = :role', { role: Role.USER })
      .getMany();
    
}

 

문제는 new Date()를 통해 현재 시각을 가져오는 게 아니라 UTC+0 기준의 현재 시각을 가져오는 것이었다. DB는 UTC +9 기준으로 설정되어있는데 NodeJS는 UTC +0으로 설정되어있어 쿼리를 날리면 시간 기준으로 유저를 가져올 수가 없었다.

원인

환경변수에서 TZ라는 값을 안주면 default 값인 UTC +0 기준으로 NodeJS의 TimeZone이 설정되어 생기는 이슈였다.

 

해결방법

환경변수 파일의 TZ 값을 Asia/Seoul로 지정하고, 서버를 재시작하면 정상적으로 UTC +9 기준으로 작동된다.