1. SpringFramework기반 프로젝트 중 우연치 않게 발견한 내용입니다.

공통 기능을 jar로 배포하고 확장기능만 개발하는 형태로 되어 있는 프로젝트를 운영서버에 배포를 했으나 Mapper Interface BindingExceptin이 발생하고 해당 Interface가 not Known 으로 나오는 현상이 발생한겁니다.

 

해당 프로젝트를 개발자 eclipse에서 실행하면 아무 이상없이 정상적으로 실행되는데, 운영서버에 배포만 하면 동일한 오류가 발생하는 것입니다.

 

결론은 개발자 한명이 해당 mapper Interface package를 생성하고 이곳에 Mybatis query xml을 위치시킨것입니다.

해당 package는 jar에서 사용하는 동일한 package이고 권장하지 않는 사용법이었습니다.

이를 바로잡는다고 해당 패키지 밑에 있는 xml은 WE-INF/sqlmap/ 이하로 옮기는 migration 시킨것입니다.

그러면서 정상 package는 삭제하지 않은것입니다.

 

xml 에 설정된 component-scan 에의해 해당 패키지를 scan한것입니다.

 

여기서 왜 eclipse에서는 정상작동했는데, 운영서버에서는 오류를 냈느냐는 것입니다.

차이는 class파일 loading순서에 따른 것이었습니다.

 

eclipse는 class loading 순서를 임의로 조정할수 있지만 실제 운영환경에서는 was에서 지정하는 순서에 의해 Loading된것입니다.

즉, 운영환경 WAS 기반하에서는 jar 파일에 있는 class보다 WEB-INF/classes 이하에 위치한 class파일을 우선시 하는데 비해

eclipse는 Project 설정에서 Java Build Path ==> Order and Export 탭에서 이를 자유롭게 조정할수 있는 것입니다.

 

추가 확인 및 연구사항

 

1. 좀더 세밀하게 접근하면 이후부터는 ClassLoader를 이해해야 합니다.

이부분에 대해서는 별도 구글링을 통해 알아보면 도움이 될듯 합니다.

 

2. 그리고 또하나 패키지만 선언해놓고 class 파일을 만들지 않은 경우에 eclipse가 이를 어떻게 처리하는지 확인해 봐야할 듯합니다.

  운영서버 war로 export 하게 되면 빈 패키지도 classes 이하에 그대로 생성되기 때문에 ClassLoader가 이를 로딩해버립니다.

 

Spring component-scan도 이 class loader에 의한 것이라 여겨지기에 비슷하게 작동한듯 합니다.

(이부분 조금더 정확하게 확인 필요)