프론트 컨트롤러
- 웹 애플리케이션의 모든 요청을 하나의 진입점에서 처리하는 디자인 패턴
- 쉽게 말하면 모든 요청을 한 곳에서 받고, 거기서 분기해서 처리하도록 하는 구조
🔄️ 동작 흐름
- 사용자가 /login, /register 같은 요청을 보냄
- 모든 요청은 프론트 컨틀롤러로 모임
- 프론트 컨트롤러가 요청 URL을 분석해서 해당하는 로직으로 분기시킴
- 필요한 비즈니스 로직을 호출하고 결과를 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나 분기 구조가 생길 수 있음
=> 그래서 이를 해결하려고 핸들러 맵핑이나 커맨드 패턴 등을 함께 사용하기도 함