Containerless 개발 준비
컨테이너 설치와 배포 등의 작업을 하지 않고 서블릿 컨테이너를 동작시키는 방법을 코드로 구현해본다.
스프링 부트가 사용하는 것으로 보이는 다음 두 라인을 제거하고 빈 main() 메소드만 남긴다.
@SpringBootApplication
SpringApplication.run(HellobootApplication.class, args);
Java
복사
서블릿 컨테이너 띄우기
스프링 부트 프로젝트를 만들 때 web 모듈을 선택하면 아래와 같은 내장형 톰캣 라이브러리가 추가된다.
내장형 톰캣의 초기화 작업과 간편한 설정을 지원하도록 스프링부트가 제공하는 TomcatServletWebServerFactory를 사용하면 톰캣 웹 서버(서블릿 컨테이너)를 실행하는 코드를 만들 수 있다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer();
webServer.start();
Java
복사
실습
8080포트로 요청 보내고 404 에러를 리턴 받음 (Httpie)
서블릿 등록
코드에서 서블릿을 등록하려면 ServletContext가 필요하다. ServletContext를 전달해서 서블릿 등록과 같은 초기화 작업을 할 때는 ServletContextInitializer를 구현한 오브젝트를 ServletWebServerFactory의 getWebServer() 메소드에 전달한다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer(new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
}
});
webServer.start();
//람다식 전환 (ServletContextInitializer는 @FunctionalInterface이므로 람다식 전환 가능)
WebServer webServer = serverFactory.getWebServer(servletContext -> {
});
webServer.start();
Java
복사
서블릿은 HttpServlet 클래스를 상속해서 필요한 메소드를 오버라이딩 하는 방식으로 만들 수 있다.
서블릿을 등록할 때는 서블릿 이름과 서블릿 오브젝트를 이용한다. 서블릿 등록 정보에는 매핑할 URL 정보를 지정해야 한다.
servletContext.addServlet("hello", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}).addMapping("/hello");
Java
복사
서블릿에서는 HttpServletRequest를 이용해서 요청 정보를 가져오고, HttpServletResponse를 이용해서 응답을 만드는 작업을 수행한다.
3가지 요소(상태 코드, 헤더, 바디)를 이용해서 웹 요청을 생성한다.
resp.setStatus(HttpStatus.OK.value());
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
resp.getWriter().println("Hello Servlet");
Java
복사
Content-Type ⇒ HttpHeaders.CONTENT_TYPE
text/plain ⇒ MediaType.TEXT_PLAIN_VALUE
직접 타이핑하면 오타의 위험이 있어서 스프링에서 등록해놓은 Enum을 활용하면 좋다!
상태코드가 OK인 경우엔 생략이 가능하다.
“Content-Type” 헤더를 지정해서 바디의 형식을 지정해야 한다.
ContentType을 헤더를 지정할 때는 setContentType() 메소드를 이용한다.
resp.setContentType(MediaType.TEXT_PLAIN_VALUE);
Java
복사
서블릿 요청 처리
* 웹 클라이언트로부터 전달 받은 요청 정보를 서블릿 기능을 작성할 때 활용할 수 있다.
* 대표적으로 URL 등으로 전달된 파라미터 값을 추출해서 사용하는 방법이 있다.
* HttpServletRequest에서 name 파라미터의 값을 가져올 때는 getParameter() 메소드를 이용한다.
String name = req.getParameter("name");
Java
복사