Hello

MySQL dependency 8.0.18 에서 8.2.0으로 업그레이드 시 만난 datetime 이슈 본문

java

MySQL dependency 8.0.18 에서 8.2.0으로 업그레이드 시 만난 datetime 이슈

nari0_0 2025. 4. 15. 15:12
728x90

MySQL JDBC 드라이버(Connector/J)의 의존성을 8.0.18에서 8.2.0으로 올린 뒤, 기존에 Timestamp를 사용하던 코드에서 아래 에러가 발생했습니다.

java.lang.IllegalArgumentException: Cannot format given Object as a Date
	at java.text.DateFormat.format(DateFormat.java:310) ~[na:1.8.0_242]
	at java.text.Format.format(Format.java:157) ~[na:1.8.0_242]

분명 SimpleDateFormat에 Timestamp는 잘 들어가는데, 갑자기 에러가?? 디버깅해보니 해당 컬럼에서 Timestamp가 아니라 LocalDateTime 객체가 반환되고 있었고, 이는 SimpleDateFormat이 지원하지 않아 SimpleDateFormat.format() 호출 시 문제가 발생한 것입니다.

DateTimeFormatter로 포맷팅 방식을 바꿔 문제를 해결했습니다.

 

몇 버전 부터 Timestamp -> LocalDateTime으로 바뀐지 원인을 추적해본 결과 Connector/J 8.0.23부터 DATETIME과 TIMESTAMP 컬럼에 대해 LocalDateTime을 기본 반환값으로 사용하는 것으로 변경되었음을 공식 릴리즈 노트를 통해 확인했습니다.

Also, with the implementation of the new mechanism, a getObject(columnIndex) call on a DATETIME column returns a LocalDateTime object now instead of a String. To receive a String like before, use getObject(columnIndex, String.class) instead.

->또한, 새로운 메커니즘이 적용됨에 따라, 이제 DATETIME 컬럼에 대해 getObject(columnIndex)를 호출하면 이전처럼 문자열이 아닌 LocalDateTime 객체가 반환됩니다. 이전처럼 문자열을 받으려면 getObject(columnIndex, String.class)를 사용해야 합니다.

 

참고 : https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-0-23.html

728x90