상세 컨텐츠

본문 제목

[MySQL][JDBC] SQLException : server time zone value 'KST' is unrecognized

Log.Develop/DB

by bluayer 2020. 4. 15. 22:07

본문

서론

내가 사용하고 있는 환경은 다음과 같다.

OS : macOS Catalina

MySQL : 8.0.19(brew로 설치함)

JDBC : 글 작성일 기준 latest 버전

 

이 문제를 발견하게 된 상황은

MySQL과 JDBC를 함께 사용하고 있는 상황이었다.

하지만 찾아보니 MariaDB에서도 일어나는 에러인 것으로 보였다.

아무쪼록, 필자는 MySQL을 사용하다 발견한 에러임을 먼저 밝힌다.

 

정확한 에러 메시지의 내용은 다음과 같다.

java.sql.SQLException: The server time zone value 'KST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.

 

좀 더 검색해보니

MySQL의 경우에는 5.X 버전의 특정 하위 버전부터 발견된 에러라고 생각했다.

놀랍게도 필자가 사용하고 있는 MySQL의 버전은 8.X 버전인데!!

수많은 한국의 개발자들이 분명 issue로 지적했을 것이 분명한데!!!

아직도 안 고쳐졌다는 점이 놀라울 따름이었다!!!

 

놀라움은 잠시 뒤로 접어두고,

문제의 원인에 대해 알아보자.

해결이 급하다면 해결 방법으로 넘어가시는 것을 추천한다.

 

문제의 원인

에러 메시지가 이야기하고 있는 내용은 다음과 같이 설명할 수 있다.

 

너가 사용하고 있는 MySQL 혹은 JDBC에서 'KST'라는 타임 존은 찾을 수가 없어!!
적절한 Timezone으로 설정해줘야 해!

 

왜 이런 일이 발생했을까?

그 이유는 한국에서 사는 MAC 유저라면 분명 Timezone을 KST로 설정했을 것이고,

MySQL은 System Timezone을 사용하기 때문이다.

실제로,

 

$ mysql.server start
// 새로운 탭을 연 후
// 필자는 root로 접속했다.
$ mysql -u root -p
// 패스워드 입력후
mysql > SELECT @@global.time_zone, @@session.time_zone;

 

위와 같이 입력하여 Global timezone과 세션 타임존을 보면 System이라고 적혀있을 것이다.

그리고 MySQL은 KST 타임존을 지원하지 않는다.

 

따라서 해결법은 여러 가지가 있을 수 있는데,

 

1. MAC(Device)의 Timezone을 바꾼다.

하지만 이 방법은 너무 단순무식할 뿐더러, 너무 불편하다.

 

2. 임시 방편으로 mysql 세션에서 Timezone을 바꾼다.

MySQL에는 'Asia/Seoul'이라는 타임존이 존재한다! 그리고 다른 방법에서도 이걸 쓸 꺼다. 

 

아무튼 세션에서 타임존을 바꾸는 방법은 필자의 기기에서는 잘 진행되지 않았다.

또한 검색해보니,

 

mysql> SET GLOBAL time_zone='Asia/Seoul'
mysql> SET time_zone='Asia/Seoul'

 

위와 같은 방법으로 진행하여 성공한 분들이 있었다.

그렇지만, 필자의 기기에서는 잘 되지 않았고 검색해 본 결과 본인처럼 잘 되지 않은 분들이 있었다.

 

결론적으로 필자가 해결한 방법은 상당히 직관적이면서 제일 간단한 방법이었다.

 

해결방법

MySQL을 설치하게 되면 어딘가에 configuration 파일이 존재하게 된다.

심지어 여러 개가 존재하게 되는데, 보통 my.cnf 라는 이름으로 존재한다.

my.cnf에서는 MySQL의 인코딩 방식을 utf-8로 통일할 수도 있고 다양한 기능들이 있지만,

우리에게 필요한 타임존을 설정할 수 있도록 도와준다.

 

그렇다면, my.cnf 파일을 어떻게 찾을까?

답은 멀지 않은 곳에 있다.

 

mysql --help

 

위와 같이 입력하게 되면 mysql과 함께 쓸 수 있는 옵션들에 대한 설명(Usage) 다음에,

Default options에 대한 이야기들이 나오게 된다.

 

mysql --help를 내리다보면 나오는 my.cnf의 위치

 

이처럼 my.cnf 파일의 경로들이 모두 친절하게 적혀있다.

순서는 왼쪽에서 오른쪽으로 read한다고 하는데,

일단 문제를 해결하기 위해 후폭풍이 어떨지 모르겠으나 최상위의 my.cnf를 건드려 보자.

 

$ cd /etc

$ sudo vim my.cnf

 

보통 이 my.cnf는 비어있을 것이다.

거기에 다음과 같이 추가해주면 된다.

 

[mysqld]
default-time-zone=Asia/Seoul

 

자 이제 모든 세팅이 끝났다!!

혹시 모르니, mysql server를 재부팅해준다.

 

$ mysql.server restart

 

확인을 해보고 싶다면,

서버에 접속한 다음 콘솔에서 확인할 수도 있고,

MySQL Workbench에서 확인할 수도 있는데,

 

SELECT @@global.time_zone, @@session.time_zone;

 

위와 같은 쿼리를 입력하면 된다.

 

만약 잘 적용이 되었다면 다음과 같은 결과값이 나올 것이다.

 

console에서 확인한 결과 값

 

여기까지 왔다면 이 에러는 잘 해결됐을 것이다!

관련글 더보기

댓글 영역