프론트 컨트롤러

Sol's·2023년 5월 23일
0

프론트 컨트롤러 패턴

공통로직을 FrontController(서블릿 역할)로 처리하고 하나의 서블릿으로 Cilent와 소통
요청을 FrontController에서 전부 받기때문에
맨 앞에서 공통로직(인증, 중복코드, 보안)등을 처리하고
맨 뒤에서 공통로직을 다듬어 반환합니다.

스프링에서는 DispatcherServlet이 FrontController로 구현되어 있습니다.


구현해보기

 public static void main(String[] args) {
        ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
        WebServer webServer = serverFactory.getWebServer(servletContext -> {
            servletContext.addServlet("frontcontroller", new HttpServlet() {
                @Override
                protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    // 인증, 보안, 다국어, 공통기능 처리
                    // url 요청 처리
                    if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) {
                        String name = req.getParameter("name");

                        resp.setStatus(HttpStatus.OK.value()); // 상태코드
                        resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE); // 타입
                        resp.getWriter().print("Hello Servlet" + name); // 바디
                    } else if (req.getRequestURI().equals("/user")) {
                        // 로직처리

                    } else {
                        resp.setStatus(HttpStatus.NOT_FOUND.value());
                    }
                }
            }).addMapping("/*"); // 모든 요청을 다 받는다.
        });
        webServer.start();
    }

FrontController 패턴으로 모든요청을 받아 공통로직을 처리하였습니다.
.addMapping("/*")으로 모든 요청을 받아 내부에서 URI에 따라 분배 할 수 있습니다.

"/hello"엔드포인트만 처리하였지만, 클래스를 분리하여 더 만들 수 있습니다.

컨트롤러 사용해보기

이제 컨트롤러를 구현해서 사용해 보겠습니다.

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

서블릿을 주입할때 HelloController를 생성하고 그 안에서 직접 사용하였습니다.

	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 {
                    // 인증, 보안, 다국어, 공통기능 처리
                    // url 요청 처리
                    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().print(ret); // 바디
                    } else if (req.getRequestURI().equals("/user")) {
                        // 로직처리

                    } else {
                        resp.setStatus(HttpStatus.NOT_FOUND.value());
                    }
                }
            }).addMapping("/*"); // 모든 요청을 다 받는다.
        });
        webServer.start();
    }

역시 동작이 잘 되고있습니다!

느낀점

역시나 스프링 부트의 위대함을 느꼈습니다...

profile
배우고, 생각하고, 행동해라

0개의 댓글