Spring MVC 구조

hyun·2024년 3월 4일

Spring

목록 보기
6/6
post-thumbnail

🔎 Spring MVC 전체 구조

Spring MVC에서 가장 핵심은 Front Controller라고 할 수 있다.

📢 Front Controller : 클라이언트의 요청을 받아들이고 이를 적절한 컨트롤러나 핸들러에 전달한다. 모든 클라이언트 요청을 중앙 집중식으로 한곳으로 모아 중복 코드를 줄이고 일관된 방식으로 처리할 수 있다.

Spring MVC에서는 Front Controller의 역할을 DispatcherServlet이 담당하게 된다.

위 그림은 스프링 MVC 전체 흐름을 나타낸 그림이다. 순서에 맞춰서 설명을 해보겠다.

1. 핸들러 조회

핸들러 매핑을 통해 요청된 URL에 알맞은 핸들러(컨트롤러)를 찾는다.

0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다

핸들러 매핑은 위와 같이(실제로는 더 많다) 나뉘게 되는데 각 요청에 맞는 핸들러(Controller)를 순회를 통해 가져오게 된다.

2. 핸들러 어댑터 조회

0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처리

핸들러 조회를 통해 얻어온 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다(supports() 이용). 핸들러 어댑터가 필요한 이유는 @Controller, HttpRequestHandler, SimpleController, @RestController 등 다양한 핸들러가 존재하는데 이를 일관성있게 처리해주기 위해서다. 쉽게 말해서 DispatcherServlet에서는 다른 핸들러를 사용하더라도 항상 일관된 형식으로 결과값을 반환받아 다음 작업을 처리해야한다. 그러기 위해서는 핸들러 어댑터라는 인터페이스와 그 구현체를 이용할 수 있다.

3. 핸들러 어댑터 실행

DispatcherServlet에서 찾아온 핸들러 어댑터를 실행하며 그 핸들러의 정보도 같이 넘겨준다.

4. 핸들러 실행

핸들러 어댑터 내부에서 실행하고 그 결과를 반환한다.

5. ModelAndView 반환

📢 ModelAndView : 핸들러에서 반환되는 값(Model)과 클라이언트에게 보여질 화면(View)을 나타내는 정보를 전달할 때 사용

핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.

6.ViewResolver 호출

📢 ViewResolver : 뷰를 해석하고 검색하는 역할을 담당한다. 핸들러로부터 반환되어 온 View이름을 기반으로 실제 사용될 VIew를 찾는다. 주로 사용되는 ViewResolver는 아래와 같다.

  • InternalResourceViewResolver: 내부 리소스에 위치한 뷰를 찾아내는 뷰 리졸버이다. 주로 JSP, HTML과 같은 정적인 뷰를 처리한다.
  • UrlBasedViewResolver: 지정된 URL에 따라 뷰를 해석하는 뷰 리졸버이다. 주로 외부 리소스에 위치한 뷰를 처리하거나, 뷰 이름에 특정한 규칙을 적용하는데 사용된다.

예시코드

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/"); // JSP 파일이 저장된 경로
        viewResolver.setSuffix(".jsp"); // JSP 파일 확장자
        return viewResolver;
    }

7. View 반환

뷰 리졸버가 뷰의 논리 이름물리 이름(실제 뷰가 저장된 경로)으로 바꾸고, 렌더링 역할을 하는 뷰 객체를 반환한다.

8. View 렌더링

뷰를 통해 뷰를 렌더링한다.

그림 출처
(출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard)

0개의 댓글