2013년 9월 10일 화요일

ibatis timezone DB 서버와 어플리케이션 서버의 TimeZone이 다른 경우

ibatis timezone DB 서버와 어플리케이션 서버의 TimeZone이 다른 경우

현상

  • DB에 UTC시간으로 시간을 저장하였다.
  • 웹 어플리케이션 서버에서 위 DB에서 데이터를 가지고 와서 클라이언트에 시간을 돌려줬는데 UTC 시간이 아닌 서버의 TimeZone 만큼 offset이 마이너스가 된 시간이었다. (2014-01-01 00:00를 저장했는데 2013-12-31 15:00)
  • 그렇다면 어디서 offset이 더 해진 것이며, 어떻게 해결해야 할까?

Timezone offset은 어디서

  • ibatis의 getTimestamp 함수에 있는 내부 로직이 DB에서 가지고 온 시간에는 타임존에 관한 정보가 없으므로 현재 서버의 타임존을 읽은 후 그 만큼을 역보정 하여 UTC로 만든다.(DB시간 – TimeZone offset)
    • DB에 저장된 2014-01-01 00:00 은 UTC시간을 저장한 것이다.
    • 그런데 웹앱 서버의 타임존이 KST로 되어 있기 때문에 실제로 저 시간을 iBatis로 불러오게 되면 내부적으로 KST(+9)로 인식하고 다시 -9를 하여 UTC 시간으로 만들어 준다.

해결방안

  • 우선책
    • DB서버 와 어플리케이션 서버의 타임존을 일치시켜주는 것이 베스트!
  • 차선책
    • TimeStamp Handler를 만든다
      • ibatis에서 원래 DB의 UTC시간을 다시 UTC시간으로 만들어주므로 다시 +9를 해서 UTC로 만들어 주어야 한다.
      • 변화과정
        • 2014-01-01 00:00 (DB)
        • 2013-12-31 15:00 (ibatis)
        • 2014-01-01 00:00 (TimeStamp Handler)