[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으로 저장하나보다...
'엘리스 AI트랙 4기 > 프로젝트' 카테고리의 다른 글
[GitLab] merge locally 해결하기 (0) | 2022.06.27 |
---|---|
[JavaScript] UTC 날짜, 시간 계산 (0) | 2022.06.25 |
[Nodejs] nodemailer를 이용한 gmail 전송하기 (0) | 2022.06.23 |
[Sequelize] Nested Eager Loading (0) | 2022.06.22 |
[MySQL] csv 파일 import (0) | 2022.06.21 |