본문으로 이동
하이버네이트의 시간은 거꾸로 간다
문서

하이버네이트의 시간은 거꾸로 간다

김경록 · 컬리 · 컬리 기술 블로그

원본 보기

소개

스프링부트 버전을 업그레이드하는 과정에서 발견된 버그 해결기

AI 핵심 요약

스프링부트 3.x와 Hibernate 6으로 업그레이드한 뒤, KST 기준 특정 시간대에 배송 매니저의 로그인이 실패하는 장애가 발생했다. 원인을 추적한 결과 Hibernate의 `LocalTime`-`Time` 변환이 바뀌어 저장 시 나노초가 반영됐고, 조회 시 KST의 날짜 보정 과정에서 음수 밀리초가 만들어져 `DateTimeException`이 발생했다. 수정 버전이 나오기 전까지 문제 컬럼에 `AttributeConverter`를 적용해 저장·조회 시 나노초를 제거했고, 이후 같은 현상은 발생하지 않았다. 이 사례는 업그레이드 전후의 동작을 가설별로 검증하고, 저장과 조회 경로 및 타임존 조건을 나눠 살펴보는 디버깅과 통합 테스트의 중요성을 보여준다.

  • 프레임워크 업그레이드 전후의 데이터 차이를 비교하면 변경된 동작을 좁히는 단서가 된다.
  • 저장과 조회 경로를 각각 추적해 변환 로직의 비대칭이나 시간대 의존성을 확인한다.
  • LocalTime은 날짜와 시간대 정보를 담지 않으므로, 이를 다른 시간 타입으로 변환할 때 타임존 영향을 점검해야 한다.
  • 임시 대응으로 정밀도를 낮출 때는 데이터 손실 범위를 확인하고, 문제가 있는 컬럼에만 Converter를 적용한다.
  • 대규모 의존성 업그레이드에는 인수 테스트와 통합 테스트를 마련해 운영 장애를 조기에 발견한다.