엘리스 AI트랙 4기/프로젝트

[Ubuntu] MySQL 서버 시간 & [Nodejs] Sequelize 타임존 변경

남쪽마을밤송이 2022. 6. 24. 20:43

 [01 Ubuntu (MySQL) 서버 시간 변경] 

  • 현재 프로젝트를 진행하며 Database는 Oracle Cloud Service에 MySQL 서버를 구축하고 외부에서 접속 가능하도록 구축해뒀다.
  • 이 때 MySQL을 설치하고 MySQL 시간대(timezone)을 변경할 수 있는데, OS로 Ubuntu를 사용하고 있다면 서버 시간을 바꿔서 그대로 MySQL 서비스에도 적용하는 것이 가능했다.
    • 따로 설정을 하지 않으면 UTC+0으로 설정되어 있다.
  • MySQL 서비스의 설정 내에서 바꾸는 방법도 가능하지만, 나의 경우 Timezone 데이터가 없었고 따라서 Timezone 데이터를 외부에서 다운 받으라는데 너무 번거로웠다.
    • 위 링크의 명령어를 실행해보고 Timezone 데이터가 없다면 데이터를 다운받기보다  Ubuntu 서버 시간을 변경하는 방법이 훨씬 간단하다.

 (1) MySQL 서비스 접속 

  • 먼저 처음 설정시 생성해 둔 root 권한의 MySQL 서비스 계정 정보로 로그인한다.

  • 그리고 현재 Timezone 설정이 어떻게 되어있는지 확인하기 위해 다음 명령어를 실행한다.
SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;

  • 위와 같이 SYSTEM으로 설정되어 있다면 시스템 = OS = Ubuntu의 서버 시간을 적용한다는 의미이다.

 (2) Ubuntu 서버 시간 변경 

  • 먼저 현재 시간을 확인한다.
date
  • 예상한대로 9시간 느린 영국 시간대가 뜬다면 아래 명령어의 경로로 이동해서 Ubuntu의 Timezone 데이터가 있는지 확인한다.
    • 만약 경로가 없다면 또 다른 방법을 찾아야 한다...
cd /usr/share/zoneinfo/Asia/Seoul
  • 그리고 아래 명령어를 입력해 한국 시간대로 변경한다!
sudo cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
  • 다시 date 명령어로 잘 반영되었는지 확인한다.

  • 바뀐 시간대가 MySQL 서비스에도 적용될 수 있도록 재시작한다.
service mysql restart

 

 [02 Sequelize 타임존 변경 ] 

  • 나는 위 설정을 Database를 구축하며 처음에 했지만, Sequelize ORM을 사용하니 이상하게 다시 UTC+0 시간대의 데이터가 저장되었다.
  • 따라서 좀 더 검색을 해보니 Sequelize에서도 연결 객체 생성시 옵션을 몇 가지 추가해줘야 했다. (참고)

 (1) db/config/config.ts 

  • 연결 정보 생성시 편의를 위해 다음과 같이 .env 파일에 선언한 변수를 가져올 config 파일을 만든다.
import dotenv from "dotenv";
dotenv.config();

const config = {
  development: {
    username: process.env.DB_USERNAME || "root",
    password: process.env.DB_PASSWD,
    database: process.env.DB_DBNAME || "test",
    host: process.env.DB_HOST || "localhost",
    dialect: "mysql",
  },
};

export default config;

 (2) db/index.ts 

  • 그리고 Sequelize 객체 생성 부분에서 timezone과 dialectOprtions(선택)을 추가해주면 Database에 Timestamp 값들(CreatedAt, UpdatedAt, DeletedAt)이 한국 시간대로 잘 저장된 것을 확인할 수 있다.
import { Sequelize } from "sequelize";
import config from "../config/config";

const sequelize = new Sequelize(config.development.database, config.development.username, config.development.password, {
  host: config.development.host,
  dialect: "mysql",
  timezone: "+09:00", // 서울 시간대
  dialectOptions: { charset: "utf8mb4", dateStrings: true, typeCast: true }, // 날짜의 경우 문자열로 타입 변경 처리
  define: {
    timestamps: true,
  },
});

export { sequelize };
  • 그런데 참고로! 이렇게 고쳐놨더니 담당 코치님께서는 DB에는 UTC+0으로 저장해두고 가져왔을 때 +9시간을 계산해서 사용하는 방식을 추천한다고 하셨다.
    • 당시에는 왜지! 하며 이해가 되지 않았지만 실제로 서비스 기능 구현을 하면서 느낀점이 콘솔에는 UTC+0으로 들어가서 확인해보면 DB에는 잘 저장이 되어 있다던가 front에서 넘어온 값을 처리할 때도 헷갈려서 DB는 그냥 UTC+0으로 저장하나보다...