Spring MVC에서 사용하는 ApplicationContext와 WebApplicationContext

보통 스프링 설정 파일이 최소한 두 개이상 있을 겁니다. xxx-servlet.xml 과 나머지로 나눌 수 있습니다. 그중에서 xxx-servlet.xml은 DispatcherServlet이 WebApplicationContext를 만들 때 사용하고, 나머지는  ContextLoaderListener 또는 ContextLoaderServlet이 일반적인 ApplicationContext를 만들 때 사용합니다.

이게 끝이 아닙니다. WebApplicationContext는 바로 이 ApplicationContext를 상속받아서 여러 서블릿들이 공통으로 사용하는 빈들을 사용할 수 있게 되는 겁니다. 따라서 만들어지는 순서도 중요한데, Listener가 아니라 ContextLoaderServlet을 사용했을 때는 load 머시기 설정 값에 1을 줘서 DispatcherServlet보다 먼저 만들게 해야 합니다. 그래서 WebApplicationContext를 만들 때 해당 ApplicationContext를 상속받아서 그 안에 있는 빈들을 사용할 수 있게 되겠죠.

이런 구조로 설계한 건, DispatcherServlet이 하나의 웹 애플리케이션에서 여러 개일 수 있기 때문입니다. 여러 개의 DispatcherServlet에서 공통으로 사용할 빈들을 상위에 있는 ApplicationContext에 선언해두고 공유할 수 있게 하는 거죠.

사용자 삽입 이미지
자. 그럼 여기서 문제

만약에 스프링 2.5 컨트롤러를 사용하고 있고 이 컨트롤러에 특정 @Aspect를 적용하고 싶을 때 해당 AOP 관련 설정(aop:autoproxy 머시기 엘리먼트 + @Aspect 빈 등록)은 xxx-servlet.xml과 applicationContext.xml 둘 중 어디에 둬야 할까요?

xxx-servlet.xml에는 컨트롤러 설정, 뷰 리졸버, 핸들러 맵퍼 등의 설정이 되어 있고, applicationContext.xml에는 서비스, DAO 등의 설정이 들어있습니다.
 
ㄱ. xxx-servlet.xml
ㄴ. applicationContext.xml
ㄷ. 어디에 두든지 상관없다.
ㄹ. 스프링 2.5 컨트롤러에는 Spring AOP를 사용할 수 없다.

정답은?? ㄱ 입니다. 왜냐면, applicationContext.xml을 사용해서 ApplicationContext를 만드는 순간에는 컨트롤러들이 미쳐 빈으로 등록되어 있지도 않기 때문에, 프록시를 만들 대상이 없습니다. 다시 말해, AOP 빈은 있지만, 이 AOP를 적용할 대상이 되는 빈이 없는겁니다. 따라서 컨트롤러들과 관련된 설정이 있는 xxx-servlet.xml에 해당 설정을 위치해야 합니다.

8 thoughts on “Spring MVC에서 사용하는 ApplicationContext와 WebApplicationContext”

  1. 순전히 제 생각인데요, ㄷ 같은데요. 이유는 ㄹ은 아닌것 같고, 처음 스프링 MVC 이용해서 간단한 Web Application 만들적에 xxx-servlet.xml 만 사용해서도 만들었거든요.
    하지만 비즈니스 로직은 ApplicationContext.xml 에 주로 두므로 ㄴ?

    저 혹시 AOP 에 관한 포스팅도 있나요? 개념은 20% 정도 이해 한것 같구요. 어떻게 구현하는지는 영 모르겠네요.

    좋은 하루 되세요.

    1. 하핫 오래전에 낸 문제라 저도 잊었는데 이제야 푸시는 분이 등장하셨네요!! 정말 감사합니다.

      하지만, 정답은 본문 아래 빈공간에 적어두었습니다. 마우스로 드래그 해보세요.

      AOP 구현 방법에 대해서는 이따 살짝 올릴꼐요.

  2. AOP 엄청 좋은 거였네요.

    어제, SpringSource University (http://www.springsource.com/training/freeonline) 에서 Developing Aspects with AOP (http://www.springsource.com/training/freeonline/download?sid=246444) by Jeff Brown 라는 강의를 봤는데요, AOP 기초 개념을 아주 쉽게 설명해 주는군요. 오늘 한번 써볼려고 합니다.

    또 다른 공짜 강의가 있는데요 OSGi, Spring-dm, Spring-dm Server 에 관한 거구요, 제 많은 의문점들을 풀어주더군요. OSGi Training: OSGi and Modular Applications ( http://s3.springsource.com/MRKT/training/online-screencast-final.mp4 ) by Joris Kuipers

    Spring source tool suite 에서 스프링 디엠 서버 쓰기가 참 쉽군요. 그냥 ‘드래그 인 드랍’ 하면 디플로이가 되니깐 말이죠. 그런데 greenpages 샘플에서 웹사이트가 접근이 않되는군요. 리소스를 몾찾겠다고 그러네요, 뭐가 문젠가 시간좀 보내야 겠네요.

    좋은 하루 되세요.

  3. 좋은 글 감사합니다. 회사 프로젝트 개발 업무 중 aop 설정을 해야 하는 일이 있는데 며칠째 막히던것이 이 글을 보고 해결했네요. ApplicationContext와 WebApplicationContext 가 저렇게 구분되는군요. 정말 감사합니다.ㅠ

Leave a Reply

Your email address will not be published. Required fields are marked *