[Spring] MVC 패턴 & 프론트 컨트롤러(Dispatcher-Servlet)
1. Model View Controller
컨트롤러
-> HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과데이터를 조회해서 모델에 담는다.
모델
-> 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
뷰
-> 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다.
MVC 패턴 한계
MVC 패턴은 공통 처리가 어렵다는 한계가 있다.
기능이 복잡해질수록 컨트롤러에서 공통으로 처리해야 하는 부분이 점점 더 증가할 것이다. 이 문제를 해결하기 위해서 컨트롤러 호출 전에 먼저 공통 기능을 처리해야한다.
2. 프론트 컨트롤러
- 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받는다.
- 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다.
- 입구를 하나로!
- 공통 처리 가능
- 스프링 웹 MVC의 "DispatcherServlet"이 프론트컨트롤러 패턴으로 구현되어 있다.
동작순서
- 클라이언트 요청을 디스패처 서블릿이 받음
- 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
- 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
- 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
- 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
- ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
- View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
- 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링한다.
3. 핸들러 매핑과 핸들러 어댑터
스프링 부트가 제공하는 핸들러 매핑과 핸들러 어댑터 (일부생략)
- HandlerMapping
0 = RequestMappingHandlerMapping = 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping = 스프링 빈의 이름으로 핸들러를 찾는다.
- HandlerAdapter
0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처ㅣ
@RequestMapping
- 실무에서 대부분 사용하는 방식의 컨트롤러
- RequestMappingHandlerMapping 과 RequestMappingHandlerAdaptor가 사용된다.
- 요청 정보를 매핑. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드 이름은 임의로 지으면 된다.
- @GetMapping, @PostMapping 으로 HTTP Method를 구분할 수 있다.
4. 뷰 리졸버
스프링 부트가 제공하는 뷰 리졸버 (일부생략)
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
※ return '/join-form' 가정 (jsp)
1. 핸들러 어댑터 호출
핸들러 어댑터를 통해 'join-form'이라는 논리 뷰 이름을 획득한다.
2. ViewResolver 호출
'join-form'이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
'join-form'이라는 이름의 스프링 빈으로 등록된 뷰가 없으므로 InternalResourceViewResolver가 호출된다.
3. InternalResourceViewResolver
이 뷰 리졸버는 InternalResourceViewResolver를 반환한다.
4. 뷰 -InternalResourceView
InternalResourceViewResolver는 JSP 처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
5. 핸들러 어댑터 호출
view.render()가 호출되고 InternalResourceViewResolver는 forward()를 사용해서 JSP를 실행한다.
※ JSP를 제외한 나머지 뷰 템플릿들은 forward()과정 없이 바로 렌더링 된다.
※ 타임리프 뷰 템플릿을 사용하면 ThymeleafViewResolver를 등록해야 한다. 최근에는 라이브러리만 추가하면 된다.
출저
인프런 강의 스프링 MVC 1편 (김영한 강사님)
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard