Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

MySQL 엔티티 시간 불일치 오류 본문

개발 일지

MySQL 엔티티 시간 불일치 오류

csct3434 2024. 2. 29. 21:47

문제 상황

  • 테스트 코드를 작성하던 중, 실제 엔티티의 생성 시간과 DB에 저장된 값이 일치하지 않는 오류가 발생했습니다.
  • 로그를 확인해 보니, DB에 저장된 값은 22초인데 실제 생성 시간은 21.805265로 약 0.2초의 오차가 있었습니다.

문제 원인

  • JPA Auditing에서 LocalDateTime은 기본적으로 MySQL의 datetime과 매칭되는데, 이는 실제로 datetime(0)에 해당합니다.
    • 여기서 0은 반올림 자리수를 나타내는 값으로, 소수점 첫번째 자리에서의 반올림을 의미합니다.
  • 이로 인해, MySQL에 21.805265 값이 전달되어도 22.0으로 반올림 되어 오차가 발생하게 됩니다.

해결 방법

1. datetime 반올림 자릿수 변경

  • datetime의 반올림 자리수를 변경하여 JPA Auditing과 소수점 자리를 맞춰줍니다.

2. 커스텀 DateTimeProvider 지정

@Component
public class LocalDateTimeProvider implements DateTimeProvider {

    @Override
    public Optional<TemporalAccessor> getNow() {
        return Optional.of(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
    }

}
@Configuration
@EnableJpaAuditing(dateTimeProviderRef = "localDateTimeProvider")
public class JpaAuditingConfig {

}

  • MySQL과 소수점 자리를 맞추기 위해, 초 미만의 단위는 버리도록 DateTimeProvider를 구현하여 JPA Auditing에 연결해 줍니다.

참고한 자료

MySQL Master-Slave 데이터의 등록시간 불일치 현상