2021. 11. 24. 14:14ใSpring
๊ทธ๋์ Spring ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ํด์๋ ์ฌ์ฉ์ ๊ด๋ฆฌ ํ๋ก์ ํธ๋ฅผ
์ด์ ๊ฐ๋จํ์ง๋ง ํ๋ฉด ๊ตฌํ๊น์ง ํด์ ๋ง๋ค์ด ๋ณผ ์์ ์ด๋ค.
Spring MVC Model2 ๋ฅผ ํ์ฉํด์ ํ ์์ ์ด๋ค.
1. Users ํ ์ด๋ธ
Users ํ ์ด๋ธ์ userid, name, gender, city๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
2. ์๋น์ค ๊ณ์ธต
UserService ์ธํฐํ์ด์ค์ ์ด๋ฅผ ๊ตฌํํ UserServiceImple๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
1๏ธโฃ UserService
2๏ธโฃ UserServicImple
3. ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต
UserDAO ์ธํฐํ์ด์ค์ ์ด๋ฅผ ๊ตฌํํ UserDAOJDBC
1๏ธโฃ UserDAO
2๏ธโฃ UserDAOJDBC
4. Mapping ํ์ผ
5. MyBatis-Config ํ์ผ
6. Mapper ์ธํฐํ์ด์ค
7. ๋น ์ค์ ํ์ผ
1๏ธโฃ DataSource ์ค์
์ด๋ property ํ์ผ์ ์ฌ์ฉํด์ ๋ฐ์ดํฐ ๊ฐ์ ์ ๋ ฅํด์ค ๋๋ <context:property-placeholder> ํ๊ทธ๋ฅผ ์ฌ์ฉํด ํด๋น ํ์ผ์ ์์น๋ฅผ ์ง์ ํด์ค์ผํ๋ค.
2๏ธโฃ MyBatis ์ค์
SqlSessionFactoryBean ์ ๋น ์ค์ ํ์ผ์ ๋ฑ๋กํด์ค ๋ dataSource์ myBatis ์ค์ ํ์ผ ๊ฒฝ๋ก, ๊ทธ๋ฆฌ๊ณ Mappingํ์ผ์ ๊ฒฝ๋ก๊น์ง ์ง์ ํด์ค์ผํ๋ค.
SqlSessionTemplate๋ ๋น์ค์ ํ์ด๋ ๋ฑ๋กํด์ค๋ค.
8. Spring MVC ๊ธฐ๋ฐ ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
1๏ธโฃ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ฐ๋ DispatcherServlet์ web.xml์ ์ค์ ํ๋ค.
์ฌ์ค Spring mvc project๋ก ๋ง๋ ํ๋ก์ ํธ๋ผ๋ฉด ์ด๊ฑด ๋ชจ๋ ์์ฑ๋์ด ์์๊ฑฐ๋ผ ๋ฐ๋ก ์ถ๊ฐํ์ง๋ ์์๋ ๋๋ค.
โญ๋์ ํ๊ธ ์ธ์ฝ๋ฉ์ ์ํด์ ์ด ์ฝ๋๋ ๋ฐ์ ์ถ๊ฐํด์ฃผ๊ธฐ!
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2๏ธโฃ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ Controller๋ฅผ ์์ฑํ๋ค.
3๏ธโฃ Spring Bean์ผ๋ก Controller ๋ฅผ ๋ฑ๋กํ๋ค.
@Controller๋ก ์ง์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์
ํจํค์ง๋ช ๋ง ์ ์์ฑํด์ค๋ค.
4๏ธโฃ JSP์ ์ด์ฉํ View ์์ญ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
5๏ธโฃ ๋ธ๋ผ์ฐ์ ์์์ jsp๋ฅผ ์คํํด๋ณธ๋ค.
9. Spring MVC ๊ธฐ๋ฐ์ ์ฌ์ฉ์ ๊ด๋ฆฌ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
1๏ธโฃ ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ POJO ํํ์ UserController ํด๋์ค ์์ฑ
- Controller ํด๋์ค์ @Controller ์ด๋ ธํ ์ด์ ์ ์ ์ธ
- ์ฌ์ฉ์ ๋ชฉ๋ก์ ์กฐํํ๋ getUserList() ๋ฉ์๋๋ฅผ ์ ์ธํ๊ณ , @RequestMapping ์ด๋ ธํ ์ด์ ์ ์ ์ธํ๋ค.
- userList.jsp ํ์ด์ง์ View ์์ญ์ ์ฝ๋๋ฅผ ์์ฑ
- ๋ธ๋ผ์ฐ์ ์์์ jsp ์คํํ๋ค.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>UserList</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2 class="text-center">์ฌ์ฉ์ ๋ชฉ๋ก </h2>
<table class="table table-bordered table table-hover">
<thead>
<tr>
<th>์์ด๋ </th>
<th>์ด๋ฆ</th>
<th>์ฑ๋ณ</th>
<th>๊ฑฐ์ฃผ์ง</th>
<th> </th>
<th> </th>
</tr>
</thead>
<tbody>
<c:forEach var="user" items="${userlist }">
<tr>
<td>
<a href = "getUser.do?id=${user.userid}"> ${user.userid} </a>
</td>
<td>${user.name}</td>
<td>${user.gender} </td>
<td>${user.city}</td>
<td>
<a href="updateUserForm.do?id=${user.userid }">์์ </a>
</td>
<td>
<a href="deleteUser.do/${user.userid }">์ญ์ </a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="7">
<a href="insertUserForm.do">์ฌ์ฉ์ ๋ฑ๋ก</a>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
โ ViewResolver
ViewResolver๋ Controller์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ค view์ ๋ณด์ฌ์ค ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
InternalResourceViewResolver๋ jsp๋ฅผ ์ฌ์ฉํ์ฌ view๋ฅผ ์์ฑํ๋ค.
prefix๋ Controller๊ฐ ๋ฆฌํดํ view ์ด๋ฆ ์์ ๋ถ์ ์ ๋์ด์ด๋ค.
suffix๋ Controller๊ฐ ๋ฆฌํดํ view์ด๋ฆ ๋ค์ ๋ถ์ ํ์ฅ์์ด๋ค. jsp ๋ผ๊ณ ํด์ฃผ๋ฉด ์ด์ returnํ ๋ ๋ง๋ค .jsp๋ฅผ ๋ถ์ด์ง ์์๋ ๋๋ค.
2๏ธโฃ ํน์ ์ฌ์ฉ์ ์กฐํ
- ์ฌ์ฉ์ ๋ชฉ๋ก์ ์กฐํํ๋ getUser(String id) ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ @RequestMapping ๊ณผ @RequestParam ์ด๋ ธํ ์ด์ ์ ์ ์ธํ๋ค.
โ @RequestParam ์ http ์์ฒญ์ ํฌํจ๋ ํ๋ผ๋ฏธํฐ ์ฐธ์กฐ์ ์ฌ์ฉํ๋ค.
- userList.jsp ํ์ด์ง๋ฅผ ์์ ํ๋ค.
- userInfo.jsp ํ์ด์ง์ view ์์ญ์ ์ฝ๋ ์์ฑ
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${user.userid }์ฌ์ฉ์ ์์ธ ์ ๋ณด</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2 class="text-center">์ฌ์ฉ์ ์์ธ ์ ๋ณด</h2>
<table class ="table table-bordered table table-hover">
<tr><td>์์ด๋ : </td><td>${user.userid }</td></tr>
<tr><td>์ด๋ฆ :</td><td>${user.name }</td></tr>
<tr><td>์ฑ๋ณ :</td><td>${user.gender }</td></tr>
<tr><td>๊ฑฐ์ฃผ์ง : </td><td>${user.city }</td></tr>
</table>
</div>
</body>
</html>
- ๋ธ๋ผ์ฐ์ ์์์ jsp๋ฅผ ์คํ
โ ModleAndView ํด๋์ค
Controller์์ Service์์ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ View์ ์ ๋ฌํ๊ธฐ ์ํด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ์ ํ๋ฉด ์ ๋ณด๋ฅผ ModelAndView ๊ฐ์ฒด์ ์ ์ฅํ๋ค.
3๏ธโฃ ์ฌ์ฉ์ ์ ๋ณด ๋ฑ๋ก ํ๋ฉด
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ ํ๋ฉด์ ํฌ์๋ฉ ํด์ฃผ๋ insertUserForm() ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ @RequestMapping ์ด๋ ธํ ์ด์ ์ ์ ์ธ
-> ArrayList์ ๊ฐ๊ฐ ์ฑ๋ณ๊ณผ ๋์์ ๋ํ ์ ๋ณด๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ์ด๋ฅผ userInsert ํ๋ฉด์ ์ ๋ฌํด์ฃผ๋ฉด ์ด๋ฅผ ํ๋ฉด์์ ์ถ๋ ฅํด์ค๋ค.
- userList.jsp ํ์ด์ง๋ฅผ ์์
- userInsert.jsp ํ์ด์ง์์ View ์์ญ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>์ฌ์ฉ์ ์ ๋ณด ๋ฑ๋ก</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2 class="text-center">์ฌ์ฉ์ ์ ๋ณด ๋ฑ๋ก</h2>
<div>
<form method="post" action="insertUser.do">
<table class="table table-bordered table table-hover">
<tr>
<td>์์ด๋</td>
<td><input type="text" name="userid"/></td>
</tr>
<tr>
<td>์ด๋ฆ</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>์ฑ๋ณ</td>
<td>
<c:forEach var="genderName" items="${map.genderList }">
<input type="radio" name="gender" value="${genderName }">${genderName }
</c:forEach>
</td>
</tr>
<tr>
<td>๊ฑฐ์ฃผ์ง</td>
<td>
<select name="city">
<c:forEach var="cityName" items="${map.cityList }">
<option value="${cityName }">${cityName }</option>
</c:forEach>
</select>
</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<input type="submit" value="๋ฑ๋ก"/>
</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<a href="getUserList.do">์ฌ์ฉ์ ๋ชฉ๋ก ๋ณด๊ธฐ</a>
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
</html>
map์ ๋ด๊ฒจ ์ ๋ฌ๋ genderList์ cityList๋ฅผ ๋ฐ์ ํ๋ฉด์ ์ถ๋ ฅํด์ค.
- ๋ธ๋ผ์ฐ์ ์์์ jsp๋ฅผ ์คํ
4๏ธโฃ ์ฌ์ฉ์ ์ ๋ณด ๋ฑ๋ก
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ insertUser(@ModelAttribute UserVO user) ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ @RequestMapping๊ณผ @ModelAttribute ์ด๋ ธํ ์ด์ ์ ์ ์ธํ๋ค.
๋ฑ๋กํ์ ๋ชฉ๋ก ์กฐํ๊ฐ redirect ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฑ๋ก๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋๋ก ํด์ผํ๋ค.
โ @ModelAttribute
http ์์ฒญ์ ํฌํจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ชจ๋ธ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉํด์ค๋ค.
- userInsert.jsp ํ์ด์ง์ View ์์ญ์ ์ฝ๋๋ฅผ ์์ฑ
- ๋ธ๋ผ์ฐ์ ์์์ jsp ์คํ
5๏ธโฃ ์ฌ์ฉ์ ์์ ํ๋ฉด
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๋ ํ๋ฉด์ ํฌ์๋ฉ ํด์ฃผ๋ updateUserForm(@RequestParam String id) ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ
@RequestMapping ๊ณผ @RequestParma ์ด๋ ธํ ์ด์ ์ ์ ์ธ
-> ์ฌ์ฉ์ ํ๋ฉด์ ์์ ํ ๋๋ ์ฐ์ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ์ ๋ ฅ๋์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ UserVO ๊ฐ์ฒด๋ ๋ด๊ณ , ์๊น ์ฌ์ฉ์ ๋ฑ๋กํ๋ฉด์์ ์์ฑํ๋ genderList์ cityList๋ ํฌํจํด์ Map์ ์ ์ฅํ์ฌ userUpdate.jsp์ ๋ณด๋ธ๋ค.
-userList.jsp ํ์ด์ง ์์
- userUpdate.jsp ํ์ด์ง์์ View ์์ญ์ ์ฝ๋๋ฅผ ์์ฑ
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>์ฌ์ฉ์ ์ ๋ณด ์์ </title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2 class="text-center">์ฌ์ฉ์ ์ ๋ณด ์์ </h2>
<div>
<form method="post" action="updateUser.do">
<input type="hidden" name="userid" value="${map.user.userid }"/>
<table class="table table-bordered table table-hover">
<tr>
<td>์์ด๋</td>
<td>${map.user.userid }</td>
</tr>
<tr>
<td>์ด๋ฆ</td>
<td><input type="text" name="name" value="${map.user.name }"/> </td>
</tr>
<tr>
<td>์ฑ๋ณ</td>
<td>
<c:forEach var="genderName" items="${map.genderList }">
<c:choose>
<c:when test="${genderName eq map.user.gender }">
<input type="radio" name="gender" value="${genderName }" checked="checked"> ${genderName }
</c:when>
<c:otherwise>
<input type="radio" name="gender" value="${genderName }"> ${genderName }
</c:otherwise>
</c:choose>
</c:forEach>
</td>
</tr>
<tr>
<td>๊ฑฐ์ฃผ์ง</td>
<td>
<select name="city">
<c:forEach var="cityName" items="${map.cityList }">
<c:choose>
<c:when test="${cityName eq map.user.city }">
<option value="${cityName }" selected> ${cityName } </option>
</c:when>
<c:otherwise>
<option value="${cityName }">${cityName }</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<input type="submit" value="์์ ">
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
</html>
-> hidden์ ํ๋ ์ด์ ๋ ์์ ํ๊ณ submit ๋ฒํผ์ ๋๋ฅผ ๋ userid๊ฐ๋ ์ ๋ฌ์ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ !!!
userid๋ ์์ ๋ถ๊ฐ๋ผ ์์ ํ ์ ์๋๋ก ๊ณ ์ ํด์ ํ๋ฉด์ ๋ณด์ฌ์ง๋ค.
- ๋ธ๋ผ์ฐ์ ์์์ jsp ๋ฅผ ์คํ
6๏ธโฃ ์ฌ์ฉ์ ์์
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๋ ํ๋ฉด์ ํฌ์๋ฉ ํด์ฃผ๋ updateUser(@ModelAttribute UserVo user) ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ ,
@RequestMapping ๊ณผ @ModelAttribute ์ด๋ ธํ ์ด์ ์ ์ ์ธํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ํ์๋ ๋ค์ ๋ชฉ๋ก์กฐํ๊ฐ redirect ๋๋๋ก ํ์ฌ, ์์ ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋๋ก ํด์ผํ๋ค.
- userUpdate.jsp ํ์ด์ง์ view ์์ญ ์ฝ๋ ์์ฑ
- ๋ธ๋ผ์ฐ์ ์์์ jsp ๋ฅผ ์คํ
7๏ธโฃ ์ฌ์ฉ์ ์ ๋ณด ์ญ์
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ deleteUser(@pathVariable String id) ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ @RequestMapping ๊ณผ @PathVariable ์ด๋ ธํ ์ด์ ์ ์ ์ธ
โ @PathVariable
ํ๋ผ๋ฏธํฐ๋ฅผ url ํ์์ผ๋ก ๋ฐ์ ์ ์๋๋ก ํด์ค๋ค.
- userList.jsp ํ์ด์ง๋ฅผ ์์
- ๋ธ๋ผ์ฐ์ ์์์ jsp ๋ฅผ ์คํ