프론트 컨트롤러

모든 요청을 다 받아 공통적인 기능을 처리하고, 요청 정보를 이용해서 여러 종류의 작업을 맵핑해주는 기반이 되는 코드

그러나 맵핑이 끝나고 나서 로직을 처리하는 부분은 이 안에 코드로 들어있음

get 메서emdp “/hello”로 들어오는 요청을 처리하는 로직은 굉장히 간단함

이 부분은 굉장히 복잡한 데이터베이스 처리도하고 api 호출도 하고 많은 알고리즘을 사용해서 결과를 만들어내는 복잡한 프로그램이라서 생각을 하고 분리하는 작업을 진행. 모든 로직 코드를 프론트 컨트롤러 안에 다 집어 넣을 수 없기 때문

Hello 로직 처리

hello라는 로직을 처리하는 코드를 만들어야하는데 어디에 둘 것인가 → HelloController

public class HelloController {
    public String hello(String name) {
        return "Hello " + name;
    }
}

HelloController를 활용하는 FrontController 작성

위의 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 동작
	}
}

image.png

Mapping과 Binding

실제 요청을 받아 처리하는 코드를 동작시키는 동안에 수행되는 두가지 중요한 작업

Mapping