dispatcherservlet은 servlet container인 application context를 생성자로 받았음
그걸 이용해서 dispatcher servlet은 bean을 다 훑어 보고 url mapping 정보를 살펴봄.
getMapping이나 requestMapping annotation 정보가 존재하면 이것은 web 요청을 처리할 수 있도록
만들어진 web controller구나 라고 인식을 하고 그 안에 요청 정보를 추출한다.
mapping 테이블을 만들어서 관리하고
이후에 웹요청이 들어오면 mapping 테이블을 확인하고 메서드를 연결해준다.
package com.example.tobyboot;
import com.example.tobyboot.toby.HelloController;
import com.example.tobyboot.toby.SimpleHelloService;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class TobybootApplication {
public static void main(String[] args) {
// spring container 만드는 작업
GenericWebApplicationContext applicationContext = new GenericWebApplicationContext();
// bean 등록
applicationContext.registerBean(HelloController.class);
applicationContext.registerBean(SimpleHelloService.class);
// 초기화 작업
applicationContext.refresh();
// servlet container를 코드로 실행하면서 servlet을 등록하는 작업
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("dispatcherServlet",
new DispatcherServlet(applicationContext)
).addMapping("/*");
});
// 톰캣 서블릿 컨테이너가 동작한다.
webServer.start();
System.out.println("Hello containerless Standalone Application");
}
}
servlet container를 생성하고 servlet 초기화 작업은 spring container 초기화 되는 과정에 일어나도록 코드를 수정할 예정
spring container 초기화 작업은 applicationcontext.refresh()에서 시작된다.
package com.example.tobyboot;
import com.example.tobyboot.toby.HelloController;
import com.example.tobyboot.toby.SimpleHelloService;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class TobybootApplication {
public static void main(String[] args) {
// spring container 만드는 작업
// 익명 클래스
GenericWebApplicationContext applicationContext = new GenericWebApplicationContext() {
@Override
protected void onRefresh() {
// 생략 하면 안됨.
super.onRefresh();
// 서블릿 컨테이너를 초기화하는 코드
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// servlet container를 코드로 실행하면서 servlet을 등록하는 작업
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("dispatcherServlet",
new DispatcherServlet(this)
).addMapping("/*");
});
// 톰캣 서블릿 컨테이너가 동작한다.
webServer.start();
}
};
// bean 등록
applicationContext.registerBean(HelloController.class);
applicationContext.registerBean(SimpleHelloService.class);
// 초기화 작업
applicationContext.refresh();
System.out.println("Hello containerless Standalone Application");
}
}
'강의 > 토비의 스프링부트' 카테고리의 다른 글
Bean의 생명주기 메소 (0) | 2023.02.21 |
---|---|
자바코드 구성 정보 사용 (0) | 2023.02.21 |
Dependency injection (0) | 2023.02.20 |
프론트 컨트롤러 // 스프링 컨테이너 (0) | 2023.02.20 |
dsf (0) | 2023.02.19 |