1. 스프링 프레임워크 MVC의 특징
스프링 프레임워크는 웹 애플리케이션 개발에 필요한 여러 가지 기능을 미리 만들어서 제공한다.
스프링에서 지원하는 MVC 기능의 특징
- 모델2 아키텍처를 지원
- 스프링과 다른 모듈과의 연계가 쉬움
- 타일즈나 사이트메시같은 View 기술과의 연계가 쉬움
- 태그 라이브러리를 통해 message 출력, theme 적용 그리고 입력 폼을 보다 쉽게 구현
스프링 프레임워크 MVC구성 요소
구성요소 | 설명 |
DispatcherServlet | 클라이언트의 요청을 전달받아 해당 요청에 대한 컨트롤러를 선택하여 클라이언트의 요청을 전달합니다. 또한 컨트롤러가 반환한 값을 View에 전달하여 알맞은 응답을 생성합니다. |
HandlerMapping | 클라이언트가 요청한 URL을 처리할 컨트롤러를 지정합니다. |
Controller | 클라이언트의 요청을 처리한 후 그 결과를 DispatcherServlet에 전달합니다. |
ModelAndView | 컨트롤러가 처리한 결과 및 뷰 선택에 필요한 정보를 저장합니다. |
ViewResorlver | 컨트롤러의 처리 결과를 전달할 뷰를 지정합니다. |
View | 컨트롤러의 처리 결과 화면을 생성합니다. |
1. 브라우저가 DispatcherServlet에 URL로 접근하여 해당 정보를 요청
2. 핸들러 맵핑에서 해당 요청에 대해 매핑된 컨트롤러가 있는지 요청
3. 매핑된 컨트롤러에 대해 처리를 요청
4. 컨트롤러가 클라이언트의 요청을 처리한 결과와 View 이름을 ModelAndView에 저장해서 DispatcherServlet으로 반환
5. DispatcherServlet에서는 컨트롤러에서 보내온 View 이름을 ViewResolver로 보내 해당 View를 요청
6. ViewResorvler는 요청한 View를 보냄
7. View의 처리 결과를 DispatcherServlet으로 보냄
8. DispatcherServlet은 최종 결과를 브라우저로 전송
2. SimpleUrlController 스프링 MVC
브라우저에서 요청한 URL(http://localhost:8090/pro21/test/index.do)에 대해 매핑된 컨트롤러를 선택하고 요청명에 대한 JSP파일을 브라우저로 전송하는 과정이다.
1. 브라우저에서 http://localhost:8090/pro21/test/index.do로 요청합니다.
2. DispatcherServlet은 요청에 대해 미리 action-servlet.xml에 매핑된 SimpleUrlController 를 요청합니다.
3. 컨트롤러는 요청에 대해 test 폴더에 있는 index.jsp를 브라우저로 전송합니다.
서블릿에서는 브라우저 요청 처리 시 서블릿에서 제공하는 메서드를 이용해 요청명을 일일이 가져왔다. 그러나 스프링에서는 브라우저의 요청을 쉽게 가져올 수 있는 여러 가지 기능을 제공한다.
3. MultiActionController 이용해 스프링 MVC 실습하기
MultiActionController를 이용해 요청을 처리하려면각 요청명에 대해 다시 스프링의 Controller인터페이스를 구현한 각각의 컨트롤러 클래스를 만들어야 한다. 하지만 MultiActionController를 이용하면 여러 요청명에 대해 한 개의 컨트롤러에 구현된 각 메서드로 처리할 수 있어 편리하다
실습에 사용되는 스프링 클래스
클래스 | 설명 |
MultiActionController | URL 요청명으로 바로 컨트롤러를 지정해서 사용할 수 있습니다. |
PropertiesMethodNameResolver | URL 요청명으로 컨트롤러의 설정 파일에서 미리 설정된 메서드를 바로 호출해서 사용할 수 있습니다. |
InternalResourceViewResolver | JSP나 HTML 파일과 같이 웹 애플리케이션의 내부 자원을 이용해 뷰를 생성하는 기능을 제공합니다. 기본적으로 사용하는 View 클래스이며 prefix와 suffix 프로퍼티를 이용해 경로를 지정할 수 있습니다. |
MultiActionController 실습에 사용되는 파일들
파일 | 설명 |
web.xml | 브라우저에서 *.do로 요청하면 스프링의 DispatcherServlet 클래스가 요청을 받을 수 있게 서블릿 매핑을 설정합니다. |
action-servlet.xml | 스프링에서 필요한 빈들은 설정합니다. |
UserController.java | 매핑된 요청에 대해 컨트롤러의 기능을 수행합니다. |
loginForm.jsp | 로그인창입니다. |
result.jsp | 로그인 결과를 보여주는 JSP입니다. |
action-servlet.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="simpleUrlController"
class="com.spring.ex01.SimpleUrlController" />
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test/index.do">simpleUrlController</prop>
</props>
</property>
</bean>
<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>
<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>
<prop key="/test/login.do">login</prop>
<prop key="/test/memberInfo.do">memberInfo</prop>
</props>
</property>
</bean>
</beans>
브라우저에서 /test/*.do로 호출하면 userUrlMapping 빈을 이용해 userController 빈을 호출한다.
userController 빈의 methodNameResolver 프로퍼티에는 userMethodNameResolver가 주입되어 있으므로 /test/login.do로 요청하면 userController 빈의 login 메서드를 호출한다.
또한 userMethodNameResolver는 스프링의 PropertiesMethodNameResolver 클래스를 이용해 요청명에 대해 호출할 메서드를 바로 지정한다.
UserController.java
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");
//ModelAndView에 로그인 정보를 바인딩한다
mav.addObject("userID", userID);
mav.addObject("passwd", passwd);
//ModelAndView 객체에 포워딩할 JSP이름을 설정한다
mav.setViewName("result");
return mav;
}
}
UserController 클래스는 MultiAction Controller를 상속받음으로써 지정한 요청명에 대해 바로 메서드를 호출할 수 있으며 ModelAndView 객체에 JSP에 전달할 값을 바인딩할 수 있다.
ModelAndView 객체를 이용하면 더 이상 request 객체에 바인딩해서 포워딩할 필요가 없고, 문자열 이외의 다른 객체들도 ModelAndView 객체에 바인딩할 수 있다.
따라서 ModelAndView의 setViewName()메서드를 이용해 JSP 이름을 설정한 후 반환한다
loginForm.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" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="${contextPath}/test/login.do">
<table border="1" width="80%" align="center" >
<tr align="center">
<td>아이디</td>
<td>비밀번호</td>
</tr>
<tr align="center">
<td>
<input type="text" name="userID" value="" size="20">
</td>
<td>
<input type="password" name="passwd" value="" size="20">
</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="로그인" >
<input type="reset" value="다시입력" >
</td>
</tr>
</table>
</form>
</body>
</html>
result.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>
참고 : ⌜자바 웹을 다루는 기술⌟ 책을 공부하며 요약・정리한 내용입니다.
'💻 Web_Back end > Spring' 카테고리의 다른 글
스프링 트랜잭션 기능 (0) | 2023.05.22 |
---|---|
스프링 JDBC 기능 (0) | 2023.05.16 |
스프링 AOP (Aspect-Oriented Programming) 관점 지향 프로그래밍 기능 (0) | 2023.05.07 |
스프링 의존성 주입과 제어 역전 기능 (DI와 IoC) (0) | 2023.05.07 |
스프링 프레임워크 시작하기 (0) | 2023.05.06 |