학습 목표
- Spring MVC
- Spring MVC란 무엇인지 이해할 수 있다.
Spring의 모듈 중에는 웹 계층을 담당하는 몇 가지 모듈이 있는데 특히 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 모듈을 Spring-WebMVC(Spring MVC)이다
SpringMVC는 클라이언트의 요청을 편리하게 처리해주는 프레임워크이다
서블릿(Servlet)이란?
서블릿은 클라이언트의 요청을 처리하도록 특정 규약에 맞춰 Java코드로 작성하는 클래스 파일이다
그리고 아파치 톰캣(Apache Tomcat)은 이러한 서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너 중 하나이다.
- Model : 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고한다.
클라이언트의 요청사항을 구체적으로 처리하는 영역을 서비스계층 이라고 하며, 실제로 요청 사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직 이라고 한다. - View : Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스를 제공하며 JSON포멧 데이터를 생성한다.
- Controller : 클라이언트 측의 요청을 전달받아 Model과 View의 중간에서 상호작용을 해주는 역할을 담당한다.
- SpringMVC 흐름 : Client가 요청 데이터 전송 > Controller가 요청 데이터 수신 > 비즈니스 로직 처리 > Model데이터 생성 > Controller에게 Model데이터 전달 > Controller가 View에게 Model데이터 전달 > View가 응답 데이터 생성
- Spring MVC의 동작방식과 구성요소를 이해할 수 있다.
흐름
- 클라이언트가 요청을 전송하면 DispatcherServlet 이라는 클래스에 요청이 전달된다
- DispatcherServlet은 클라이언트의 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에게 요청한다
- HandlerMapping은 클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet에게 리턴해준다 (핸들러 객체는 해당 핸들러의 핸들러메서드 정보를 포함하고 있고 핸들러메서드는 컨트롤러 클래스 안에 구현된 요청 처리 메서드를 의미한다.)
- 요청을 처리할 Controller 클래스를 찾았으니 이제 실제로 클라이언트 요청을 처리할 Handler메서드를 찾아서 호출해야한다(DispatcherServlet은 Handler 메서드를 직접 호출하지 않고, HandlerAdpater에게 Handler메서드 호출을 위임한다)
- HandlerAdapter는 DispatcherServlet으로부터 전달 받은 Controller 정보를 기반으로 해당 Controller의 Handler메서드를 호출한다 (이제 전체적인 흐름 반환점을 돌았고 반대로 되돌아가면됨)
- Controller의 Handler 메서드는 비즈니스 로직 처리 후 리턴 받은 Model 데이터를 HandlerAdapter에게 전달한다
- HandlerAdapter는 전달받은 Model데이터와 View 정보를 다시 DispatcherServlet에게 전달한다
- DispatcherServlet은 전달받은 View 정보를 다시 ViewResolver에게 전달해서 View 검색을 요청한다
- ViewResolver는 View 정보에 해당하는 View를 찾아 View를 다시 리턴해준다
- DispatcherServlet은 ViewResolver로부터 전달받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청한다
- View는 응답 데이터를 생성해서 다시 DispatcherServlet에게 전달한다
- DispatcherServlet은 View로부터 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달한다.
DispatcherServlet의 역할
Spring MVC 요청 처리 흐름을 살펴보면 DispatcherServlet이 굉장히 많은 일을 하는 것처럼 보인다. 클라이언트로부터 요청을 전달받으면 핸들러 매핑 핸들러 어댑터 뷰 리졸버 뷰 등 대부분의 SpringMVC 구성요소들과 상호작용을 하고 있다 하지만 실제로 요청에 대한 처리를 다른 구성 요소들에게 위임하고 있다. 마치 “HandlerMapping(핸들러 매핑)아 Handler Controller 좀 찾아줄래? → ViewResolver(뷰 리졸버)야 View 좀 찾아줄래? → View야 Model 데이터를 합쳐서 콘텐츠 좀 만들어 줄래?”라고 하는 것과 같다
이처럼 DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 한다.
Point
- Spring MVC의 요청 처리 흐름
- 클라이언트의 요청을 제일 먼저 전달 받는 구성요소는 DispatcherServlet이다.
- DispatcherServlet은 HandlerMapping 인터페이스에게 Controller의 검색을 위임한다.
- DispatcherServlet은 검색된 Controller 정보를 토대로 HandlerAdapter 인터페이스에게 Controller 클래스내에 있는 Handler 메서드의 호출을 위임한다.
- HandlerAdapter 인터페이스는 Controller 클래스의 Handler 메서드를 호출한다.
- DispatcherServlet은 ViewResolver에게 View의 검색을 위임한다.
- DispatcherServlet은 View에게 Model 데이터를 포함한 응답 데이터 생성을 위임한다.
- DispatcherServlet은 최종 응답 데이터를 클라이언트에게 전달한다.
- DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 한다.
'TIL' 카테고리의 다른 글
[SpringFramework][PSA] (0) | 2022.10.22 |
---|---|
[Spring][SpringMVC][Controller][패키지구조] (0) | 2022.10.21 |
[SpringFramework][AOP] (0) | 2022.10.15 |
[SpringFramework][IoC/DI기초] (0) | 2022.10.15 |
[SpringFramework][POJO] (0) | 2022.10.14 |