프론트 컨트롤러

헤일리의 개발 일지·2025년 4월 7일

프론트 컨트롤러

  • 웹 애플리케이션의 모든 요청을 하나의 진입점에서 처리하는 디자인 패턴
  • 쉽게 말하면 모든 요청을 한 곳에서 받고, 거기서 분기해서 처리하도록 하는 구조

🔄️ 동작 흐름

  1. 사용자가 /login, /register 같은 요청을 보냄
  2. 모든 요청은 프론트 컨틀롤러로 모임
  3. 프론트 컨트롤러가 요청 URL을 분석해서 해당하는 로직으로 분기시킴
  4. 필요한 비즈니스 로직을 호출하고 결과를 View로 넘김

⌨️ 프론트 컨트롤러 예시

  • controllerV1Map에서 모든 requestURI를 관리하고, 경우에 따라 요청함
package hello.servlet.web.frontcontroller.v1;

import hello.servlet.web.frontcontroller.v1.controller.MemberFormControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberListControllerV1;
import hello.servlet.web.frontcontroller.v1.controller.MemberSaveControllerV1;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
    private Map<String, ControllerV1> controllerV1Map = new HashMap<>();

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

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String requestURI = request.getRequestURI();

        ControllerV1 controller = controllerV1Map.get(requestURI);
        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        controller.process(request, response);
    }
}

👍 장점

  • 중앙 집중 관리: 모든 요청이 한 곳으로 모이기 때문에 흐름 파악이 쉬움
  • 중복 제거: 공통 처리(로그인 검사, 로깅, 인코딩 등)를 한 곳에서 처리 가능
  • 유지보수 용이: 변경이 생겨도 하나의 진입점만 수정하면 됨
  • 확장성 높음: 다양한 URL에 쉽게 대응 가능

👎 단점

  • 처음 설정이 조금 복잡할 수 있음
  • 모든 요청이 한 곳으로 모이기 때문에 복잡한 if-else나 분기 구조가 생길 수 있음
    => 그래서 이를 해결하려고 핸들러 맵핑이나 커맨드 패턴 등을 함께 사용하기도 함

0개의 댓글