
백엔드
똑같은 코드인데 왜 안 돼? Spring JDBC 컨버터 미궁 탈출기
두줄요약
Spring Data JDBC에서 LocalDate 컨버터가 기대와 다르게 동작하는 이유를 JDBC 내부 처리 순서와 Oracle 드라이버 차이로 분석했습니다. 이를 피하기 위해 커스텀 래퍼 타입과 양방향 컨버터로 저장 형식을 제어하는 방법을 정리했습니다.
문제 상황
- Spring Data JDBC에서 LocalDate 커스텀 컨버터가 기대와 다르게 동작하는 현상
- 동일 패턴의 LocalDateTime은 동작하지만 LocalDate는 Oracle 저장 형식이 달라지는 문제
원인 분석
- Spring JDBC 내부의
StatementCreatorUtils.setParameterValue()가 Java 타입별 특별 처리 경로를 먼저 적용 LocalDate는setDate(),LocalDateTime은setTimestamp()로 전달되어 JDBC 드라이버 동작이 달라짐- Oracle 드라이버의
DATE와TIMESTAMP에 대한 컬럼 변환 관대함 차이
해결 방법
LocalDate를 직접 쓰지 않고CustomLocalDate래퍼 타입으로 감싸기- 커스텀 타입에 대해 읽기/쓰기 컨버터를 쌍으로 등록해 문자열 저장 형식 제어
- Spring Data JDBC의 자동 매핑과 타입 안정성을 함께 유지
