Welcome to the tech blog of Junior Backend Developer Myoungji Kim!
Database/MySQL
LocalDateTime 데이터의 MySQL datetime 반올림 이슈
-
📝배경
요즘 한창 SMS 발송 결과 조회 프로세스를 개선 중이다.
단순히 SMS 발송뿐만 아니라, 카카오 알림톡 발송 실패 시 SMS 대체 발송하는 컨슈머까지 함께 개선하게 되었는데, 컨슈머에서 SMS 발송 요청 내역을 상점 DB에도 저장해야 한다는 추가 요구사항이 있었다.
🔥 이슈
문제는 API에서는 수신한 '발송요청시각'을 API DB에 저장하고, 컨슈머에서는 API 요청 직후 동일한 값의 '발송요청시각'을 상점 DB에 저장하는데, 간헐적으로 두 DB의 '발송요청시각'이 1초씩 차이 나는 이슈가 있었다.
이 미세한 차이로 인해, SMS 발송 내역을 조회할 때 일부 데이터가 누락되는 문제가 있었다.
여기서 "왜 발송 내역을 굳이 두 개의 DB에 저장하지?"라는 의문이 들 수 있는데, 이는 레거시 구조에서 비롯된 이슈고.. 지금은 근본적인 문제 해결을 위해 하나의 마스터 DB에만 발송 내역이 적재되도록 전체 구조를 갈아엎는 중이다..! 그래서 의문점은 일단 패스하길!
위 공식 문서에 따르면, MySQL의 TIME, DATETIME, TIMESTAMP 타입은 최대 마이크로초(6자리)까지 fractional seconds(소수점 이하 시각)를 지원하지만, 기본값은 소수점 없음(fsp = 0) 으로 설정되어 있다. 만약 DATETIME 타입 컬럼에 LocalDateTime처럼 나노초 단위의 값을 저장하려 하면, MySQL은 이를 반올림하여 초 단위로 저장하게 된다.