Spring MVC 모듈은 MVC 디자인 패턴을 구현한 Spring 아키텍처 패턴이다.
모든 클라이언트의 요청을 받아들이는 핵심 컴포넌트이다. → Spring MVC 모듈에서 프론트와 맞 닿아 있는 부분이다.
DispatcherServlet은 애플리케이션의 컨텍스트를 로드하고, 요청을 처리하는 데 필요한 모든 빈들을 로드한다.
DispatcherServlet이 클라이언트 요청을 처리할 적절한 핸들러에 전달하기 위해 HandlerMapping에 의존한다. HandlerMapping은 URL과 핸들러 사이의 매핑을 유지 관리한다. → 해당 요소를 사용하여 URL과 컨트롤러를 직접 매핑할 수 있어서 빠른 속도로 유연한 처리를 할 수 있다. 그러나 일일이 매핑해줘야 하기 때문에 관리하기가 번거롭다. → Spring MVC 프로젝트에서는 HandlerMapping대신 RequestMapping 어노테이션을 사용하여 자동으로 매핑시킨다.
@Controller
@RequestMapping("/hello")
public class HelloWorldController {
@RequestMapping("/world")
public ModelAndView helloWorld() {
String message = "Hello World, Spring MVC!";
return new ModelAndView("helloPage", "message", message);
}
}
클라이언트 요청을 처리하는 실제 로직을 포함하고 있는 컴포넌트이다. 컨트롤러는 일반적으로 서비스 계층에서 비즈니스 로직을 호출하고, 그 결과를 적절한 모델 객체에 저장한다.
컨트롤러가 클라이언트에게 반환하는 모델과 뷰의 조합을 나타낸다. 모델은 클라이언트에게 전달될 데이터를 포함하고, 뷰는 데이터를 표시하는 방법을 정의한다.
뷰 이름을 물리적인 뷰 파일 경로와 매핑하는 컴포넌트이다. ViewResolver는 DispatcherServlet에게 반환된 ModelAndView에서 사용할 뷰 이름을 검색하고, 해당 뷰 파일을 찾아 렌더링한다.
여기서는 viewResolver가 아닌 다른 리졸버 등록 예시를 가져왔다.
커스텀 리졸버 생성예시
@Component
public class MyResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return Long.class.equals(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory){
// 리졸버 관련 로직
Object object = webRequest.getAttribute("test", 0);
return object;
}
}
리졸버 등록 예시
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new MyResolver);
}
}
클라이언트 요청을 처리하기 전후에 실행되는 컴포넌트이다. Interceptor는 컨트롤러가 호출되기 전에 인증 및 권한 부여와 같은 전처리 작업을 수행하거나, 컨트롤러가 처리를 완료한 후에 로깅 및 성능 측정과 같은 후처리 작업을 수행한다.
커스텀 인터셉터 생성예시
@RequiredArgsConstructor
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) {
// 인터셉터 로직
return true;
}
}
인터셉터 등록 예시
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
DataBinder : 데이터와 객체 간의 데이터 바인딩 처리를 담당
Validator : 데이터의 유효성 검사 실행
HandlerExceptionResolver : 예외를 처리하는 컴포넌트
MultipartResolver : 클라이언트가 전송한 멀티파트 요청 데이터를 처리하는 컴포넌트
FlashMapManager : 리다이렉트 이후에 데이터를 유지하고 전달하는 데 사용하는 컴포넌트
사진 자료
https://ko.wikipedia.org/wiki/모델-뷰-컨트롤러
https://terasolunaorg.github.io/guideline/1.0.1.RELEASE/en/Overview/SpringMVCOverview.html