Programming/Java

Spring context is loaded twice.

Figo Kim 2016. 4. 28. 21:19
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

난 속된말로 허접 스프링 유저(?)다. 지금 프로젝트에 스프링 MVC 프레임워크를 사용하고 있기는 하지만,


MVC 관련해서는 예전에 스트럿츠 MVC 관련 책과, 스프링 3.X 버전대 책 (아마 이 책은 상당히 빨리 훌터 가는 정도로 읽었던거 같다..) 그리고 토비의 스프링 이 책은 읽다 말았고,,

마지막 읽어본게 영문서인데 약200여 페이지 정도되는 스프링 개념 책이 전부이다..


언뜻 보면 많이 본것처럼 보이지만, 많이 부족하다고 늘 느끼고,,, 여타 스프링 정보를 공유하는 고수들의 글을 보면, 분명 나는 허접 스프링 유저라고 절실히 느낀다.


그래서일까? 무식하면 용감하다가 아니라,, 무식하면 서버가 고생한다는 말을 오늘 대번 느꼈다.


현재 프로젝트에 Spring Schedule을 적용하려고 하다보니, 이상하게 cron schedule로 설정된 메소드가 두번씩 실행이 되는게 아닌가?


사실 예전부터 application이 두번씩 deploy된다는것은 알고 있었으나 작업하는데 큰 문제가 없다보니, 그러려니 했다.


그런데 스케쥴러를 적용하려 하다보니, 이게 직접적인 문제가 되어 버린 것이다.


아.... 이게 두번씩 실행이 되어 버리는게 아닌가?  ㅠㅠ


혹시 tomcat의 autodeploy설정 때문인가? 하고 그것도 조정해봤지만 소용이 없었다.


그러다가 구글링을 통해서 찾은 내용...은 바로 RTFM이었던 것이다.


http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-servlet


Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.


이러하단다~~!!




쉽게 말해서 servlet-name으로 dispatcher가 등록이 되어 있으면, dispatcher-servlet.xml을 자동으로 찾아서 로딩을 한다. 


그런 다음에 contextConfigLocation에 등록된 설정파일들의 설정을 다시 한번 로딩을 하게 된다.



문제의 dispatcher-servlet.xml 파일을 보면  context:component-scan과 mvc:annotation-driven이 언급되어 있다.


즉. web.xml에서 dispatcher로 한번 로드한 후, 이후에 ContextLoaderListener로 다시 한번 로딩을 해줘버리는 문제가 발생했던 거였다. 


이거에 대한 해결책은 mvc처리를 위한 dispatcher설정을 따로 두는 방법 또는 contextConfigLocation에 빈 값을 두는 두가지 방법이 있다. (이 부분도 자의적 판단이라..ㅠㅠ)





난 기왕 하는거 mvc 설정부분을 따로 분리하는 쪽을 택했다

그래서 mvc-dispatcher-servlet.xml 파일을 아래와 같이 따로 만들었고, 기존의 dispatcher-servlet.xml을 application-config.xml로 변경했다. 물론 기존 dispatcher-servlet.xml 파일에서 context 및 mvc 부분을 제거했다.




    

    
        
            
                
                    
                        text/html;charset=UTF-8
                    
                
            
            
        
    




web.xml 파일은 아래와 같이 변경되었다.




    Euroscope Web Application
    
        mvc-dispatcher
        org.springframework.web.servlet.DispatcherServlet
        1
    
    
        mvc-dispatcher
        /
    

    
        contextConfigLocation
        
            /WEB-INF/application-config.xml,
            /WEB-INF/spring-security.xml
        
    

    
        org.springframework.web.context.ContextLoaderListener
    

    
    
        org.springframework.security.web.session.HttpSessionEventPublisher
    

    
        encodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
    

    
        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
    

    
        encodingFilter
        /*
    

    
        springSecurityFilterChain
        /*
    


    
        index
    

    
        300
    

    
        spring.profiles.active
        live
    

    
        DB Connection
        
            jdbc/mysql
        
        
            javax.sql.DataSource
        
        
            Container
        
    





위와 같이 설정 후, 서버를 재시작했고, 중복 deploy가 발생하지 않았다...


오늘의 교훈은 ,,,무식하면 서버가 고생한다..



'Programming > Java' 카테고리의 다른 글

Lombok plugin의 편리성  (0) 2015.07.08
mybatis sql 구문 재활용  (0) 2015.05.19
STS (Spring Tool Suites) with Gradle  (0) 2015.01.22
Spring 4.0 + myBatis + javaconfig.  (2) 2014.10.24
Spring 4.0 + Java Config - web.xml 없애기...  (0) 2014.10.24