@SpringBootApplication
public class HellobootApplication {
public static void main(String[] args) {
SpringApplication.run(HellobootApplication.class, args);
}
}
여기서 @SpringBootApplication
를 지루고
메인 메소드 안에 SpringApplication.run(HellobootApplication.class, args);
를 지워 스프링 설정을 지워보겠습니다.
우선 복잡한것 빼고
빈 서블릿 컨테이너
부터 띄워보겠습니다
public class HellobootApplication {
public static void main(String[] args) {
// 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
// 따라서 webServer 가 서블릿 컨테이너 입니다.
WebServer webServer = serverFactory.getWebServer();
webServer.start();
}
}
서블릿 팩토리에서 WebServer(서블릿 컨테이너)를 만들어 직접 구동을시켰습니다.
스프링부트 없이 작동이 잘 되고있습니다.
그럼이제 서블릿 컨테이너에 서블릿을 등록해 보겠습니다.
public class HellobootApplication {
public static void main(String[] args) {
// 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
// 따라서 webServer 가 서블릿 컨테이너 입니다.
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("hello", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.setStatus(HttpStatus.OK.value()); // 상태코드
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE); // 타입
resp.getWriter().print("Hello Servlet" + name); // 바디
}
}).addMapping("/hello");
});
webServer.start();
}
}
getWebServer
메소드를 통해 서블릿을 주입 할수 있습니다.
WebServer webServer = serverFactory.getWebServer( ~~)
서블릿을 등록하기위해 2가지 설정을 해주었습니다.
servletContext.addServlet
에서
"hello"
HttpServelet
을 상속하고 Service
함수를 오버라이딩 했습니다.```java
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(200); // 상태코드
resp.setHeader("Content-Type", "text/plain"); // 타입
resp.getWriter().print("Hello Servlet"); // 바디
}
}).addMapping("/hello");
```
상태코드, 타입, 바디를 설정하고 .addMapping("/hello")
을 통해 URL
을 설정했습니다.클라이언트에서 요청을 받을때 parameter로 받기위해 String name = req.getParameter("name");
를 사용했습니다.
스프링부트의 톰캣 없이 직접 구현한 서블릿을 통해 서버가 작동하는것을 확인 했습니다!
설정한 그대로 작동이 잘 됩니다!
servletContext.addServlet("hello", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(HttpStatus.OK.value()); // 상태코드
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE); // 타입
resp.getWriter().print("Hello Servlet"); // 바디
}
}).addMapping("/hello");
개발자의 실수를 방지하기 위해 이미 스프링부트에서 구현해 놓은
직접 구현하다보니 이런걸 프로젝트 만들때마다 설정한다고하면...
너무 힘들것 같다라는 생각이 듭니다.