본문 바로가기
개발/SpringBoot

SpringBoot Multi Servlet 추가 MVC설정 분리 테스트

by 궁즉변 변즉통 통즉구 2022. 1. 4.
반응형

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 사상에 맞는건지도 좀 모르겠다.

 

반응형

댓글