스프링

[Mybatis] Driver에 따라 DATETIME을 String으로 받는경우의 DateTimeFormatter 차이

du.study 2023. 8. 28. 22:51
728x90

 

이 글은 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에러가 발생했고 수정작업을 진행했습니다.

 

 

 

 

728x90