서블릿 컨테이너 띄우고 서블릿 주입하기

Sol's·2023년 5월 23일
0

스프링부트 설정 지우기

@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 에서

  1. 서블릿의 이름을 "hello"
  2. 이미 만들어져있는 어댑터 클래스인 HttpServelet을 상속하고 Service함수를 오버라이딩 했습니다.
    - Service에는 클라이언트의 요청과 서버가 반납해야할 response를 갖고 있습니다.
    ```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");

개발자의 실수를 방지하기 위해 이미 스프링부트에서 구현해 놓은

느낀점

직접 구현하다보니 이런걸 프로젝트 만들때마다 설정한다고하면...
너무 힘들것 같다라는 생각이 듭니다.

profile
배우고, 생각하고, 행동해라

0개의 댓글