모델 : 애플리케이션 상태(데이터)나 비즈니스 로직을 제공하는 컴포넌트
뷰 : 모델이 보유한 애플리케이션 상태(데이터)를 참조하고 클라이언트에 반환할 응답 데이터를 생성하는 컴포넌트
컨트롤러 : 요청을 받아 모델과 뷰의 호출을 제어하는 컴포넌트
스프링 MVC로 개발된 웹 애플리케이션의 특징.
웹 애플리케이션에서 사용할 어플리케이션 컨텍스트를 만들려면 서블릿 컨테이너에 ContextLoaderListener 클래스를 등록해야 한다.
@configuration
public class AppConfig {
}
스프링 MVC의 프런트 컨트롤러를 이용하기 위해 DispatcherServlet 클래스를 서블릿 컨테이너에 등록. 웹 애플리케이션용 애플리케이션 컨텍스트와 별개로 DispatcherServlet용 애플리케이션 컨텍스트를 별도로 만든다.
@Configuration
@EnableWebMvc // 스프링 MVC가 제공하는 설정 클래스가 임포트되어 스프링 MVC를 이용할 때 필요한 컴포넌트의 빈 정의가 자동으로 이뤄진다.
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
}
입력 값의 한국어가 깨지지 않도록 CharacterEncodingFilter 클래스를 서블릿 컨테이너에 등록한다.
스프링MVC는 프런트 컨트롤러 패턴(Front controller) 이라고 하는 아키텍처를 채택.
클라이언트 요청을 프런트 컨트롤러라는 컴포넌트가 받아 요청 내용에 따라 수행하는 핸들러를 선택하는 아키택처.
프런트 컨트롤러에 공통적인 처리를 통합할 수 있다. ex) 클라이언트의 요청 검수, 요청 데이터를 자바 객체로 변환, 입력값 검사 실행, 핸들러 호출, 뷰 선택, 클라이언트에 요청 결과 전달, 예외 처리
스프링MVC 프런트 컨트롤러 : DispatcherServlet
1. DispatcherServlet 클래스는 클라이언트의 요청을 받는다
2. DispatcherServlet 클래스는 HandlerMapping 인터페이스의 getHandler 메서드를 호출해서 요청 처리를 하는 Handler 객체를 가져온다.
3. DispatcherServlet 클래스는 HandlerAdapter 인터페이스의 handle 메서드를 호출해서 Handler 객체의 메서드 호출을 의뢰한다.
4. HandlerAdapter 인터페이스 구현 클래스는 Handler 객체에 구현된 메서드를 호출해서 요청 처리를 수행한다.
5. DispatcherServlet 클래스는 ViewResolver 인터페이스의 resolveViewName 메서드를 호출해서 Handler 객체에서 반환된 뷰 이름에 대응하는 View 인터페이스 객체를 가져온다.
6. DispatcherServlet 클래스는 View 인터페이스의 render 메서드를 호출해서 응답 데이터에 대한 렌더링을 요청한다. View 인터페이스의 구현 클래스는 JSP와 같은 템플릿 엔진을 사용해 렌더링할 데이터를 생성한다.
7. DispatcherServlet 클래스는 클라이언트에 응답을 반환한다.
프레임워크 관점에서는 핸들러, 개발자가 작성하는 클래스의 관점에서는 컨트롤러라 부른다.
@Controller 애너테이션을 클래스에 지정하고 @RequestMapping 애너테이션을 요청 처리하는 메서드에 지정한다.
요청에 대응할 핸들러를 선택하는 역할.
RequestMappingHandlerMapping 클래스는 @RequestMapping 에 정의된 설정 정보를 바탕으로 실행할 핸들러를 선택한다.
핸들러 메서드를 호출하는 역할.
RequestMappingHandlerMapping 클래스에 의해 선택된 핸들러 메서드를 호출할 때는 RequestMappingHandlerAdapter 클래스를 사용.
핸들러 메서드에 매개변수를 전달하고 메서드의 처리 결과를 반환값으로 되돌려 보내는 역할.
핸들러 메서드에 매개변수를 전달할 때는 요청받은 데이터를 자바 객체로 변환하고 입력값이 올바른지 검사 (Bean validation) 하는 것까지 한번에 이뤄진다.
인수나 반환값에 기본적으로 지원되지 않는 타입을 지원해야 할 경우에 HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler 인터페이스를 활용할 수 있다.
핸들러에서 반환한 뷰 이름을 보고 이후에 사용할 View 인터페이스의 구현 클래스를 선택한다.
클라이언트에 반환하는 응답 데이터를 생성하는 역할.
스프링 MVC에서는 두 가지 애플리케이션 컨텍스트를 사용한다.