728x90
스프링 MVC 전체 구조
- DispatcherServlet
- 프론트 컨트롤러 패턴으로 구현
- 스프링 MVC의 핵심
- HttpServlet을 상속
- 서블릿으로 등록하면서 모든 경로에 대해서 매핑
- urlPatterns=”/”
- 요청 흐름
- 서블릿이 호출되면 HttpServlet이 제공하는 service() 메서드 호출
- 스프링MVC는 DispatcherServlet의 부모인 FrameworkServlet에서 service() 메서드를 오버라이드 해 둠
- FrameworkServlet.service()를 시작으로 여러 메서드가 호출되면서 DispatcherServlet.doDispatch()가 호출 됨
- 동작 순서
- 핸들러 조회
- 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회
- 핸들러 어댑터 조회
- 핸들러를 실행할 수 있는 핸들러 어댑터 조회
- 핸들러 어댑터 실행
- 핸들러 어댑터 실행
- 핸들러 실행
- 핸들러 어댑터가 실제 핸들러 실행
- ModelAndView 반환
- 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환
- viewResolver 실행
- 뷰 리졸버를 찾고 실행
- view 반환
- 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고 렌더링 역할을 담당하는 뷰 객체를 반환
- 뷰 렌더링
- 뷰를 통해서 뷰를 렌더링
- 핸들러 조회
- 주요 인터페이스 목록
- 핸들러 매핑
- 핸들러 어댑터
- 뷰 리졸버
- 뷰
핸들러 매핑과 핸들러 어댑터
- 과거 버전의 스프링에서는 Controller 인터페이스를 제공 했음
- HandlerMapping(핸들러 매핑)
- 핸들러 매핑에서 컨트롤러를 찾을 수 있어야 함
- ex)스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요
- HandlerAdapter(핸들러 어댑터)
- 핸들러 매핑을 통ㅎ애서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요
- ex) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 함
- Controller 인터페이스 호출 순서
- 핸들러 매핑으로 핸들러 조회
- HandlerMapping을 순서대로 실행해서 핸들러 찾음
- 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping 가 실행에 성공하고 핸들러인 OldController를 반환
- 핸들러 어댑터 조회
- HandlerAdapter의 supports()를 순서대로 호출
- SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상이 됨
- 핸들러 어댑터 실행
- 디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨줌
- SimpleControllerHandlerAdapter는 핸들러인 OldController를 내부에서 실행하고 그 결과를 반환
- 핸들러 매핑으로 핸들러 조회
- HttpRequestHandler 인터페이스 호출 순서
- 핸들러 매핑으로 핸들러 조회
- HandlerMapping을 순서대로 실행해서 핸들러 찾음
- 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping 가 실행에 성공하고 핸들러인 MyHttpRequesstHandler를 반환
- 핸들러 어댑터 조회
- HandlerAdapter의 supports()를 순서대로 호출
- HttpRequestHandlerAdapter가 HttpRequestHandler 인터페이스를 지원하므로 대상이 됨
- 핸들러 어댑터 실행
- 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨줌
- HttpRequestHandlerAdapter는 핸들러인 MyHttpRequesstHandler를 내부에서 실행하고 그 결과를 반환
- 핸들러 매핑으로 핸들러 조회
- 현재는 @RequestMapping을 주로 사용
뷰 리졸버
- 스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록
- application.properties에 등록한 suffix와 prefix 설정 정보를 사용
- 뷰 리졸버 동작 방식
- 핸들러 어댑터 호출
- 핸들러 어댑터를 통해 new-form 이라는 논리 뷰 이름 휙득
- ViewResolver 호출
- new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출
- BeanNameViewResolver는 new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없을 경우 InternalResourceViewResolver가 호출
- InternalResourceViewResolver
- 이 뷰 리졸버는 InternalResourceView를 반환
- InternalResourceView
- JSP처럼 forward()를 호출해서 처리할 수 있는 경우 사용
- view.render()
- view.render()가 호출되고 InternalResourceView는 forward()를 사용해 JSP 실행
- 핸들러 어댑터 호출
스프링 MVC - 시작하기
- 애노테이션을 이용하는 컨트롤러
- 현재 사용하는 방식
- @RequestMapping
- 요청 정보를 매핑
- 애노테이션 기반으로 동작하기 때문에 메서드 이름은 임의로 지을 수 있음
- 공통된 요청 정보는 클래스 레벨에 지정하여 처리할 수 있음
- get과 post 모두 사용 가능
- @GetMapping, @PostMapping으로 대체하여 사용
- @Controller
- 자동으로 스프링 빈으로 등록 해 줌
- 애노테이션 기반 컨트롤러로 인식
출처 : https://www.inflearn.com/course/스프링-mvc-1
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -
www.inflearn.com
'BackEnd 학습 > Spring Framework' 카테고리의 다른 글
Spring(스프링) - 스프링 MVC 기본기능 (0) | 2023.06.22 |
---|---|
Spirng(스프링) - MVC 프레임워크 만들기 (0) | 2023.06.13 |
Spring(스프링) -서블릿, JSP, MVC패턴 (1) | 2023.06.07 |
Spring(스프링) - 서블릿 (0) | 2023.05.31 |
Spring(스프링) - 웹 애플리케이션 이해 (0) | 2023.05.16 |