스탠드언론 프로젝트 : 서블릿 컨테이너 자동으로 띄워줌
2. 빈 서블릿 컨테이너 띄우기
- 스프링부트 사용하지 않고 톰캣 띄우기
- 톰캣은 대표적인 서블릿
- Tomcat Sublet Web Sever Factory
스프링 부트가 Tomcat Sublet 컨테이너를 내장해서 프로그램 코드로 쉽게 사용할 수 있게 만들어주는 도우미 클래스
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer();
- .getWebServer(); 진짜 웹 서버 우리 Sublet 컨테이너를 만드는 생성 함수
- 톰캣 말고 다른걸 사용하고 싶을 경우 TomcatServletWebServerFactory 앞에 Tomcat 부분을 Jetty 등 사용하고 싶은걸로 적으면 동일하게 사용 가능
- Tomcat Sublet Container 동작
- 톰캣이 잘 떴는지 확인하는 방법
localhost 8080 시 404 뜸
3. 서블릿 등록
Sublet 컨테이너가 웹 클라이언트로부터 요청을 받으면 여러개의 Sublet 중 어떤 Sublet에게 맡기면 될지 결정하는 작업
- 서블릿 등록
servletContext.addServlet("hello", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ... }).addMapping("/*");
- .addServlet - 서블릿 등록
- .addMapping("/ 경로") - 서블릿 만든 후 해당 경로로 들어올 경우 해당 서블리소가 맵핑해줘야함
- 웹 응답 3가지 필요
1)상태라인에서 상태 코드
200 이 외 값을 설정하지 않는 다면 생략 가능
스프링에 enum 사용시 더 편리
2) 헤더
resp.setHeader("Content-Type","text/plain");
3)바디부분
resp.getWriter().println("Hello" + name);
- 프론트 컨트롤러
서블릿에 공통되는 부분들을 앞에 프론트컨트롤러라고 이름을 붙인 오브젝트에서 공통적인 작업함
1)프론트 컨트롤러로 변경
servletContext.addServlet("frontController", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 인증, 보안, 다국어, 공통 기능
// Sublet 컨테이너의 맵핑 기능을 front Controller가 담당
// 3개 요청 method, path url, header body
if(req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())){
String name = req.getParameter("name");
resp.setStatus(HttpStatus.OK.value());
resp.setContentType(MediaType.TEXT_PLAIN_VALUE);
resp.getWriter().println("hello" + name);
}
else if(req.getRequestURI().equals("/user")){
//
}
else{
//404
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
//frontController로 반을 경우 *으로 모두 받아야함
}).addMapping("/*"); // 해당 경로로 들어올 경우 해당 서블릿과 맵핑 시킨다
helloController 에서 @GetMapping으로 했으므로 post로 /hello로 요청을 받으면 오류 뜸
-HelloController 사용해서 프론트 컨트롤러
WebServer webServer = serverFactory.getWebServer(servletContext -> {
//프론트 컨트롤러 분리 작업
HelloController helloController = new HelloController();
servletContext.addServlet("frontController", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 인증, 보안, 다국어, 공통 기능
// Sublet 컨테이너의 맵핑 기능을 front Controller가 담당
// 3개 요청 method, path url, header body
if(req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())){
String name = req.getParameter("name");
//bean 오브젝트 가져오기
HelloController helloController = applicationContext.getBean(HelloController.class);
//프론트 컨트롤러 분리 작업
//추출된 파라미터를 메소드를 호출하는데서 사용하고
// ret으로 결과값 리턴
String ret = helloController.hello(name);
resp.setStatus(HttpStatus.OK.value());
resp.setContentType(MediaType.TEXT_PLAIN_VALUE);
resp.getWriter().println(ret);
}
else{
//404
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
//frontController로 반을 경우 *으로 모두 받아야함
}).addMapping("/*"); // 해당 경로로 들어올 경우 해당 서블릿과 맵핑 시킨다
여기까지 스프링 부트는 사용하지 않음