골드만삭스
1k
2015-08-28 09:05:40
12
10328

Spring + mybatis 다중 DB 설정 어렵내여.



Spring : 4.2
mybatis : 3.3.0
mybatis-spring 1.2.3


디비를 MySql,mariadb쓰려고 설정중인데요

각 디비에 대한 DataSource를 두개 만들었고
데이터 소스에 대한 SqlSessionFactory, SqlSessionTemplate도 각각 선언했습니다.
DAO를 사용하는 것이 아니라 mapper를 사용합니다.  testService에서 mapper를 콜해서 쓰는
방식입니다.

아래는 설정내용입니다.

   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource"   ref="dataSource" />
    <!-- <property name="configLocation"  value="classpath:mybatis/mybatis-config.xml"/>-->
    <property name="mapperLocations"  value="classpath:mybatis/mappers/mcu/*.xml" />    
   </bean>
 <bean id="sqlSessionFactory_ka" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource"   ref="dataSource_ka" />
    <!-- <property name="configLocation"  value="classpath:mybatis/mybatis-config.xml"/>-->
    <property name="mapperLocations"  value="classpath:mybatis/mappers/proxy/*.xml" />   
     
   </bean>
 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
  <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
  <qualifier value=""/>
  
 </bean>
 <bean id="sqlSession_ka" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
  <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory_ka" />
  
 </bean>
 
 <bean id="Mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.okjsp.1.mapper.testMapper" />
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
     
    </bean>
   
    <bean id="Mapper_ka" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.okjsp.2.mapper.subscriberMapper" />
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_ka" />
     
    </bean>


에러내용은 다음과 같습니다.


    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.okjsp.1.mapper.testMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}



몇일째 삽질중입니다.  도움 부탁드립니다.

감사합니다.

2
  • 답변 12

  • OKIHOUSE
    355
    2015-08-28 10:14:22

    스프링에는 DI 주입하는 Annotaion 이 @Autowired 만 있는건 아닙니다.

    @Resource 라는것도 있어요

    두개의 차이점은 아래와 같습니다. 위에서 아래로 차례대로 찾습니다.

    @Autowired

    • Matches by Type

    • Restricts by Qualifiers

    • Matches by Name


    @Resource

    • Matches by Name

    • Matches by Type


    NoSuchBeanDefinitionException: No qualifying bean of type


    위 에러의 경우는 애매한 주입방식을 사용하셨으니 어떤걸 가져다가 쓸지 모른다는 내용입니다.


    먼저 @Autowired, @Resource 어떤걸 사용할지 정하시고 

    어떤방식으로 DI를 주입할 것인가에 대한 고민이 필요하실 것 같습니다


    Type 이나 Name 을 확실히 정하시고 주입을 해보세요~


    하나 추가드리면 @Autowired 단독으로 사용을 많이 하시는데

    @Qualifier 라는걸 추가해서 명시할 수도 있습니다~


    개인적인 추측으로는 @Autowired 로 주입을 하셨을거라 생각이 되구요

    XML Mapper 에서 설정한 id 로 안쓰셧을것 같고 그러니까

    @Autowired 는 type 으로 먼저 찾는데 2개의 mapper type 이 존재하므로 

    어떤 걸 가져다 쓸지 몰라 헤맨 경우 같네요??

  • OKIHOUSE
    355
    2015-08-28 10:38:21

    글을 자세히 안읽어 보고 답변을 달은꼴이 됐군요 ㅎㅎ 죄송합니다.


    Exception 을 자세히 보니 com.okjsp.1.mapper.testMapper 이 부분이 Spring 에서 


    주입된 상태가 맞으신가요? 

  • choijinwook
    110
    2015-08-28 10:51:25

    동일한 Type에 id가 다른 bean이 선언되어있으니 @Qualifier로 정확히 Autowired하고자 하는 Bean ID를 명시해주시면 될 듯 합니다...^^;;

  • 골드만삭스
    1k
    2015-08-28 11:27:38
    spring에서
    @Autowired testMapper testMappers; 로 주입된거 맞습니다.

    일단 다른 설정 부분 확인중입니다. ㅠ.ㅠ

    감사합니다.


  • choijinwook
    110
    2015-08-28 13:47:42

    @Autowired @Qualifier("Mapper") testMapper testMapper; 하시면 될 듯 합니다.

     

    또는 


    @Autowired @Qualifier("Mapper_ka") subscriberMapper subscriberMapper;


    하시거나요..>^^;;

  • 골드만삭스
    1k
    2015-08-28 14:31:13

    //choijinwook

    적용했는데도 에러는 동일하내여. ㅠ.ㅠ

    No qualifying bean of type [com.okjsp.1.mapper.testMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency



  • choijinwook
    110
    2015-08-31 13:33:29

    골드만삭스


    근데요 ...제가 뭔가 태클을 걸려고 하는건 아닌데요;;;; 클래스 이름을 대문자로 시작하는 걸로 바꾸는건 어떠세요? 사실 저 부분이 문제가 될꺼다 딱 이런건 아닌데, 문제가 될 소지를 충분히 가지고는 있거든요...예를 들어 Java는 흔히 Accesor와 Mutator라고 불리는 것 우리는 흔히 Getter와 Setter라고 부르는데 이 Method를 만들 때 Reference 명을 가지고 Getter와 Setter 메소드를 만들게 됩니다. 이렇게 메소드 명을 만들어야 하다보니 통일성을 주기 위하여 Java에서 권장하는 명명 규칙이 있거든요. 


    그런데 가끔....아주 가끔 이 명명규칙이 맞지 않거나 위배되면 Get과 Set를 하지 못하게 되는 경우가 있습니다. DI도 결국은 Reflect라는 기술을 쓰는데 자바의 클래스 명명 규칙을 따르지 않는다면 Qualifier를 해도 문제가될 수지는 있습니다.... 클래스 명을 대문자로 시작 하도록 바꿔보시길 바라구요....


    소스라도 공유받아서 연구를 해보고 싶은데....ㅎㅎㅎ;;; 가능할까요?




  • 골드만삭스
    1k
    2015-08-31 13:42:25

    //choijinwook

    ㅎㅎ 맞습니다. ^^

    이메일 주소를 남겨주세요. ^^

  • choijinwook
    110
    2015-08-31 13:48:55

    골드만삭스


    choijinwook84+okky@지메일.컴 입니다.


    이거 비밀댓글을 하는 방법이 없나보네요;;;;

  • 골드만삭스
    1k
    2015-09-01 10:06:41

    햐... 이거 문제가 먼지 원. ㅠ.ㅠ

  • 골드만삭스
    1k
    2015-09-01 16:47:56

    이 문제 해결 완료 하였습니다.

    정리해서 올리도록 하겠습니다.



  • 골드만삭스
    1k
    2015-09-06 00:10:41

    http://okky.kr/article/292353 여기에 정리하여 올려 드렸습니다.


    감사합니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.