본문 바로가기
프로그래밍 실습/Spring

프론트 컨트롤러(Front Controller) 패턴

by wylee 2023. 1. 27.

스프링 MVC 강의를 듣는 도중 프론트 컨트롤러 패턴이라는 패턴을 처음 들어보았다.

정리하면 좋을 것 같아 포스팅 시작!   

 

프론트 컨트롤러의 등장 배경

MVC 패턴의 한계

클라이언트의 요청 - 서블릿 1:1 매핑

1. viewPath의 prefix(/WEB-INF/views/), suffix(.jsp)의 중복

2. getRequestDispatcher, dispatcher.forward의 중복

3. request, response를 사용하지 않을때가 많음

4. 공통 처리가 어렵다

등등..

@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Member> members = memberRepository.findAll();
        request.setAttribute("members", members);

        String viewPath = "/WEB-INF/views/members.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}

(서블릿 예시 코드)

 

 

 

 

프론트 컨트롤러 패턴이란?

모든 클라이언트 요청을 프론트 컨트롤러 서블릿 하나로 받는 패턴

프론트 컨트롤러에서 공통 기능을 처리 가능하다!

프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다! 

프론트 컨트롤러 도입 전
프론트 컨트롤러 도입 후

 

 

 

 

ControllerV1이라는 인터페이스를 만들고 form, save, list 컨트롤러들을 각각 기능에 맞게 구현(다형성)한다.

그리고 map에 넣어 request가 들어올때마다 꺼내서 process 실행

@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {

    private Map<String, ControllerV1> controllerMap = new HashMap<>();

    public FrontControllerServletV1() {
        controllerMap.put("/front-controller/v1/members/new-form", new MemberFormControllerV1());
        controllerMap.put("/front-controller/v1/members/save", new MemberSaveControllerV1());
        controllerMap.put("/front-controller/v1/members", new MemberListControllerV1());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FrontControllerServletV1.service");

        String requestURI = request.getRequestURI();

        ControllerV1 controller = controllerMap.get(requestURI);
        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        
        controller.process(request, response);
    }
}

(프론트 컨트롤러 예시 코드)

 

 

 

되게 간단한 것 같지만 스프링 웹 MVC의 핵심이 되는 패턴이다.

DispatcherServlet이 FrontController 패턴으로 구현되어 있다.

 

 

 

 

회사에서 부트로만 개발하다가 서블릿을 직접 작성하려니까 정말 귀찮고 스프링의 위대함을 깨닫는 중...

비록 이젠 스프링 부트로 Api만 개발하지만 스프링 개발자라면 서블릿의 구조와 동작하는 방식에 대해선 꼭 알아야 한다고 생각한다!

 

 

 

 

출처: 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

댓글