설정 파일인 sqlMapConfig.xml의 DOCUMENT 선언부를 보면 sql-map-2.dtd이 위치한 URL을 확인할 수 있다.

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" 
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
  
<sqlMapConfig>
    <settings />
    ...
</sqlMapConfig>

 

그런데 DTD 파일이 있는 저장소에 연결이 되지 않아 파일을 찾을 수 없다. iBATIS 프로젝트가 Apache Software Foundation 프로젝트에 있다가 2010년 6월 16일에 Retired 되고 Google Code에서 MyBatis(http://www.mybatis.org/) 라는 이름으로 프로젝트가 진행되어 새로운 버전이 릴리즈 되고 있다. 아파치에서 구글로 옮긴 이유는 빠른 변화에 대응하기가 구글이 더 용이하기 때문에 그런거라고 하는데 Migration Steps when Switching from iBATIS toMyBatis 에서 자세한 내용을 확인할 수 있다.

 

 

일단 서버를 구동하다 iBATIS 관련 오류가 난다면 먼저 확인해 봐야할 부분이 바로 이곳이다. 설정파일과 쿼리파일을 로딩 때 DTD Validation 체크를 하는데 파일을 찾지 못해 오류가 발생하는 것이다.

 

SQL Map Config와 SQL Map의 헤더의 링크를 http://www.ibatis.com/dtd/ 에서 http://ibatis.apache.org/dtd/ 로 아래와 같이 수정해 주면 된다.

<!-- SQL Map Config -->
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
...
    
<!-- SQL Map -->
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
...

 

 

그런데 인터넷이 연결되지 않은 환경에서 iBATIS를 구동했을 때는 어떻게 되는걸까?!

java.net.UnknowHostException 위와 같은 오류가 발생한다. DOCTYPE을 제대로 정의하지 않아도 null 오류가 발생한다. 그래서 로컬에 파일을 다운로드 받아 개발 환경이나 배포 환경에 맞게 경로를 지정해 주면 된다. "sql-map-config-2.dtd", "sql-map-2.dtd" 이런식으로 경로를 쓴 후 dtd 파일을 /tomcat/bin (was가 tomcat일 때의 디렉토리 구조임.) 에 옮겨 넣으니 오류없이 서버가 잘 구동 되었다.

 

로컬에 DTD파일을 놓는건 확실한 해결방법이 아닌것 같아서 구글링하다가 issue.apache.org 에서 문제를 해결할 수 있었다. 질문 내용이 외부DTD가 로드되지 않았을 때 내부 DTD도 로드되지 않는다라는 내용이였다. 아래 달린 코멘트에서 Jeff Butler 라는 커미터가 2.1.7버전 이상을 사용하는지 확인해 보라는데 2.1.7이전 버전에서는 jar패키지에 DTD를 포함하지 않고 배포 되었던 것 같다.

 

실제로 운용중인 JAR 파일을 열어 확인해보니 DTD 파일이 없었다. 다른 프로젝트에서 사용하고 있는 iBATIS 2.3.4 버전에서는 다음 경로에서 확인할 수 있었다

버전을 바꿔서 인터넷이 끊어진 상태에서 서버를 재구동 하였더니 오류없이 구동되었다. DOCUMENT 선언부의 DTD URL을 엉뚱하게 변경해도 구동하는데 오류는 발생되지 않았다. JAR패키지 안의 DTD를 먼저 찾고 없을 경우 외부 URL을 통해 validation 체크를 하는 것이다.

 

오류 사항에 대처하는 방법에 대해 정리해보면 아래와 같다.

  1. DTD 경로가 ibatis.apache.org 로 되어있는지 확인.
  2. sql map config, sql map 파일의 문법이 맞는지 확인.
  3. 버전이 2.1.7 이하일 경우 iBATIS JAR 패키지 내에 DTD 파일이 존재하는지 확인

 

오랜 삽질의 끝.

'Dev Story > dev' 카테고리의 다른 글

Web Stress Tool  (0) 2013.02.20
[postgresql] extension dblink  (0) 2013.02.16
[os] 유닉스 리눅스 명령어  (0) 2013.01.23
[json] JSON Validator & Convert  (0) 2013.01.22
[extjs] Ext.MessageBox  (0) 2013.01.22


AND