Open DolphaGo opened 2 years ago
오늘 추가 확인 결과, 다음과 같다.
이 부분 을 읽어보면, 다음과 같다.
그래서 Database의 system_time_zone을 변경하려고 시도했다. 커넥션에 serverTimeZone을 UTC로 지정했지만, 원하는 대로 동작하지 않았다. DataBase의 system_time_zone이 JST로 설정되어있었기 때문이다.
즉, DB에는 system_time_zone
필드와 time_zone
2개의 필드가 있는데, system_time_zone
의 경우 세션 레벨에서 변경이 불가능하며, 서버의 재기동이 필요하지만, time_zone의 경우 세션 레벨에서 컨트롤이 가능하다.(클라이언트 측에서 timeZone을 지정하는 것)
DBA 분께서 내가 헷갈려하고 있는 부분을 정확히 설명해주셨다.
즉, Insert 될 때, datetime 필드는 당시 커넥션의 타임존의 설정을 받아 JST(+09:00)이 된 시간으로 들어가 있었고, CDC에서는 UTC based로 시간값을 읽게 되니, 이와 같은 이슈가 있던 것이다.
즉,정리하면 다음과 같다.
그래서, 최종적으로 Client에서 CDC 데이터를 읽고, JST로 Offset을 적용하면, DB에 적용된 시간보다 +09:00으로 보이는 것이었다.
DB의 타임존을 바꿀 것이 아니라면, 필드의 특성이니, Known issue로 간주하고, Client 측에서 처리를 해주도록 우회했다.
datetime
은io.debezium.time.Timestamp
로 매핑해주도록 한다. 참고서론이 길었고 문제는 다음과 같다.
@EnableJpaAuditing(dateTimeProviderRef = "auditingDateTimeProvider")
과 같이 두고 사용했었다.뭐 아무튼, 위의 문제들은 모두 아니었음.
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_unix-timestamp
위의 쿼리로 알게된 unixtime으로 위에 적어둔 사이트에서 확인해보니, 내가 설계했던 그대로 값이 존재했다. 즉, 현재 DB zone은 JST가 맞았고, UTC로 변환하면, -9:00가 되어있었다. JST 커넥션으로 들어갔기 때문에 request(+09:00, JST가 적용된 시간)한 시간이 그대로 DB에 보이는 것이었다.
결론적으로, mysql에 저장된 시간의 절대값을 알아보는 unixtime을 알게되었는데, 이 값을 통해 확인하니, DB 저장에는 문제가 없음을 확신할 수 있었다...! 내일 카프카 커넥트를 좀 확인해봐야지. 카프카 커넥트 쪽에서 JST로 된 시간을 UTC로 인식한 뒤, 다시 Offset을 적용하여 +09:00 처리하여 뱉고 있는 듯 하다.