csct3434
MySQL 엔티티 시간 불일치 오류 본문
문제 상황
- 테스트 코드를 작성하던 중, 실제 엔티티의 생성 시간과 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에 연결해 줍니다.
참고한 자료
'개발 일지' 카테고리의 다른 글
equals() vs hashCode() (0) | 2024.02.29 |
---|---|
MySQL 더미 데이터 적재 속도 비교 (1) | 2024.02.29 |
첫 오픈소스 기여 (feat.AssertJ) (0) | 2024.02.29 |
AWS EC2 t2.micro 인스턴스 메모리 부족 문제 (1) | 2023.02.27 |
Spring Boot 프로젝트에 HTTPS 적용하기(feat. nginx, letsencrypt, certbot) (1) | 2023.02.25 |