티스토리 뷰

기타

Mybatis oracle procedure xmlType 처리

SonSeungWoo 2019. 2. 15. 17:15

Mybatis oracle proedure xmlType 처리

필자가 알기엔 oracle 11g부터인가 xmlType형식을 지원한다. 그리고 mybatis로 oracle procedure 함수를 호출해서 쿼리 대신 데이터를 받을 수 있다.
굳이 왜 이렇게 하는가....근데 그렇게 해야 할 일이 생겨서 삽질을 좀 많이 했다. 프로젝트는 spring-boot 2.1.2, Java 8, maven, intellij 기반으로 했다. 근데 여기서 또 하나 문제가 발생한다. 아래에 설명할 테지만 spring-boot를 사용하는데 어쩔 수 없이 배포를 war로 해야 했다. war 배포 설정은 여기에 아주 잘 나왔다. 참고하도록 하자. 참고로 intellij 프로젝트 생성시 packaging war바꿔주면 알아서 다 해준다. 편리하다.

mybatis 설정부분은 spring boot mybatis 연동 글을 참고하자.
일단 oracle xmlType을 처리하기 위해 라이브러리를 다운받자. 여기서 ojdbc7.jar, orai18n.jar, xdb6.jar 이 세개를 받고 따로 xmlparserv2-12.1.0.2.jar를 받자. 그리고 project basedir에 lib폴더를 추가해 아래와 같이 jar를 넣어주자.


그리고 maven pom.xml에 다음과 같이 설정을 해주자.

<repositories>
<repository>
<id>local-repository</id>
<name>local repository</name>
<url>file://${project.basedir}/lib</url>
</repository>
</repositories>
<dependency>
<groupId>com.custom</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
</dependency>

<dependency>
<groupId>com.custom</groupId>
<artifactId>xdb6</artifactId>
<version>12.1.0.2</version>
</dependency>

<dependency>
<groupId>com.custom</groupId>
<artifactId>xmlparserv2</artifactId>
<version>12.1.0.2</version>
</dependency>

<dependency>
<groupId>com.custom</groupId>
<artifactId>orai18n</artifactId>
<version>12.1.0.2</version>
</dependency>

디펜던시를 추가해주고 mvn install를 해주자.


mvn install:install-file -Dfile=lib/com/custom/orai18n.jar -DgroupId=com.custom -DartifactId=orai18n -Dversion=12.1.0.2 -Dpackaging=jar

mvn install:install-file -Dfile=lib/com/custom/ojdbc7.jar -DgroupId=com.custom -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar

mvn install:install-file -Dfile=lib/com/custom/xdb6.jar -DgroupId=com.custom -DartifactId=xdb6 -Dversion=12.1.0.2 -Dpackaging=jar

mvn install:install-file -Dfile=lib/com/custom/xmlparserv2-12.1.0.2.jar -DgroupId=com.custom -DartifactId=xmlparserv2 -Dversion=12.1.0.2 -Dpackaging=jar


이제 mapper.xml을 작성하자. procedure 작성은 아래와 같이 statementType를 CALLBLE로 하고 CALL 패기지 or 프로시저명을 입력 mode는 내가 보낼 파라미터이고

mode out은 return받을 결과값이다. 그리고 여기서 가장 중요한 oracle xmlType를 결과로 받기위해 jdbcType을 SQLXML로 해줬다.  jdbcType는 mybatis문서에 보면 나와있다. 더 자세한건 따로 찾아보자.

<mapper namespace="me.seungwoo.mapper.CityCodeMapper">
<resultMap id="cityMap" type="java.util.HashMap"/>

<select id="selectCityCode" statementType="CALLABLE" parameterType="java.util.HashMap">
{ CALL PKG_TEST.XML_SELECT(
#{serviceName, mode=IN, jdbcType=VARCHAR},
#{inputString, mode=IN, jdbcType=NCLOB},
#{result, mode=OUT, jdbcType=SQLXML, javaType=String, resultMap=cityMap},
#{xmlString, mode=OUT, jdbcType=SQLXML, javaType=String, resultMap=cityMap})
}
</select>

</mapper>

이제 모든걸 설정했으니 실행해보자 그럼 로컬에서는 아주 잘 된다. 그럼 서버에 war로 배포를 해보자. 필자는 개인pc에 tomcat를 설치해서 거기에 배포를 했다.

그런데 에러가 난다.....여기서 엄청난 삽질을 했다.


https://stackoverflow.com/questions/43944803/java-lang-securityexception-org-xml-sax-saxnotrecognizedexception-feature-htt .....

여기서 tomcat 설정을 따로 해줘야한다. 아래와 같이 catalina.properties에 설정을 추가해주자. 그럼아주 잘된다.


TOMCAT_HOME/conf/catalina.properties:


javax.xml.parsers.DocumentBuilderFactory = com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

javax.xml.transform.TransformerFactory = com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

javax.xml.parsers.SAXParserFactory = com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

javax.xml.datatype.DatatypeFactory = com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl


간단한 예제는 여기에 있다.


'기타' 카테고리의 다른 글

Spring REST Docs  (1) 2019.10.02
Apache Kafka  (0) 2019.06.28
maven multi 모듈  (0) 2019.01.26
Agile Practices - Scrum/Kanban  (0) 2018.04.23
TDD, BDD  (0) 2018.04.23
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함