Spring MVC

DevHwan·2023년 4월 10일
0
post-thumbnail

Spring MVC 모듈은 MVC 디자인 패턴을 구현한 Spring 아키텍처 패턴이다.

DispatcherServlet

모든 클라이언트의 요청을 받아들이는 핵심 컴포넌트이다. → Spring MVC 모듈에서 프론트와 맞 닿아 있는 부분이다.

DispatcherServlet은 애플리케이션의 컨텍스트를 로드하고, 요청을 처리하는 데 필요한 모든 빈들을 로드한다.

HandlerMapping

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);
    }
}

Controller

클라이언트 요청을 처리하는 실제 로직을 포함하고 있는 컴포넌트이다. 컨트롤러는 일반적으로 서비스 계층에서 비즈니스 로직을 호출하고, 그 결과를 적절한 모델 객체에 저장한다.

ModelAndView

컨트롤러가 클라이언트에게 반환하는 모델과 뷰의 조합을 나타낸다. 모델은 클라이언트에게 전달될 데이터를 포함하고, 뷰는 데이터를 표시하는 방법을 정의한다.

ViewResolver

뷰 이름을 물리적인 뷰 파일 경로와 매핑하는 컴포넌트이다. 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);
    }
}

Interceptors

클라이언트 요청을 처리하기 전후에 실행되는 컴포넌트이다. 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());
    }
 
}

기타 구성요소들

profile
달리기 시작한 치타

0개의 댓글