본문 바로가기

Java

Jrebel Ibatis Plugin을 만들어 봅시다.. -3-

Ibatis의 resultMap 클래스로 사용되는 Domain 클래스들에 대해서
리로드시 캐싱에서 지우는 것으로 만들어봤고..이제는 쿼리와 resultMap 클래스가 정의 되어 있는
xml 파일들을 모니터링하여 xml 파일 변경시 xml 파일을 리로드 하도록 해야 합니다.

다만, ibatis에서 최소 read 단위가 sqlMapConfig.xml 이어서...
이 xml이 커지면 로딩하는데 시간이 걸리게 됩니다.

더 작은 단위로 모니터링하여 로드되도록 하고 싶은데
아직 거기까지는 못 하였습니다.

일단,, 최소 ibatis에서 buildSqlMapClient 메서드를 실행 할 때 로딩하는 xml 파일을 모니터링 할 수 있도록
어딘가에 저장해두도록 해야 합니다.

그 역할을 하는 파일을
SqlMapFilesManager라고 이름을 지어봤습니다.

이 클래스를 호출하여 모니터링 대상 xml을 등록하는 메서드는 최초 ibatis에서 sql을 로딩하는 단계에 호출해주면 됩니다.
이 예제에서는 SqlMapXmlCache 클래스의 Init 메서드가 호출 될 때 xml 파일들을 등록해주면 될 것 입니다.

이 부분은 역시 바이트 코드를 직접 write하여 작성해야 합니다.

앞서 IbatisPlugin 클래스의 preinit 메서드에서


SqlMapXmlCache 클래스의 바이트코드를 직접 핸들링하기 위해 IntegrationFactory에 등록을 해주었습니다.

이제, ClassInfoCBP 클래스처럼 SqlMapXmlCacheCBP 클래스의 init() 메서드가 호출 될 때
(초기화를 위해 처음 한번만 호출 될 것 입니다. ) sqlMap.xml 파일들을 SqlMapFilesManager에 등록하고
SqlMapXmlCache.getSqlMapClient(); 메서드가 호출될때 마다  xml 파일의 변경 여부를 체크하여
변경시 다시
SqlMapClientBuilder.buildSqlMapClient(Reader reader) 메서드를
실행 SqlMapClient를 다시 만들도록 하는 것이 컨셉입니다.

SqlMapXmlCacheCBP 클래스를 대략 구현해 볼게요..



init 메서드가 실행 되기 전에 SqlMapXmlFielsManager의 registerXmlResource($1, $2) 메서드를 실행하고
SqlMapXmlCache 클래스에 checkAndReload라는 메서드를 새로 만들어 넣습니다.
그리고 SqlMapXmlCache.getInstance() 메서드가 실행 될 때 마다 chceckAndReload 메서드를 실행하도록
되어 있습니다.

여기서, $1, $2는 init 메서드가 받은 파라메터입니다.
(http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html 참조..)

그다음에 SqlMapFilesManager 클래스의 registerXmlResource 메서드와 checkAndReload 메서드를 구현하여
xml파일을 등록하고, checkAndReload 메서드에서 xml파일의 최종 변경 시간을 확인하여 변경이 되었을 시
SqlMapClientBuilder 클래스의 buildSqlMapClient 메서드를 실행하도록 하면 될 것 입니다.

이를 위해서 xml 파일의 경로 URL와 이름등이 필요하겠죠...


굳이, 막 널리 알려지지 않은... Jrebel이라는 국한된 라이브러리의 플러그인을 이렇게 정리하는 이유는..
저도 우연한 기회에 이 플러그인을 만들어보게 되었고
그 과정에서 javassist 도 알게 되고.. 그리고 플러그인을 통해 기존 사용되고 있는 프레임워크에
자신들이 만든 라이브러리를 통합시키는 이 아이디어가 참 좋은 것 같아서 입니다..

소스 구현보다도 개념이나 이런 부분에 많은 도움을 받은 것 같습니다..