모든 요청을 다 받아 공통적인 기능을 처리하고, 요청 정보를 이용해서 여러 종류의 작업을 맵핑해주는 기반이 되는 코드
그러나 맵핑이 끝나고 나서 로직을 처리하는 부분은 이 안에 코드로 들어있음
get 메서emdp “/hello”로 들어오는 요청을 처리하는 로직은 굉장히 간단함
이 부분은 굉장히 복잡한 데이터베이스 처리도하고 api 호출도 하고 많은 알고리즘을 사용해서 결과를 만들어내는 복잡한 프로그램이라서 생각을 하고 분리하는 작업을 진행. 모든 로직 코드를 프론트 컨트롤러 안에 다 집어 넣을 수 없기 때문
hello라는 로직을 처리하는 코드를 만들어야하는데 어디에 둘 것인가 → HelloController
public class HelloController {
public String hello(String name) {
return "Hello " + name;
}
}
위의 HelloController를 사용하도록 코드를 변경
public class HellobootApplication {
public static void main(String[] args) {
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
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 {
// 인증, 보안, 다국어, 공통 기능
if(req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) {
String name = req.getParameter("name");
String ret = helloController.hello(name);
resp.setStatus(HttpStatus.OK.value());
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
resp.getWriter().println(ret);
}
else if (req.getRequestURI().equals("/user")) {
//
}
else {
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
}).addMapping("/*");
}); // 웹서버 생성
webServer.start(); // Tomcat Servelet Container 동작
}
}
HelloController helloController = new HelloController()
HelloController는 매 요청마다 새로운 인스턴스를 만들 필요 없음(한번 만들어서 계속 재사용해도 문제 X)
String ret = helloController.hello(name)
name을 추출하는 것은 프론트 컨트롤러가 수행 → HttpServletRequest를 전달할 수 없기 때문
프론트 컨트롤러에서 요구되는 공통적인 코드들이 들어갈 수 있는 자리
resp.getWriter().println(ret)
리턴값은 웹 응답의 body를 작성하는 데 활용
실제 요청을 받아 처리하는 코드를 동작시키는 동안에 수행되는 두가지 중요한 작업