개요

스프링부트 JPA 를 사용하기 위해서 DB 를  MYSQL 로 설정하고자 아래와 같이 application.yml 을 작성하였다. 이후에 엔티티를 작성하고 테스트코드를 돌려보니 에러가 발생했다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/study
    username: root
    password: rootpass
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true

 

에러내용

java.sql.SQLException: The server time zone value 'blahblahblahblahblah~~' 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.

 

서버 타임존을 인식하지 못하거나 둘 이상의 타임존이 존재하기 때문에 SQLException 이 일어나고 있다. 이 때문에 JDBC 드라이버에서 서버 타임존을 설정해두어야 한다. 상세히 말하면, JDBC 드라이버를 UTC 시간대로 설정하여야 한다. 그래서 applicatoin.yml 을 아래와 같이 수정하니 해결되었다.

 

useTimezone=true&serverTimezon=UTC 을 덧 붙여주었다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/study?useTimezone=true&serverTimezone=UTC
    username: root
    password: rootpass

 

원인

MySQL 서버는 Preleptic Gregorian Calendar 를 내부적으로 사용하고 있다. 하지만 java 단에서 JDBC 를 통해 MySQL 과 연결을 시도하려는 경우, java.sql.Date 를 이용하게 되는데 이건 Non-Preleptic Gregorian 이다. 이와 같은 java 와 db 사이의 시간대 불일치 때문에 명시적으로 UTC 타임존(UTC :: 세계표준시) 을 사용할 수 있도록 설정하는 것이다.

 

reference

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-known-issues-limitations.html

 

 

Posted by doubler
,