하이버네이트의 시간은 거꾸로 간다
김경록 컬리 · 컬리 기술 블로그
AI 핵심 요약
스프링부트 3.x와 Hibernate 6으로 업그레이드한 뒤, KST 기준 특정 시간대에 배송 매니저의 로그인이 실패하는 장애가 발생했다. 원인을 추적한 결과 Hibernate의 `LocalTime`-`Time` 변환이 바뀌어 저장 시 나노초가 반영됐고, 조회 시 KST의 날짜 보정 과정에서 음수 밀리초가 만들어져 `DateTimeException`이 발생했다. 수정 버전이 나오기 전까지 문제 컬럼에 `AttributeConverter`를 적용해 저장·조회 시 나노초를 제거했고, 이후 같은 현상은 발생하지 않았다. 이 사례는 업그레이드 전후의 동작을 가설별로 검증하고, 저장과 조회 경로 및 타임존 조건을 나눠 살펴보는 디버깅과 통합 테스트의 중요성을 보여준다.
- 프레임워크 업그레이드 전후의 데이터 차이를 비교하면 변경된 동작을 좁히는 단서가 된다.
- 저장과 조회 경로를 각각 추적해 변환 로직의 비대칭이나 시간대 의존성을 확인한다.
- LocalTime은 날짜와 시간대 정보를 담지 않으므로, 이를 다른 시간 타입으로 변환할 때 타임존 영향을 점검해야 한다.
- 임시 대응으로 정밀도를 낮출 때는 데이터 손실 범위를 확인하고, 문제가 있는 컬럼에만 Converter를 적용한다.
- 대규모 의존성 업그레이드에는 인수 테스트와 통합 테스트를 마련해 운영 장애를 조기에 발견한다.
소개
스프링부트 버전을 업그레이드하는 과정에서 발견된 버그 해결기