본문 바로가기

-전자정부 프레임워크

전자정부 프레임워크 스케줄러 연동 시 주의 사항 (Layer의 종류, ContextLoaderListener, DispatcherServlet)

반응형

얼마 전에 스프링 스케줄러를 연동하는데 @Component를 이용하여 자동으로 스캐닝을 시키려고 했는데 자동으로 감지가 안 되는 것이었다. 이유가 root-context 와 servlet-context에서의 component-scan을 할 때의 어디를 include 하고 exclude를 하는지를 잘 결정해야 @Component 가 잘 DI 되는지가 결정되었다. 일반적으로 Spring STS에서는

<context-param>을 root-context.xml이라고 사용하였고, <servlet> 은 servlet-context.xml이라고 적어서 프로그래밍을 했었다. 전자정부를 쓰면서 component-scan에서 include-filter, exclude-filter를 처음 사용했기 때문에 약간의 혼선이 있었기에 여기에 정리를 해볼까 한다.

 

전자정부 프레임워크에서는

 

 

이런식으로 사용하고, springmvc/egov-servlet.xml 에는 기본적으로 정부에서 사용하는 것이

 

 

이런 식으로 추가되어있었다. 컨트롤러는 include를 하였고 Service와 Repository는 exclude한걸 볼 수 있다. 아마 이유는 web에서는 url을 이용해 컨트롤러에 요청하여 제어 역행을 하기 때문에 Web에서도 @Controller를 쓸 수 있게 include를 하였고, Service와 Repository Java에서도 이용하기 때문에 context-*.xml에다가 include를 시킨 것 같다.

 

그래서 실수한 부분이 servlet에다가 컨트롤러든 서비스든 레파짓토리등 다 include를 해서 @component된 스케줄러 java파일은 빈이 DI를 못했다 ㅠ…. 아마 스케줄러는 디스패처서블릿에서 하는 부분이 아닌 스프링에서 하는 부분이라 DI를 못 읽어온 것 같다.

 

결론적으로 쉽게 말하자면 springmvc/egox-servlet.xml은 웹에 설정하는 것 즉 이곳에 설정을 하면 자바 안에서 실행되는 건 DI 할 수가 없고, context-*.xml은 전체 계층 구조에서 최상단에서 이용하는 것이기 때문에 자바도 실행이 된다.

 

왜 저런식으로 include하고 exclude를 하는지 전자정부 Q&A에 보면 이렇게 답변이 되어있었다.


정리하자면 Business Layer와 Persistence Layer 부분은 ContextLoaderListener에 등록(스캔)하고.. Presentation Layer는 DispatcherServlet에 등록(스캔)하도록 가이드 되고 있습니다.
이유는 화면처리부분이 가이드의 이미지와 같이 여러 개 있을 수 있고.. 상위 @Service, @Repository를 공유할 수 있도록 하기 위해서입니다.
실제 계층 구조를 가지고 있기 때문에 하위에서는 상위 Bean들을 참조할 수 있습니다. (반대는 불가능)
따라서.. ContextLoaderListener에는 @Service, @Repository만 include시키고..
하위 DispatcherServlet에는 @Controller만 include시키는 방식입니다.

 

그래서 조금 더 Layer와 ContextLoaderListener와 DispatcherServlet 에 대해 알아보았는데

 

레이어는 3가지 종류가 있다

 

화면 레이어, 데이터 레이어, 비즈니스 레이어가 있다.

 

화면 레이어 (Presentation Layer)는 Jsp 나 Sevlet

데이터 레이어 (Data Layer / Persistence Layer) 는 DAO 나 ORM(ibatis)

비즈니스 레이어(Business Layer)는 Service, EJB(엔터프라이즈 자바 빈)

 

으로 구분 된다.

 

ContextLoaderListener (Root Application Context) 는

전자정부 프레임워크에선 Context-*xml

Spring STS 에선 root-context.xml

로 사용하였다.

  • 특징
  1. 전체 계층 구조 최상단에 위치
  2. 서로 다른 Context에서 공유할 것을 등록 후 사용가능
  3. Servlet에 등록된 bean 이용이 불가하다.

 

Web Application Context (Servlet Context) 는

전자정부 프레임워크에는 SpringMVC/*.xml

Spring STS에선 appServlet/servlet-context.xml

로 사용하였다.

  • 특징
  1. 서블릿에서만 이용되는 Context
  2. 타 Servlet과 공유하기 위한 Bean은 RAC(Root Application Context)에 등록 후 사용
  3. Dispatcher Servlet은 자신만의 Context를 생성, 초기화 하고, 동시에 RAC를 부모 Context 사용

 

레이어와 DispatcherServlet, ContextLoaderListener 까지 생각을 해보자면 비즈니스 레이어에 @Component 를 지정해줘야 되기 때문에 DispatcherServlet 인 springmvc/egox-servlet.xml에다가 등록을 해 봤자 화면 레이어 이기 때문에 DI가 안됐다는 것이 더 확실해졌다.

반응형

'-전자정부 프레임워크' 카테고리의 다른 글

전자정부 프레임워크 다중 DB 연동  (0) 2016.01.13