민서네집

STS 에서 myBatis mapper xml 저장할때 느려짐 본문

Java

STS 에서 myBatis mapper xml 저장할때 느려짐

브라이언7 2013. 5. 15. 22:47

어제 저녁부터 갑자기 STS 에서 myBatis mapper xml 파일을 저장하려고 할 때 STS가 먹통이 되면서 1분 넘게 멈추었다가 저장이 되었다.


공교롭게도 집에 있는 STS도 어제 저녁부터 마찬가지였다.


( 회사에서는 STS 32비트 3.2.0 RELEASE 버전을 사용 중이고, 집에서는 STS 64비트 3.2.0 RELEASE 버전을 사용 중이다. )


그래서 STS에 문제가 있을 것이라고는 생각하지 못했는데, STS를 다시 다운로드 받아서 workspace는 그대로 두고 STS 실행 파일만 다르게 해서 실행해 보았더니 잘 되었다.


myBatis mapper xml 파일의 DOCTYPE 선언에서 http://~~~.dtd 을 실제로 인터넷에서 찾느라고 그렇게 먹통이 되는 것 같다. 정상적인 경우라면 이 dtd 파일을 인터넷에서 찾지 않고, 바로 저장된다. 실제 인터넷에는 이 경로에 파일이 존재하지 않는다. 이 dtd 파일은 mybatis의 jar 파일 안에 존재하고, myBatis 라이브러리는 jar 파일 안의 dtd 파일을 찾도록 내부적으로 코딩되어 있다고 한다.


<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


그런데 무슨 이유인지 이 dtd 파일을 STS가 인터넷으로 찾으면서 먹통이 되는 것 같다.


dtd 파일이 문제가 있는지 어떻게 아냐하면, 위의 저 DOCTYPE을 주석 처리하고 나서 수정 후 저장하면 금방 저장되기 때문이다. 그런데 DOCTYPE을 없애면 서버 시작 시 에러가 나면서 웹어플리케이션이 아예 시작하지 못한다.


dtd 파일의 validation을 안하기 위해 sts의 모든 validation 옵션을 disable로 했지만, mapper xml 파일을 저장 시 계속해서 먹통이었다.


<!DOCTYPE mapper SYSTEM "{DTD파일의 절대경로}"> 를 주면 웹어플리케이션도 정상 실행되고, 저장도 금방 된다.


그런데 DTD 파일의 절대 경로를 박아넣는 것은 올바른 해결책은 아닐 것이다.


참고적으로 아래 웹페이지를 보면


http://mybatis-user.963551.n3.nabble.com/How-to-skip-DTD-verification-when-www-mybatis-org-is-down-td4026165.html


절대경로로 주지 않고, src 디렉토리에 dtd 파일을 위치시키는 방법도 있다고 한다. 

☞ src 디렉터리에 dtd 파일을 넣을 필요가 없다. 실제 실행할 때 참조하지 않는다.


내가 해보니 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "WEB-INF/dtd/mybatis-3-mapper.dtd">

SYSTEM 이 아니라 PUBLIC 으로 한 경우는 "WEB-INF/dtd/mybatis-3-mapper.dtd" 안에 어떤 문자열을 넣어도 정상적으로 잘 작동했다.


어쨌든 해결책은 STS를 다시 다운로드 받던가, 아니면 전에 받아놓은 압축파일을 풀어서 실행 환경을 바꾸면 된다.

☞ 이유는 잘 모르겠지만 STS를 다시 설치하고 나서 하루 정도 지나자 다시 mybatis mapper xml 파일을 저장할 때 매우 느려지는 현상이 재발하였다. 해결책은 밑 부분을 참조할것.


예전 것과 새로 설치한 STS를 파일 비교 툴로 비교해 보았더니 예전 STS 실행 환경이 훨씬 파일이 많아진 것을 알 수 있다.


필요없는 파일이 많아지면서 STS가 오동작을 일으켜서 인터넷으로 찾지 않아야 되는 DTD파일을 http 가 붙은 URL 형식이면 무조건 인터넷으로 찾게 되면서 이런 현상이 발생하게 된 것 같다.


이 문제 외에도 SVN 으로 mapper 파일을 synchronize 할 때도 먹통 현상이 발생했다.


나는 subclipse를 사용하고 있었는데, subversive 플러그인으로 바꿔봐도 마찬가지 현상이 발생했다.


나중에는 java 파일을 하나 수정해서 저장할 때도 저장 시간이 오래 걸리는 기이한 현상이 발생했다. 그래서 결국은 STS를 새로 설치하게 되었다.



아래 URL에 설명한 대로 이클립스에서 dtd 파일을 찾는 위치를 직접 지정해 주는 방법도 있었는데, (Preference - XML - XML Catalog) 나의 경우에는 dtd 파일을 지정해도 마찬가지 현상이 계속되었다.


http://www.myhowto.org/software-development/29-validating-xml-documents-in-eclipse-using-dtd/


STS를 다시 설치하고 나서 하루 밖에 지나지 않았는데, MyBatis mapper XML 파일을 저장 시 느려지는 현상이 다시 발생했다. 그래서 DOCTYPE 태그 안의 "http://mybatis.org/dtd/mybatis-3-mapper.dtd" 를 지우고, "WEB-INF/dtd/mybatis-3-mapper.dtd" 로 넣었다. 사실 아무 문자열을 넣어도 실행하는데 문제는 없는데, 이클립스에서 dtd 파일을 찾을 수 없다고 경고가 나온다. 이런 경우 이클립스의 Preference - XML - XML Catalog에 들어가서 dtd 파일의 위치를 지정해 주면 된다.


※ dtd 파일은 mybatis-3.2.2.jar 파일의 압축을 풀면 org\apache\ibatis\builder\xml 안에 들어있다.

※ 내 경우는 압축을 풀어서 dtd 파일을 WEB-INF 밑에 dtd 폴더를 만들어서 여기에 넣고, 이클립스의 Preferences - XML Catalog 에서 Add... 버튼을 누르고, Workspace... 버튼 선택, {프로젝트명}\WebContent\WEB-INF\dtd 폴더 밑에 mybatis-3-mapper.dtd 파일을 지정해 주었다.


<!-- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -->


<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "WEB-INF/dtd/mybatis-3-mapper.dtd">





위에서 mybatis-3-mapper.dtd 파일을 압축을 풀어서 위치를 정해 주었는데, 그러지 말고, jar 파일 안의 dtd 파일의 위치를 정해줘도 된다.


Location 에 다음과 같이 주면 된다.


jar:file:/C:/workspace/{프로젝트명}/WebContent/WEB-INF/lib/mybatis-3.2.2.jar!/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd


이렇게 지정해 주고, DOCTYPE을 원래대로 하면 저장 시 2초 정도 걸린다. ☞ 이것도 많이 개선된 것이다.


그런데 DOCTYPE 안의 "http://mybatis.org/dtd/mybatis-3-mapper.dtd" 을 http 가 안 들어간 다른 문자열, 예를 들면 "WEB-INF/dtd/mybatis-3-mapper.dtd" 이런 식으로 수정하면 저장이 바로 된다.


정리해 보면,

DOCTYPE 이 PUBLIC 으로 된 경우 아무 문자열이나 지정해도 실행은 잘 되었다. DOCTYPE 이 SYSTEM 인 경우는 DTD 파일이 있는 절대 경로를 지정해야 되고, 경로가 틀리면 org.apache.ibatis.builder.BuilderException 이 발생하면서 웹어플리케이션이 실행되지 않는다. 


STS(Spring Tool Suite) 에서 - 아마도 보통 이클립스(eclipse)에서도 마찬가지라고 생각되어지는데, 이상하게 myBatis mapper xml 파일을 저장할 때, 혹은 SVN에서 이 파일을 synchronize 할 때 먹통이 되면서 무지하게 시간이 오래 걸리는 현상이 발생하면, 가장 간단한 해결책은


<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis.org/dtd/mybatis-3-mapper.dtd">


이렇게 mybatis.org/dtd/mybatis-3-mapper.dtd 앞에 http:// 를 없애버리는 것이다.


DOCTYPE 이 PUBLIC 인 경우 dtd 파일의 위치를 지정한 문자열은 아무 것이나 써도 실행은 잘 된다.


이클립스에서 xml 파일을 validation 할때 dtd 파일을 찾지 못하면 warning 이 발생하는데, mybatis-3.2.2.jar 파일의 압축을 풀어서 dtd 파일을 찾아서 이클립스의 Preference - XML - XML Catalog 에서 Add... 버튼을 눌러서 지정해 줘도 되지만, 압축을 풀지 않고, jar 파일 안의 dtd 파일의 경로를 지정해 주는 방법도 있다. - 위에서 설명한 대로.


이렇게 하면 eclipse에서 validation 도 잘 되서 myBatis mapper xml 에서 warning 도 생기지 않고, 저장도 금방 된다.


그런데 한가지 의문이 생겼다. 이클립스에서는 myBatis mapper xml 파일을 validation 할 때 dtd 파일을 어디서 찾는 것일까? Preference - XML - XML Catalog 에서 지정 안 한 기본 상태에서...


아마도 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

에 지정한 대로 http://mybatis.org/dtd/mybatis-3-mapper.dtd 을 찾을 것이다. 

그런데 왜 이 경로에 파일이 없는 것일까?


다시 한번 웹에서 접속해 보았다.

dtd 파일이 Download가 되는 것이다.

아마도 이 모든 happening 은 mybatis.org 도메인의 주소가 바뀌면서 인터넷 접속이 안되었던것인지 아니면 서버가 잠시(?)  - 며칠동안? 다운되면서 발생한 일인가 보다.


인생이 일장춘몽이라는 생각이... 갑자기 든다. 허무하다. 허허...


'Java' 카테고리의 다른 글

Best Useful Eclipse Plugins  (0) 2013.06.13
how to pretty print xml from Java  (0) 2013.05.25
process map 관련 오픈소스  (0) 2013.04.19
[eclipse plugin] OMA DM Simulator  (0) 2013.03.30
[eclipse] debugging tip  (0) 2013.03.29
Comments