서블릿 컨테이너 뒤에서 스프링 컨테이너는 빈이 작업 처리를 할 수 있게 호출함.
다른 메인 메소드 하나만 살행해지 않도 나머지 캄퍼넌스도 작동 가능
public class HellobootApplication {
public static void main(String[] args) {
System.out.println("Hello Containerless StandAlone Server");
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory(); // 톰캣 서브릿 웹서버를 만들어준다.
// 만약 다른 서브렛 컨테이너 를 사용하고 싶다면 JettyServletWebServerFactory()
WebServer webServer = serverFactory.getWebServer();
webServer.start();
}
}
웹이서 요청이 오면 컨테이너에서 어떤 서브렛을 사용해야 할지 매핑을 해준다
public static void main(String[] args) {
System.out.println("Hello Containerless StandAlone Server");
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory(); // Embeded 톰캣 서브릿 웹서버를 호출한.
// 만약 다른 서브렛 컨테이너 를 사용하고 싶다면 JettyServletWebServerFactory()
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("Hello", new HttpServlet() { // 서브랫 추가해주기
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(200); // set status
resp.setHeader("Content-Type", "text/plain"); // set header
resp.getWriter().print("Hello Servlet"); // set Body
}
}).addMapping("/hello"); //요청이 들어오면 매핑을 해준다.
});
webServer.start();
}
여러 요청을 처리하는데 반복적으로 등장하게 되는 공통 작업을 하나의 오브젝트에서 일괄적으로 처리하게 만드는 방식을 프론트 컨트롤러 패턴(Front Controller Pattern)이라고 합니다.
가령 서블릿 컨테이너의 서블릿이 모든 요청에 대해 처리했다면, Front Controller을 거쳐 서블릿을 매핑 및 바인딩을 할 수 있습니다.
Front Controller가 HTTP 요청을 처리할 핸드러를 결정하고 연동한는 작업을 Mapping이라 하며, 핸들러에게 웹 정보를 추출하여 전달하는 작업을 Binding이라고 합니다. Front Controller가 요청을 분석하여 처리할 요청을 구분하여 이를 처리할 핸들러에게 넘겨줍니다. 핸들러가 처리하고 돌려준 리턴 값을 해석하여 웹 요청을 생성합니다.
서브릿 컨테이너 완성