home
자바
home
🍋

독립 실행형 서블릿 애플리케이션

강의명
토비의 스프링부트
강의순서
3
과목
☕자바
수강상태
진행중

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
복사