Spring JDBC 컨버터, 왜 안 될까? 래퍼 클래스로 해결!

by DD
10개월 전
조회수 6

Spring Data JDBC에서 커스텀 컨버터를 사용했지만, LocalDate 변환이 예상과 다르게 동작함

JDBC 드라이버의 타입 처리 우선순위와 Oracle JDBC의 관대한 변환 정책이 문제의 원인

CustomLocalDate 래퍼 클래스를 통해 타입 안정성을 유지하면서 문제 해결

Spring JDBC 동작 원리: 타입 변환의 숨겨진 비밀

Spring JDBC는 `instanceof` 연산자를 사용하여 Java 타입을 확인하고, 타입에 따라 `setDate`, `setTimestamp` 등의 메서드를 호출한다. 구체적으로, LocalDate는 `setDate`로 처리되어 Oracle JDBC 드라이버의 DATE 타입 변환을 거친다. 따라서, 커스텀 컨버터가 무시되는 경우가 발생한다.

Oracle JDBC 드라이버의 관대함: TIMESTAMP vs DATE

Oracle JDBC 드라이버는 TIMESTAMP 타입에 대해 관대하게 문자열 변환을 허용한다. 반면, DATE 타입은 엄격하게 처리하여 타입 불일치 시 오류를 발생시킨다. 따라서, LocalDateTime은 자동 변환되어 정상 동작하는 것처럼 보였지만, LocalDate는 오류가 발생했다.

CustomLocalDate 래퍼 클래스: 깔끔한 해결책

CustomLocalDate 래퍼 클래스를 사용하면 Spring JDBC의 특별 처리를 우회할 수 있다. 따라서, 커스텀 컨버터가 정상적으로 동작하여 타입 안정성을 확보할 수 있다. 결과적으로, Spring Data JDBC의 기능을 유지하면서 데이터베이스 저장 형식을 제어할 수 있다.

똑같은 코드인데 왜 안 돼? Spring JDBC 컨버터 미궁 탈출기