Application을 모델-뷰-컨트롤러로 나누어서 개발하는 방식
아키텍처 패턴 중 하나로, 주 목적은 Business logic과 Presentation logic을 분리하기 위함
Presentation logic과 관련된 패턴이다
웹에서 많이 사용한다
Model2 아키텍처라고도 한다
MVC 패턴을 적용하지 않은 상태가 Model1 아키텍처
MVC 패턴을 사용하면 사용자 인터페이스로부터 비즈니스 로직을 분리하여 Application의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향없이 쉽게 고칠 수 있다
Application의 정보로, 데이터와 Business logic을 포함한다
contoller로부터 요청을 받아서 수행
Service와 DAO 클래스에 해당한다
데이터 저장소와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일을 수행
여러 개의 CRUD 변경 작업(추가,변경,삭제)을 하나의 작업으로 묶는 트랜잭션을 다룬다
사용자에게 제공할 화면, Presentation Logic
HTML 등이 해당된다
Model이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만든다
생성된 화면은 웹 브라우저가 출력하고, View 컴포넌트는 HTML과 CSS, JavaScript를 사용하여 웹 브라우저가 출력할 UI를 만든다
☞ 일반적으로 CSS와 JavaScript는 static한 resource로 인식하여 서버에서 실행되지 않고 보관만 하고 있다
클라이언트가 요청해야 클라이언트로 보내준다
HTML과 JSP 등을 사용하여 작성 가능
서버 사이드에서 view를 만들어주는 기술을 서버 템플릿이라고 한다. 대표적인 것이 Thyme leaf
Model과 View 사이의 상호작용을 관리한다
클라이언트는 controller와 통신하게 된다.
사용자로부터 요청을 받고, 응답을 돌려주는 것을 제어한다
클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 Model 컴포넌트를 호출
클라이언트가 보낸 데이터가 있다면 Model을 호출할 때 전달하기 쉽게 적절히 가공
Model이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 View에게 전달
클라이언트 요청에 대해 Model과 View를 결정하여 전달
Servlet과 JSP를 사용하여 작성 가능
Spring의 MVC 패턴, 미리 내장되어 있다
Spring에서 @Controller를 작성할 때 기본적인 내용은 Front Controller가 수행해주기 때문에 작성이 쉬워진다
Front Controller는 클라이언트가 보낸 모든 요청을 받아서 공통적인 작업을 먼저 수행
적절한 세부 Controller에게 작업을 위임하는 역할
각각의 Application Controller는 클라이언트에게 보낼 View를 선택해서 최종 결과를 생성한다
Front Controller 패턴은 인증이나 권한 체크처럼 모든 요청에 대해 공통적으로 처리해야 하는 로직이 있을 경우 전체적으로 클라이언트의 요청을 중앙집중적으로 관리하고자 할 때 사용한다
Spring은 DI나 AOP 같은 기능 뿐만 아니라, Servlet 기반의 웹 개발을 위한 MVC 프레임워크를 제공
Spring MVC는 Model2 아키텍처와 Front Controller 패턴을 프레임워크 차원에서 제공
Spring을 기반으로 하고 있기 때문에 트랜잭션 처리나 AOP 등을 쉽게 사용할 수 있다
대부분의 MVC 프레임워크들은 Front Controller 패턴을 적용해서 구현한다
Spring MVC도 Front Controller 역할을 하는 DispatcherServlet이라는 클래스를 계층의 맨 앞단에 놓고, 서버로 들어오는 모든 요청을 받아서 처리하도록 구성
예외가 발생했을 때 일관된 방식으로 처리하는 것도 Front Controller의 역할
구성요소 | 설명 |
---|---|
DispatcherServlet | 클라이언트의 요청을 받아 Controller에게 클라이언트의 요청을 전달하고, 결과 값을 View에게 전달하여 응답을 생성 |
HandlerMapping | URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체. DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있다 |
Controller | 클라이언트의 요청을 처리한 뒤 Model을 호출하고 결과를 DispatcherServlet에게 알려줌 |
ModelAndView | Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체, Controller의 리턴 타입 |
View | Controller의 처리 결과 화면에 대한 정보를 보유한 객체 |
ViewResolver | Controller가 리턴한 View 이름을 기반으로 Controller 처리 결과를 생성할 View를 결정. View를 쉽게 찾아서 클라이언트로 응답을 줄 수 있다 |
<servlet>
태그로 Web.xml에 등록한다<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>\WEB-INF/config/spring/dispatcherServlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodigFilter<filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
</filter>
WEB-INF 폴더 하위에 spring 폴더를 만들고 Spring Bean Configuration File로 새로 만들기를 선택하여
servlet-context.xml 파일을 만든다
servlet-context.xml에 컴포넌트를 자동 스캔할 수 있는 <context:component-scan>
과 controller를 자동으로 찾아주는
<mvc:annotation-driven/>
, viewResolver를 설정한다
Namespaces에서 context,mvc 체크표시 후 base-package에 패키지명을 입력
viewResolver는 <bean>
으로 설정
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
6.encoding 방식이 없으면 요청 시 글자가 깨진다. 한글 깨짐을 방지하기 위해 <filter>
를 통해 encoding 방식을 지정한다