개발자의뇌

mybatis 에서 procedure call 호출 본문

개발/DB

mybatis 에서 procedure call 호출

devbrain 2020. 2. 14. 14:14

마이바티스 sql mapper에서 procedure를 호출하기 위해 구글링하여 나온 아래 코드를 넣어 실행하였다.

<update id="testProc" statementType="CALLABLE" parameterType="HashMap">
        {  call sp_test_procedure(
                #{p1},
                #{p2,jdbcType=VARCHAR},
                #{p3},
                #{p4,jdbcType=VARCHAR},
                #{p5,jdbcType=VARCHAR}
            )
        }
</update>

 

하지만 서버에서는 call 문법이 틀렸다는 메시지가 나온다.

 

당시 마이바티스 실행 환경은

 

jdk8, tomcat8.5, mybatis-3.4.6.jar, mariadb-java-client-2.2.3.jar 이렇게 되어 있었다.

 

얼마 더 삽질하다가 구글링을 해보니 mysql-connector 를 사용하면 된다고 한다.

 

하여 기존 db들은 mariadb-client를 계속 사용하고

 

call 하는 부분만 따로 db 연결을 분리하여 설정 부분에서 mysql-connector 를 사용하도록 하였다.

 

한데 mysql-connector-java-8.0.19.jar 버전을 사용하니

 

드라이버로 사용중인 com.mysql.jdbc.Driver 가 deprecated 되었다고 나온다.

 

관련 문서를 확인해 보니 com.mysql.cj.jdbc.Driver 를 사용해야 한다고 한다.

 

하여 드라이버명을 맞춰주니 이번엔 db 연결이 안된다고 에러가 나온다.

 

또 찾아보니 jdbc url에 serverTimezone=UTC 파라메터를 넣어야 연결된다고 한다.

 

해당 파라메터를 연결하니 db 연결 성공, 그리고 procedure 호출도 성공하였다.

 

db 프로시저 하나 호출하는데 생각보다 삽질을 많이 하게 되어 정리해 놓는다.

 

 

요약하자면

 

1. 마이바티스 + mariadb-client 조합은 sql mapper에서 프로시저 call 호출방법 못찾음

 

2. 마이바티스 + mysql-connector (v8.0.19) 조합은 프로시저 call 호출이 가능함!

 

3. 하지만 mysql-connector 일정 버전 이상에서는 드라이버 이름이 변경됨

   이전: com.mysql.jdbc.Driver -> 변경: com.mysql.cj.jdbc.Driver

 

4. 그리고 또 하나 변경된 것은 jdbc url에 serverTimezone=UTC 파라메터를 넣어야 db 연결이 됨

 

5. 위 설정들을 모두 잘 하였다면 call 호출 가능함

 

 

아래는 db 연결 config xml 일부

<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" 
 value="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;allowMultiQueries=true" />

 

이전처럼 드라이버명을 com.mysql.jdbc.Driver를 사용하려면 mysql-connector 버전을 5버전대로 사용하면 될 것 같다.

 

최근 구글링 하면서 자주 느끼는 건데 문제를 검색하면 원인설명은 없고 해결만 있다보니 

 

복붙하여 테스트 하는 시간만 증가하고, 효율은 많이 떨어지는 것 같다.

 

mariadb-client 에서 프로시저 호출 기능이 없을것 같진 않은데 

 

마이바티스가 mariadb-client 의 call 호출 명령을 지원하지 않는건지 찾아볼 필요가 있다.

 

Comments