[Mybatis] Driver에 따라 DATETIME을 String으로 받는경우의 DateTimeFormatter 차이
이 글은 driverClassName을 'com.mysql.jdbc.Driver'에서 'software.aws.rds.jdbc.mysql.Driver'로 바꾸는 과정에 발생된 이슈를 작성하고자 합니다.
우선 이슈가 발생된 과정을 정리해보면 다음과 같습니다.
1. driverClassName 변경 'com.mysql.jdbc.Driver' -> 'software.aws.rds.jdbc.mysql.Driver'
2. DATETIME 필드를 mybatis를 통해서 String으로 리턴하는 상태.
3. 로직상에서 String으로 받은 값을 아래 코드를 통해서 변환
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
LocalDateTime updatedAt = LocalDateTime.parse(updateDate, format);
해당 과정에서 포멧 에러가 발생했고, 이를 확인해본결과 아래와 같이 동작하고있었습니다.
1. software.aws.rds.jdbc.mysql.Driver 사용할때
DATETIME 조회후, software.aws.rds.jdbc.mysql.shading.com.mysql.cj.protocol.InternalTime 변환
- toString 과정에서 아래 로직을 거치기에 yyyy-MM-dd HH:mm:ss 형식으로 변환
- nanoSecond를 저장하지 않는 상태이기에 .S가 사라졌고, 포멧 에러가 발생했습니다.
(InternalTime.class)
@Override
public String toString() {
if (this.nanos > 0) {
return String.format("%02d:%02d:%02d.%s", this.hours, this.minutes, this.seconds, TimeUtil.formatNanos(this.nanos, this.scale, false));
}
return String.format("%02d:%02d:%02d", this.hours, this.minutes, this.seconds);
}
2. com.mysql.jdbc.Driver 사용할때.
DATETIME 조회후 java.sql.Timestamp 로 변환
- toString 과정에서 아래 과정을 거치기에 yyyy-MM-dd HH:mmss.S 로 변환
해당 과정에서는 반드시 나노세컨드가 들어가는 상태였습니다.
if (nanos == 0) {
nanosString = "0";
} else {
nanosString = Integer.toString(nanos);
.....
timestampBuf.append(".");
timestampBuf.append(nanosString);
return (timestampBuf.toString());
해당 차이로 인하여 Driver를 변경하자마자 테스트 과정에서 format에러가 발생했고 수정작업을 진행했습니다.