2015년 1월 26일 월요일

스프링 xml 설정을 자바코드로 바꿀때 주의사항

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
            <property name="cacheManager">
                <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
                    <property name="configLocation" value="classpath:/kr/co/callmix/conf/cache/ehcache.xml"/>
                </bean>
            </property>
        </bean>
        <bean id="annotationCacheOperationSource" class="org.springframework.cache.annotation.AnnotationCacheOperationSource" />
        <bean id="cacheInterceptor" class="org.springframework.cache.interceptor.CacheInterceptor">
            <property name="cacheOperationSources" ref="annotationCacheOperationSource" />
            <property name="cacheManager" ref="cacheManager"/>
        </bean>
        <bean id="cacheAdvisor" class="org.springframework.cache.interceptor.BeanFactoryCacheOperationSourceAdvisor">
            <property name="cacheOperationSource" ref="annotationCacheOperationSource" />
            <property name="advice" ref="cacheInterceptor" />
        </bean>


이런 코드가 있었다.

자바코드로 다음과 같이 변경했다.

        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("/kr/co/callmix/conf/cache/ehcache.xml"));
     
        EhCacheCacheManager cacheManager = new EhCacheCacheManager();
        cacheManager.setCacheManager(ehCacheManagerFactoryBean.getObject());

     
        AnnotationCacheOperationSource cacheOperationSource = new org.springframework.cache.annotation.AnnotationCacheOperationSource();
     
        CacheInterceptor cacheInterceptor = new CacheInterceptor();
        cacheInterceptor.setCacheOperationSources(cacheOperationSource);
        cacheInterceptor.setCacheManager(cacheManager);
     
        BeanFactoryCacheOperationSourceAdvisor cacheAdvisor = new BeanFactoryCacheOperationSourceAdvisor();
        cacheAdvisor.setCacheOperationSource(cacheOperationSource);
        cacheAdvisor.setAdvice(cacheInterceptor);

그런데 오류가 난다. 이래저래 바꿔봐도 오류가 났었다.
깊이 파보진 않았지만, 전체적으로 대중이 없어보였다.

단지 짐작으로 xml로 생성해주던 빈들을 자바코드로는 생성하지 않고,
전부 하나의 코드로 우겨넣어서 그런것 같았다.

기존에 생성했던 빈들을 다른 곳에서도 사용할수 있을거라 생각한것이다.
애초에 스프링에서 지원하는 클래스로 생성하는 것들이니 어찌보면 당연한걸지도 모른다.

그래서 다음과 같이 바꿔봤다.

@Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
     
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("/kr/co/callmix/conf/cache/ehcache.xml"));
     
        return ehCacheManagerFactoryBean;
    }
 
    @Bean
    public CacheManager cacheManager(){
        return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
    }
 
    @Bean
    public AnnotationCacheOperationSource cacheOperationSource(){
        return new org.springframework.cache.annotation.AnnotationCacheOperationSource();
    }
 
    @Bean
    public CacheInterceptor cacheInterceptor(){
     
        CacheInterceptor cacheInterceptor = new CacheInterceptor();
        cacheInterceptor.setCacheOperationSources(cacheOperationSource());
        cacheInterceptor.setCacheManager(cacheManager());
     
        return cacheInterceptor;
    }
 
    @Bean
    public BeanFactoryCacheOperationSourceAdvisor cacheAdvisor(){
     
        BeanFactoryCacheOperationSourceAdvisor cacheAdvisor = new BeanFactoryCacheOperationSourceAdvisor();
        cacheAdvisor.setCacheOperationSource(cacheOperationSource());
        cacheAdvisor.setAdvice(cacheInterceptor());
     
        return cacheAdvisor;
    }

왠걸...작동이 된다.

정확한 원인은 파악하지 못했지만, 짐작한게 맞는것 같다.
xml설정을 자바로 바꿀댄 최대한 쪼개주자.
그게 유지보수도 좋고 오류도 없는것 같다.

댓글 없음:

댓글 쓰기