본문 바로가기
Web Development/Spring Legacy

[Spring / Legacy / Error] Cause: org.postgresql.util.PSQLException: timestamp without time zone 자료형인데 표현식은 character varying 자료형입니다. Hint: 다시 정의하거나 형변화자를 사용해보십시오 Position: 290

by 감자맹고우 2022. 1. 5.
728x90
반응형

프로젝트에서 PostgreSQL을 사용하면서 가끔 예상치 못한 문제를 맞닥뜨릴 때가 있다. (물론, 오히려 더 쉽게 문제를 해결할 수 있는 경우도 있다)

그 중에서도, 이번에는 나를 처음으로 당황하게 했던 문제가 있어 발생했던 에러와 해결방법을 공유하고자 한다.

 

 

해당 에러는 현재 시간을 CURRENT_TIMESTAMP로 간단하게 처리할 수 있는 timestamp 데이터 타입을 사용하게 되었을 때 발생했다.

 

우선, 에러의 로그는 다음과 같다.

 

timestamp without time zone 자료형인데 표현식은 character varying 자료형입니다.

 

에러가 발생했던 원인은 다음과 같다.

 

DB에서 timestamp 타입의 컬럼을, Java에서 Java.util.Date 타입으로 처리하고 있었다.

 

testVO.setTestDate(new Date());

 

timestamp 타입을 처음 접했고, 다른 DB에서 프로젝트를 구성했던 방식대로 Date 타입으로 자연스럽게 로직을 작성했는데, 예상치 못한 곳에서 문제가 발생해버린 것이다.

 

Java에서 Timestamp 타입으로 다시 변경해서 작성해볼까 했지만, Date 타입으로 이미 로직을 짠 상태이고 앞으로도 Date 타입이 코드를 작성하기에 더 편할 거란 생각에 Date 타입은 유지하기로 했다.

 

그래서 SimpleDateFormat으로 값 형태를 변환해보고, Timestamp를 이용해 형태를 변환시키는 등의 방법을 사용해보았지만 에러 내용만 간혹 바뀔 뿐 해결이 되지 않았다.

 

<!-- 노가다 1 -->
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
testVO.setTestDate( sdf.parse(sdf.format(new Date())) );

<!-- 노가다 2 -->
testVO.setTestDate( new Timestamp(System.currentTimeMillis()) );

<!-- + @@@ -->

 

그렇게 시간을 소모하다가 문득 생각을 전환해보았다.

 

Java가 아니라 DB에서 형변환을 하면 어떨까?

 

반응형

[해결 방법]

 

구글링을 통해 DB에서 형변환이 되는지 확인해보았다. 확인해보니 CAST, CONVERT를 사용하는 등의 형변환 기능이 있음을 알 수 있었다.

( https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_CAST_function.html )

 

그 중에서 PostgreSQL은 아주 간단한 방법을 제공하고 있었다.

 

<!-- 
Mapper 
-->
<insert id="test" parameterType="testVO">
INSERT INTO
    TEST(
    	TEST_ID
        , TEST_DATE
    )VALUES(
    	#{testId}
        , #{testDate}::timestamp
    )
</insert>

 

위와 같이 Mapper를 작성할 때, 형변환을 원하는 expression에 ::type 을 적어주면 해당 타입으로 형변환이 된다.

 

이를 통해서 Java.util.Date로 입력된 값이 DB에 timestamp형으로 형변환이 되었고, 코드가 정상 동작하는 것을 확인할 수 있었다!

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글