[Oracle] SQLException: 부적합한 열 유형: 1111 jdbcType Config에 공통적용하기

쥬라기·2025년 1월 19일

oracle

목록 보기
4/4

들어가며

오라클 db에 nullable 필드에 null 값을 전달하려고 할때, mybatis에서 jdbcType을 지정해주라는 오류가 계속해서 발생하였다. 이에 해결방법을 정리해보려고 한다.

문제 상황

mybatis와 oracle을 사용하고 있는 쿼리에서,
insert나 update를 할때, 특정 파라미터 값이 null로 들어오면
SQLException: 부적합한 열 유형: 1111
이 에러를 발생시키는 문제가 계속해서 발생했다.

위 에러는 mysql 쿼리를 사용할때에는 발생하지 않았고,
oracle로 마이그레이션한 뒤부터 발생했는데,
그 이유는
MyBatis는 sql에 파라미터를 바인딩할 때, 값이 null인 경우 "JDBCTYPE.OTHER"을 기본적으로 사용한다.
다만, 일부 데이터베이스 특히 오라클의 경우, jdbcType.OTHER을 지원하지 않으기 때문이다. 따라서 이를 적절한 VARCHAR, INTEGER와 같은 타입으로 지정해주는 작업이 필요하다.

나의 경우엔
처음에는 계속해서 디버깅하며 어느 필드에서 문제가 됐는지 확인하고

INSERT INTO USER (USER_ID, USER_NAME, USER_EMAIL)
VALUES (#{userId}, #{userName}, #{userEmail, jdbcType=INTEGER});

위와 같이 "jdbcType=VARCHAR(타입)"을 일일이 적어주도록 했었다.

다만, 위와 같이 한다면,,, 모든 쿼리에서 null로 전달되는 파라미터(필드)가 있다면 모두 jdbcType을 적어줘야하고,, 너무나 비효율적이라고 생각했다.

따라서, config 파일에서 전역으로 관리할 수 있는 방법을 찾아서 적용했다.

해결 방법

원래는 mybatis-config.xml 파일에 설정하는 방법이 있지만,
나는 따로 mybatis-config.xml 파일이 없어서,
applicationContext.xml파일에 sqlSessionFactoryMaster 생성부분에 추가해줬다.

<bean id="sqlSessionFactoryMaster" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSourceMaster"/>
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="jdbcTypeForNull" value="NULL"/>
            </bean>
        </property>
    </bean>

위와 같이 bean 생성부분에 property를 하나 더 생성해주고, jdbcTypeForNull 설정 추가 !

이는 MyBatis에서 null 값이 SQL에 바인딩될 때, JDBC 타입을 명시하지 않고 NULL로만 처리하겠다는 의미이다.

즉, 기존 jdbcType=VARCHAR 와 같이 직접 쿼리에 타입지정을 해준 경우와 다르게 타입을 명시하지는 않고, 걍 null값이 들어가도록 하는 것...! 그럼 자동으로 null로 들어간다고 한다.
지금까지는 정상적으로 작동하는데, 특정상황에서 ORA-01722(부적합한숫자) 오류가 발생할 수 있다고 하니,,,,! 그때에는 그 쿼리에 대해서만 따로 타입을 지정해주거나 다시 해결방법을 알아봐야 할거같다.

타입핸들러도 사용해보고, jdbcType 일일이 지정하는 방법도 사용해봤는데,
내 상황에서는 이게 제일 편리했어서 이 방법으로 해결했다 !

profile
기록하고 분석하는 개발자

0개의 댓글