SpringBoot 서블릿을 추가하기 위해 ServletRegistrationBean을 등록하여 테스트 진행
프로젝트 기본 구조는 아래와 같이 잡았고 my패키지에 있는 컨트롤러(MyController) 및 MVC 설정(MyWebConfig)을 분리하고자 한다.
어플리케이션 메인에서는 기본 서블릿에 포함되지 않게 MyController, MyWebConfig를 컴포넌트 스캔에서 제외했다.
그리고 ServletRegistrationBean을 등록하여 MyWebConfig를 context에 등록하고 기타 서블릿 설정을 한다. 참고로 addUrlMappings에서 "/my/**" 와 같이 "*"는 동작하지 않아 MyController의 모든 URL을 등록해줬다.
@SpringBootApplication
@ComponentScan(
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {MyWebConfig.class, MyController.class})
}
)
public class MultiServletApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MultiServletApplication.class);
application.run(args);
}
@Bean
public ServletRegistrationBean myServlet() {
AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
webApplicationContext.register(MyWebConfig.class); // MyWebConfig 설정
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setApplicationContext(webApplicationContext);
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet);
servletRegistrationBean.addUrlMappings("/my/", "/my/test1");
servletRegistrationBean.setLoadOnStartup(1);
servletRegistrationBean.setEnabled(true);
servletRegistrationBean.setName("my-servlet");
return servletRegistrationBean;
}
}
위와 같이 ServletRegistrationBean만 등록하고 실행해도 서블릿 관련 로그가 찍힌다.
MyWebConfig의 내용은 아래와 같이 my패키지에 있는 Controller만 컴포넌트 스캔에 포함한다
@Configuration
@EnableWebMvc
@ComponentScan(
basePackages = "com.example.demo.my",
useDefaultFilters = false,
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}
)
public class MyWebConfig {
// 추가 서블릿 MVC 설정
@Bean
public MyWebBean myWebBean(){
return new MyWebBean();
}
}
MyWebBean은 빈 설정 테스트를 위해 만든 껍데기 클래스일 뿐이다
public class MyWebBean {
}
동일하게 AppConfig, WebConfig 파일도 아래와 같고, AppBean, WebBean 모두 MyWebBean처럼 껍데기 클래스이다.
@Configuration
public class AppConfig {
// 기본 RootContext 관련 설정
@Bean
public AppBean appBean(){
return new AppBean();
}
}
@Configuration
@EnableWebMvc
public class WebConfig {
// 기본 MVC 설정
@Bean
public WebBean webBean(){
return new WebBean();
}
}
빈설정 확인을 위해 각 Controller의 PostConstruct에서 콘솔 출력을 한다
콘솔 출력 결과는 아래와 같다
기본 Root WebApplicationContext가 초기화 된 후 AppController에서는 "my-servlet"의 myWebBean을 참조 못하고, "my-servlet"에서는 모든 빈 참조가 가능하다.
Root WebApplicationContext가 초기화 될떄 Controller까지 스캔해서 모두 등록하는거 같은데 RootContext와 기본 DispatcherServlet이 분리가 안되는 느낌이다. 예상했던 결과와는 조금 다르다. 어떻게 분리하는지는 나중에 확인 예정..그리고 테스트는 해봤지만 이렇게 분리해서 쓰는게 SpringBoot 사상에 맞는건지도 좀 모르겠다.
'개발 > SpringBoot' 카테고리의 다른 글
SpringBoot EhCache JavaConfig설정 (0) | 2022.01.11 |
---|---|
addViewControllers()로 불필요 Controller 로직 제거 (0) | 2022.01.10 |
SpringBoot 설정에 따른 동적 빈 생성 (0) | 2021.12.09 |
SpringBoot application.yml 리스트, 객체로 불러오기(@ConfigurationProperties) (0) | 2021.12.09 |
SpringBoot 외장Tomcat과 SpringBootServletInitializer (1) | 2021.12.09 |
댓글