[Spring] Front Controller 패턴 - 개요

2025. 6. 22. 23:38·Spring/MVC

Front Controller 패턴

프론트 컨트롤러 패턴은 말 그대로 프론트에서 컨트롤한다는 의미이다.

위 사진처럼 컨트롤러에서 공통되는 로직들을 먼저 1차로 Front Controller로 처리 한뒤, 나머지 로직들을 해당 컨트롤러에서 실행하는 형태를 의미한다.

대표적으로 Front Controller 를 사용하게 되면 Front Controller를 제외한 나머지 컨트롤러에는 서블릿을 굳이 사용하지 않아도 된다는 장점이 있다(@WebServlet 애노테이션 작성 X, HttpServlet 인터페이스 상속 X).

나머지 컨트롤러는 먼저 공통 기능을 묶은 인터페이스를 먼저 구현하고, 이를 구현한 컨트롤러로 작성하면 된다.

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public interface ControllerV1 {

    // 서블릿의 service 메서드와 같다
    void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

}

해당 인터페이스를 구현하여 회원등록 ,저장, 조회 하는 컨트롤러들을 만들었다고 가정한다.


다만, 아무리 다형성을 사용해도 Config와 같은 관리 코드는 변경해야하는 것 처럼, 프론트 컨트롤러는 HttpServlet을 구현해야한다.

예시 코드를 먼저 보자.

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;

import static jakarta.servlet.http.HttpServletResponse.*;

// 어떤 요청이 들어와도, 예를 들어 /front-controller/v1/xxxx 가 들어오면 무조건 이 프론트 컨트롤러가 실행
@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(SC_NOT_FOUND);
            return;
        }

        controller.process(request,response);
    }
}

 

프론트 컨트롤러의 URI를 먼저 다음과 같이 매핑 했다. 설명은 주석 참조

// 어떤 요청이 들어와도, 예를 들어 /front-controller/v1/xxxx 가 들어오면 무조건 이 프론트 컨트롤러가 실행
@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")

 

이후, URI를 Key로, 그리고 우리가 만든 컨트롤러를 Value로 하는 Map을 만들고, 미리 컨트롤러의 매핑 정보를 저장해 놓는다.

이후, 들어오는 URI 값을 getRequestURI 메서드를 통해 뽑은 뒤, 이를 Key 값으로 매핑된 컨트롤러 객체의 참조값을 가져오고, 해당 컨트롤러의 process 메서드를 호출한다.(없으면 404 에러 띄우고 retrun).

이후 해당 컨트롤러 내부 로직을 통해 작성된 뷰템플릿으로 forward() 되어 HTML을 그려주는 형식으로 작동한다.

 


결론

다형성을 적극 활용하여 모든 컨트롤러에서 작성해야하는 중복 로직(서블릿 구현 등) 을 생략할 수 있었고 동적으로 요청에 대한 컨트롤러 객체를 갈아끼우며 Response를 작성할 수 있게 되었다 !

'Spring > MVC' 카테고리의 다른 글

[Spring] FrontController 도입하기 V2 - 포워딩 중복 제거  (0) 2025.06.23
[Spring] FrontController 도입하기 V1  (0) 2025.06.23
[Spring] 서블릿과 JSP로 MVC 흉내내기 , 그리고 한계점  (0) 2025.06.22
[Spring] MVC 패턴의 개요 - JSP는 만능이지만 만능이 아님  (1) 2025.06.22
[Spring] 회원 관리 웹 애플리케이션 JSP 리팩토링  (0) 2025.06.22
'Spring/MVC' 카테고리의 다른 글
  • [Spring] FrontController 도입하기 V2 - 포워딩 중복 제거
  • [Spring] FrontController 도입하기 V1
  • [Spring] 서블릿과 JSP로 MVC 흉내내기 , 그리고 한계점
  • [Spring] MVC 패턴의 개요 - JSP는 만능이지만 만능이 아님
xuv2
xuv2
집에 가고 싶다
  • xuv2
    xuvlog
    xuv2
  • 전체
    오늘
    어제
    • 전체 글 모아보기 (171) N
      • 잡담 (9)
      • 도전 , 자격증 (2)
      • Error (5)
      • Java (23)
      • Spring (40) N
        • Core (10)
        • MVC (21) N
        • Thymeleaf (9)
      • DataBase (6)
        • Database Modeling (4)
        • SQL (2)
      • HTTP (11)
      • Network (17)
      • Software Engineering (3)
      • Operating System (3)
      • Algorithm (16)
      • Project (18)
        • Web (9)
        • iOS (8)
        • Python (1)
      • A.I (13)
      • Linux (5)
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
xuv2
[Spring] Front Controller 패턴 - 개요
상단으로

티스토리툴바