블로그 이미지
Max.

calendar

    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    

Notice

2012.08.29 15:49 개발관련

1) 방법


myBatis는 MapperScannerConfigurer 를 통해 interface 기반의 Mapper를 등록하여 매핑한다. MapperScannerConfigurer 의 스캐너 기능은 Spring의 ClassPathBeanDefinitionScanner를 확장한 것이다.  ClassPathBeanDefinitionScanner는 ClassPathScanningCandidateComponentProvider를 확장한 것이다.  ClassPathScanningCandidateComponentProvider는  resourcePattern라는 속성을 제공하고 있다. 이것의 기본값은 **/*.class 로 모든 클래스를 스캔하게 된다. 


보통 spring 의 스캐너 기능은 리소스에 대한 패턴을 이용해서 그 편리함이 높다.  그런데 구현확장하는 과정에서 resourcePattern를 더이상 찾아볼수 없게 된것이다.


MapperScannerConfigurer 의 inner class에 ClassPathBeanDefinitionScanner를 확장한 Scanner가 있는데 스캔을 실행하기 전에 setResourcePattern()를 이용해 적당한 값을 넣어주면 패턴을 이용한 스캔이 가능하게 된다.




2) 문제


MapperScannerConfigurer는 basePackage 속성값으로 스캔을 하는데 Mapper 후보군으로 해당 basePackage 이하의 모든 Interface 구현체를 올려놓고 등록해 버린다. 그때 호출자와 매핑을 시도하는데 문제가 발생한다. 예를들어 AccountDao 를 테스트 하면 xxx.AccountDao.save를 잘 호출한다. 그런데 이를 이용한 Service를 구현하고 호출하면 AccountService.save를 호출해 버린다. 


물론 basePackage 를 특별한 패키지로 구분하여 관리하면 이같은 문제는 없다. 스캔 대상을 달리 정하면 되니까 (xxx.mapper 패키지에만 매퍼파일을 넣으시요... 같이) 하지만 도메인 기준으로 패키지명 분류로 하면 위와 같은 방법은 곤란하다. 다른 방법이 있긴 하다 basePackage 가 String형이긴 하지만, 콤마(,)로 여러개를 등록할수있다. 해서 xxx.A.dao, xxx.B.dao, xxx.C.dao 이렇게 등록해도 된다. 다만, 설정파일이 지저분해지고, 도메인 추가할때마다 넣어주는걸 기억할수 있다면 그리 나쁜 방법은 아니다.


Spring의 compoent-scan 처럼 include와 exclude 기능이 있다면 좋겠지만 현재는 없고 문제를 해결해야 한다면...

저작자 표시
신고
posted by Max.

티스토리 툴바