Jdbc PreparedStatement.setTimeStamp

KST웹서버와 UTC DB간의 통신 , 어디서 날짜 시간값이 해당 타임존에 의해 바뀌는 걸까?

Image for post
Image for post

위의 그림처럼 KST로 설정된 WAS 에서 2017–11–11 18:00:00 이라는 날짜 시간 데이터를 MySQL에 저장하면 (물론, JDBC 연결로..)

MySQL 에 저장되는 데이터(DateTime 필드)는 2017–11–11 09:00:00 이다.

https://dev.mysql.com/doc/refman/5.6/en/datetime.html
이것은 MySQL에서 TimeStamp 필드와 DateTime필드에 대한 내용이다.

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.

이러한 말이 있다... 데이터 저장시에 관한 내용 같으니..여기선 넘어가자.

다시 맨 처음의 문제.
알아서 타임존에 따라 데이터가 저장되는 부분에서.
어느 곳에선가는 서버 타임존과 DB 타임존이 다름을 인식해야만
데이터를 변경할수 있다.

그곳은 JDBC 이다.

PreparedStatement의 setTimeStamp 메소드를 보자.

void setTimestamp(int parameterIndex,
Timestamp x,
Calendar cal)
throws SQLException

Sets the designated parameter to the given java.sql.Timestamp value, using the given Calendar object. The driver uses the Calendar object to construct an SQL TIMESTAMP value, which the driver then sends to the database. With a Calendar object, the driver can calculate the timestamp taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

드라이버는 커스텀 타임존을 고려하여 계산할수 있고, Calendar 가 없다면
드라이버는 동작되는 VM의 기본 타임존을 사용한다.

JDBC드라이버에서 Calendar 오브젝트를 사용해 TimeStamp값을 계산해내는 것이다.

역으로 DB에서 조회한 ResultSet도 마찬가지이다.

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store