직접 만든 MVC 프레임워크 구조 vs. SpringMVC 구조
Spring MVC 동작 순서
DispacherServlet.doDispatch() 코드를 분석하면 MVC 동작이 보인다.
DispacherServlet을 서블릿으로 등록하고 모든 경로(urlPatterns="/")에 대해서 매핑된다.
- 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
- 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
- 핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.
- 핸들러 실행: 핸들러 어댑터가 핸들러를 실행한다.
- ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- viewResolver 호출: 뷰 리졸버를 찾고 실행한다.
- View 반환: 뷰를 통해서 뷰를 렌더링 한다.
@RequestMapping
스프링이 자동으로 등록하는 핸들러 매핑과 핸들러 어댑터 중에서 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용하는 RequestMappingHandlerMapping에 대해서 설명하겠다
RequestMappingHandlerMapping은 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용된다.
@RequestMapping 애노테이션을 사용하는 컨트롤러가 제일 먼저 매핑된다.
@Controller 또는 @RequestMapping이 클래스 레벨에 붙어있으면 매핑 정보로 인식한다. 여기서 어떻게 매핑 정보로 인식하는지 간단하게 보자면, (더 자세하게 이해하고 싶다면 링크 참고)
RequestMappingHandlerMapping빈을 생성하고, 빈 팩토리에 등록되어 있는 빈들 중 @Controller 또는 @RequestMapping이면 핸들러로 인식하게 되어 있다. 핸들러로 인식한 빈에서 메서드를 추출한다. 추출한 메서드를 registry에 등록한다. 이렇게 등록되면 어댑터가 요청 url에 맞는 컨트롤러의 메서드를 찾아서 호출해 줄 수 있다.
@Controller
public class SpringMemberFormController {
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
}
- @Controller: 스프링 mvc에서 애노테이션 기반 컨트롤러로 인식
- @RequestMapping: 요청 정보를 매핑, 해당 URL로 요청이 들어오면 아래 메서드를 실행한다. 이 메서드 실행은 어댑터가 한다. 컨트롤러의 메서드(process()) 실행
- 메서드 실행 후 ModelAndView 를 DispacherServlet 으로 반환
- DispacherServlet 은 ModelAndView 을 ViewResolver에 의해 물리 주소로 변환한 결과를 받고 페이지를 렌더링해 준다 (render())
View Resolver
스프링 부트가 등록하는 뷰 리졸버 (실제로 더 많지만 중요한 부분 위주로 설명)
- BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환
- InternalResourceViewResolver: JSP를 처리할 수 있는 뷰를 반환
위 코드를 보면 new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
'Spring > Spring MVC' 카테고리의 다른 글
HTTP 요청 메시지 - 텍스트, JSON (1) | 2023.10.05 |
---|---|
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (0) | 2023.10.05 |
[스프링 MVC] 요청 매핑 (0) | 2023.10.05 |
컴포넌트 스캔 (0) | 2023.09.17 |
스프링 MVC 시작하기 (0) | 2023.09.05 |