웹 풀스택

Error Code 1298 incorrect time zone: 'Asia/Seoul' 해결, Node.js에서 MySQL연결 시 Time 값이 다르게 불러오는 문제 해결

kevinmj12 2025. 2. 26. 17:55

MySQL Timezone 설정

SET GLOBAL time_zone = "Asia/Seoul";
SET time_zone = "Asia/Seoul";

위 SQL문을 작성하면 기본 time zone을 Asia/Seoul로 설정하여 9시간씩 느리게 나오는 문제를 해결할 수 있다.

그런데 여기서도 또다른 에러가 발생하는 경우가 있다.

Error Code: 1298. Unknown or incorrect time zone: 'Asia/Seoul' 에러가 발생한다.

이는 timezone_leaps.sql 패키지가 설치되어 있지 않기 때문이다.

 

https://dev.mysql.com/downloads/timezones.html

 

MySQL :: Time zone description tables

This package contains time zone description tables which can be used with the MySQL server by users whose systems do not include zoneinfo files (e.g. Microsoft Windows, HP-UX). Please don't use this package if your system includes zoneinfo files (e.g. Linu

dev.mysql.com

다음 페이지에 들어가 timezone_2025a.zip을 설치해준다.

유닉스라면 POSIX standard를, 윈도우라면 Non POSIX with leap seconds를 설치해주면 된다.

 

설치 후 압축 풀기까지 마쳤다면, 콘솔창을 열어 MySQL Server\bin이 있는 경로로 이동해준다.

특별한 경로를 설정하지 않았다면, C:\Program Files\MySQL\MySQL Server 8.0\bin일 것이다.

 

해당 경로에서 mysql -uroot -p를 통해 mysql에 접속하여 준다.

그리고 show databases;를 통해 mysql 데이터베이스가 있는 것을 확인해준 뒤에

use mysql; 을 통해 mysql 데이터베이스를 사용,

source (timezone 압축 풀기한 경로)\timezone_leaps.sql 명령을 실행해준다.

그러면 무언가가 쫘라라라가 하면서 적용된다.

MySQL Workbench를 다시 실행하여 처음의 명령을 다시 실행해보자.

이번에는 성공적으로 쿼리문이 실행된 것을 볼 수 있다.

잘 적용이 된지 확인하고 싶다면, SELECT @@global.time_zone, @@session.time_zone; 을 실행해보면 알 수 있다.

Aisa/Seoul이 잘 나오는 모습을 볼 수 있다. 

만약 설정이 제대로 되지 않았다면, System으로 나오게 될 것이다.

 

Node.js에서 MySQL 시간 출력 시 9시간이 느린 값이 출력됨

다음과 같이 생성 시간과 업데이트 시간이 저장되어있는 board 테이블이 있다.

이를 Node.js에서 MySQL을 연결하여 값들을 불러와보자.

 

const mysql = require("mysql2");

const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  database: "board",
  password: "", // 비밀번호 입력,
});

const sql = "SELECT * FROM `posts`";

connection.query(sql, (err, rows, fields) => {
  if (err instanceof Error) {
    console.log(err);
    return;
  }
  console.log(rows);
});

MySQL Workbench에서 1번 id의 created_at은 14:28:11, updated_at은 15:05:03인데 반면

Node.js에서 출력한 1번 id의 created_at은 05:28:11, updated_at은 06:05:03으로 출력되는 것을 볼 수 있다.

이는 다른 id에서도 마찬가지인데, 모두 9시간씩 느린 값을 출력하는 공통점을 가지고 있다.

const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  database: "board",
  password: "", // 비밀번호 입력,
  dateStrings: true,
});

connection에 dateStrings: true로 설정해주었더니 날짜가 깔끔하게 출력되며 데이터베이스에 있는 시각이 그대로 출력되는 것을 볼 수 있다.

이와 같은 이유는, dateStrings를 설정하지 않고 출력할 때는 시간값을 UTC로 변환하여 출력하기 때문이다.

하지만 dateStrings: true 옵션을 설정하면, DATETIME 값을 문자열 그대로 반환한다.