사내 프로젝트에서 사용하는 Gson을 개선하면서 작성한 글입니다. 특히 날짜/시간 포맷 관련된 컨버팅 로직에 대한 해결책을 제시합니다. 레거시 호환을 위해 Jackson 대신 Gson을 사용하면서, 스프링과의 호환성 문제로 인해 종종 컨버팅 오류가 발생하는데, LocalDateTime 처리 문제도 그 중 하나입니다. 단순 컨버팅 이슈부터 여러 서비스에서 일관성 없는 설정들 때문에 코드베이스가 복잡해지는 상황을 개선하고 싶었고, 더 이상 시간 관련 컨버팅 이슈에 신경을 쓰지 않는 것을 목적으로 가능한 모든 경우를 호환할 수 있는 글로벌한 LocalPeriodTime 컨버터를 구현하게 됩니다. 실제 코드는 컨셉 코드로 대체하였습니다.
Gson을 사용하는 현 프로젝트에서 LocalPeriodTime 이 제대로 컨버팅 되지 못하는 문제를 커스텀 Parser와 Converter를 구현하여 해결합니다. 본 글에서는 해당 로직을 구현하는 과정과 작동 방식에 대해 설명합니다. 마지막으로 향후 발생 가능할 법한 디버깅 시나리오에 대해서 다루고, 디버깅 방법론을 제안합니다.
Gson을 사용한 직렬화/역직렬화 과정에서 LocalDateTime 파싱을 자꾸 제대로 못하는 상황이 발생합니다. 프로젝트마다 LocalDateTime을 다루는 패턴이 상이합니다.
시간이라고 인식되는 문자열은 그냥 무조건 다 LocalDateTime으로 파싱하고 싶습니다. 더 이상 LocalDateTime을 String으로 파싱할 건지, LocalDate로 파싱할 건지, ZoneTime으로 파싱할 건지, 무엇을 쓰더라도 시간 컨버팅 지옥에서 벗어나고 싶습니다. 😈
문제와 원하는 것이 명확한 상황입니다. 이를 달성하고자 다음과 같이 접근했습니다.
이와 같은 사고 흐름에 따라 간단한 컨버터를 구상했습니다. 다음 컨버터는 String source 를 받아서 LocalDateTime을 리턴합니다.
@Override
public LocalDateTime convert(String source) {}