개발/Spring

스프링 MVC(Model - View - Controller)

Dev.Notice 2022. 11. 15. 17:52
728x90
반응형
스프링 프레임워크 MVC

 

MVC 란 Model - View - Controller 의 약자로 일반 PC 프로그램 개발에 사용되는 디자인 패턴을 웹 애플리케이션에 도입한 것입니다.
웹 애플리케이션을 화면 부분, 요청 부분, 로직 처리 부분으로 나누어 개발하는 방법이죠.

MVC 의 특징

 

- 각 기능이 분리되어 있어 개발 및 유지보수가 편리합니다.
- 각 기능의 재사용성이 높아집니다.
- 디자이너와 개발자의 작업을 분업화해서 쉽게 개발할 수 있습니다.

스프링은 애플리케이션 개발 시에 많이 사용되는 모델2 기반의 MVC 기능을 제공하므로 편리하게 애플리케이션을 개발할 수 있습니다.

스프링에서 지원하는 MVC 기능 특징

- 모델 2 아키텍처를 지원합니다.
- 스프링과 다른 모듈과의 연계가 쉽습니다.
- 타일즈(tiles)나 사이트메시(sitemesh) 같은 View 기술과의 연계가 쉽습니다.
- 태그 라이브러리를 통해 message 출력, theme 적용 그리고 입력 폼을 보다 쉽게 구현할 수 있습니다.

 

 

스프링 프레임워크 MVC 구성요소

 

구성요소 설명
DispatcherServlet 클라이언트의 요청을 전달받아 해당 요청에 대한 컨트롤러를 선택하여 클라이언트의 요청을 전달합니다. 또한 컨트롤러가 반환한 값을 View 에 저달하여 알맞은 응답을 생성합니다.
HandlerMapping 클라이언트가 요청한 URL 을 처리할 컨트롤러를 지정합니다.
Controller 클라이언트의 요청을 처리한 후 그 결과를 DispatcherServlet 에 전달합니다.
ModelAndView 컨트롤러가 처리한 결과 및 뷰 선택에 필요한 정보를 저장합니다.
ViewResolver 컨트롤러의 처리 결과를 전달할 뷰를 지정합니다.
View 컨트롤러의 처리 결과 화면을 생성합니다.

 

 

사용 스프링 클래스

 

클래스 설명
MultiActionController URL 요청명으로 바로 컨트롤러를 지정해서 사용할 수 있습니다.
PropertiesMethodNameResolver URL 요청명으로 컨트롤러의 설정 파일에서 미리 설정된 메서드를 바로 호출해서 사용할 수 있습니다.
InternalResourceViewResolver JSP 나 HTML 파일과 같이 웹 애플리케이션의 내부 자원을 이용해 뷰를 생성하는 기능을 제공합니다. 기본적으로 사용하는 View 클래스이며 prefix 와 suffix 프로퍼티를 이용해 경로를 지정할 수 있습니다.

 

 

구성 파일

파일 설명
web.xml 브라우저에서 *.do 요청 시 스프링의 DsipatcherServlet 클래스가 요청을 받을 수 있게 서블릿 매핑을 합니다.
설정파일.xml 스프링 프레임워크에서 필요한 빈들을 설정합니다.
src/Controller 매핑된 요청에 대해 컨트롤러의 기능을 수행합니다.
view/JSP 요청에 대해 컨트롤러가 브라우저로 전송하는 JSP 입니다.

 

설정 파일 이름은 반드시 web.xml 의 서블릿 매핑 시 사용했던 <servlet-name> 태그 값으로 명시했던 이름으로 시작해야 하고 그렇지 않으면 톰캣 실행 시 오류가 발생합니다.
(ex - member 로 설정을 했었으면 member-servlet.xml 로 지정)

 

 

[ web.xml ]

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
   <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 메모리 로드 -->
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
   </servlet-mapping>
</web-app>

 

 

[ 설정파일.xml ]

 

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
...

	<!-- /test 폴더에서 ModelAndView 인자로 넘어온 뷰이름에 해당되는 JSP 를 선택해 DispatcherServlet 로 보냄 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/test/" />
		<property name="suffix" value=".jsp" />
	</bean>

	<bean id="userUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<!-- URL 요청명이 /test/*.do 로 시작되면 userController 를 요청 -->
				<prop key="/test/*.do">userController</prop>
			</props>
		</property>
	</bean>

	<bean id="userController" class="com.spring.ex02.UserController">
		<!-- 지정한 요청명에 대해서 직접 메서드를 호출 -->    	
		<property name="methodNameResolver">
			<ref local="userMethodNameResolver" />
		</property>
	</bean>

	<bean id="userMethodNameResolver"
		class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
			<props>
				<!-- /test/login.do 로 요청하면 userController 의 login 메서드를 호출 -->
				<prop key="/test/login.do">login</prop>
			</props>
		</property>
	</bean>

</beans>

 

 

[ Controller ]

 

...
public class UserController extends MultiActionController {
	public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String userID = "";
		String passwd = "";
		ModelAndView mav = new ModelAndView();
		request.setCharacterEncoding("utf-8");
		userID = request.getParameter("userID");
		passwd = request.getParameter("passwd");

		// 로그인 정보를 바인딩
		mav.addObject("userID", userID);
		mav.addObject("passwd", passwd);
		// ModelAndView 객체에 포워딩할 JSP 이름 설정
		mav.setViewName("result");
		return mav;
	}
	
...

 

 

[ JSP ]

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과창</title>
</head>
<body>
	<table border="1" width="50%" align="center">

		<tr align="center">
			<td>아이디</td>
			<td>비밀번호</td>
		</tr>
		<tr align="center">
			<td>${userID}</td>
			<td>${passwd}</td>
		</tr>
	</table>
</body>
</html>

 

JSP 에서는 바인딩 된 userID, passwd 의 정보를 브라우저에 출력해줍니다.

 

 

여기까지 임미다.

728x90