Spring

[Spring] MVC 7편 - 프론트 컨트롤러 v3

dev-nadan 2025. 8. 12. 21:22

1. v2의 한계

  • 컨트롤러가 여전히 HttpServletRequest에 직접 접근해야 함.
  • 뷰 경로에 /WEB-INF/views/ 같은 물리 경로를 매번 적어야 함.

2. 개선 아이디어

  • Servlet 종속성 제거: 요청 파라미터를 Map<String, String>으로 전달.
  • Model 객체 분리: 데이터 전달을 위한 Map<String, Object>를 사용.
  • 뷰 이름 논리화: 컨트롤러는 "new-form"처럼 논리 이름만 반환 → 실제 경로는 프론트 컨트롤러가 처리.

3. 핵심 구조

public interface ControllerV3 {
    ModelView process(Map<String, String> paramMap);
}

public class ModelView {
    private String viewName;
    private Map<String, Object> model = new HashMap<>();
    // getter, setter
}

4. 동작 흐름

  1. 프론트 컨트롤러가 request에서 파라미터를 꺼내 paramMap 생성.
  2. 컨트롤러 실행 → ModelView 반환 (논리 뷰 이름 + model 데이터).
  3. 뷰 리졸버(viewResolver)가 논리 이름 → 물리 경로 변환.
  4. MyView로 렌더링.

5. 쉽게 이해하기

  • v2까지: 컨트롤러 ↔ 서블릿 객체 직접 연결
  • v3부터: 컨트롤러 ↔ 단순 Java 객체(Map, ModelView) 연결 → 테스트 코드 작성 쉬워짐.
  • 비유: “서블릿 전용 콘센트”에서 “범용 멀티탭”으로 변경.

6. 회고

이 버전이 되면서, 프레임워크와 구현 코드가 명확히 분리되는 걸 체감했다.

예전에 프로젝트 테스트할 때 HttpServletRequest를 흉내 내느라 고생했는데, 이제 단순 Map만 넘기면 돼서 단위 테스트가 훨씬 쉬워진다.