[์ฐธ๊ณ ๊ฐ์] ๊น์ํ๋์ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์
์๋ธ๋ฆฟ์ผ๋ก ๊ฐ๋ฐํ ๋๋ ๋ทฐ(View)ํ๋ฉด์ ์ํ HTML์ ๋ง๋๋ ์์
์ด ์๋ฐ ์ฝ๋์ ์์ฌ์ ์ง์ ๋ถํ๊ณ ๋ณต์กํ๋ค.
JSP๋ฅผ ์ฌ์ฉํ ๋๋ถ์ ๋ทฐ๋ฅผ ์์ฑํ๋ HTML ์์
์ ๊น๋ํ๊ฒ ๊ฐ์ ธ๊ฐ๊ณ , ์ค๊ฐ์ค๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ์๋ง ์๋ฐ ์ฝ๋๋ฅผ ์ ์ฉํ๋ค.
๊ทธ๋๋ ํด๊ฒฐ๋์ง ์๋ ๊ฒ์ด์๋ค.
ํ์ ์ ์ฅ JSP
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// request, response ์ฌ์ฉ ๊ฐ๋ฅ
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("save.jsp");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
%>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
์ฑ๊ณต
<ul>
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">๋ฉ์ธ</a>
</body>
</html>
์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฝ๋ ์์ ์ ๋ฐ์ ํ์์ ์ ์ฅํ๊ธฐ ์ํ ๋น์ฆ๋์ค ๋ก์ง์ด๊ณ ๋๋จธ์ง๋ HTML ๋ทฐ ์์ญ์ด๋ค.
java์ฝ๋, ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฝ๋ ๋ชจ๋๊ฐ JSP์ ๋
ธ์ถ๋์ด ์๋ค.
JSP ์ฝ๋ ์์ฒด๊ฐ ๋ฌด๊ฒ๊ณ ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ธฐ์ ์ ์ง๋ณด์๊ฐ ์ ๋ง ์ด๋ ต๋ค.
๊ทธ๋์ MVC ํจํด์ด ๋ฑ์ฅํ๋ค ๐ง
๋น์ฆ๋์ค ๋ก์ง์ ์๋ธ๋ฆฟ์ฒ๋ผ ๋ค๋ฅธ ๊ณณ์์ ์ฒ๋ฆฌํ๊ณ , JSP๋ ๋ชฉ์ ์ ๋ง๊ฒ HTML๋ก ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์ผ์ ์ง์คํ๋ค. ํ๋ฒ mvcํจํด์ ์ ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ๋ฆฌํฉํ ๋ง ํ๊ฒ ๋ค.
ํ๋์ ์๋ธ๋ฆฟ์ด๋ JSP๋ง์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ ๋ ๋๋ง๊น์ง ๋ชจ๋ ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด, ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ฒ๋๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค. ๐ฑ
UI์ ์ผ๋ถ๋ฅผ ์์ ํ๋ ์ผ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ์์ ํ๋ ์ผ์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ณ ๋๋ถ๋ถ ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฏ๋ก, ๋ณ๊ฒฝ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅธ ๋ถ๋ถ์ ํ๋์ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ง ์๋ค.
JSP ๊ฐ์ ๋ทฐ ํ ํ๋ฆฟ์ ํ๋ฉด์ ๋ ๋๋งํ๋๋ฐ ์ต์ ํ ๋์ด์๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์ ๋ฌด๋ง ๋ด๋นํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ด๋ค.
MVC ํจํด์ ์ง๊ธ๊น์ง ํ์ตํ ๊ฒ ์ฒ๋ผ ํ๋์ ์๋ธ๋ฆฟ์ด๋, JSP๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ปจํธ๋กค๋ฌ(Controller)์ ๋ทฐ(View)๋ผ๋ ์์ญ์ผ๋ก ์๋ก ์ญํ ์ ๋๋ ๊ฒ์ ๋งํ๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณดํต MVC ํจํด์ ์ฌ์ฉํ๋ค.
์ปจํธ๋กค๋ฌ
: HTTP ์์ฒญ์ ๋ฐ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋๋ค.
๋ชจ๋ธ
: ๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๋ค. ๋ทฐ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ชจ๋ธ์ ๋ด์์ ์ ๋ฌํด์ฃผ๋ ๋๋ถ์ ๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋๊ณ , ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ผ์ ์ง์คํ ์ ์๋ค.
๋ทฐ
๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋ค. ์ฌ๊ธฐ์๋ HTML์ ์์ฑํ๋ ๋ถ๋ถ์ ๋งํ๋ค.
์๋ธ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉํ๊ณ , JSP๋ฅผ ๋ทฐ๋ก ์ฌ์ฉํด์ MVC ํจํด์ ์ ์ฉํด๋ณด์.
Model์ HttpServletRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
request๋ ๋ด๋ถ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, request.setAttribute(), request.getAttribute()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์กฐํํ ์ ์๋ค.
ํ์๋ฑ๋ก ํผ - ์ปจํธ๋กค๋ฌ
@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/
new-form")
public class MvcMemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
๐ dispatcher.forward()
: ๋ค๋ฅธ ์๋ธ๋ฆฟ์ด๋ JSP๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฒ ๋ด๋ถ์์ ๋ค์ ํธ์ถ์ด ๋ฐ์ํ๋ค.
๐ /WEB-INF :์ด ๊ฒฝ๋ก ์์ JSP๊ฐ ์์ผ๋ฉด ์ธ๋ถ์์ ์ง์ JSP๋ฅผ ํธ์ถํ ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ๊ฒ์ ํญ์ ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด์ JSP๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
๐ redirect vs forward
๋ฆฌ๋ค์ด๋ ํธ๋ ์ค์ ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ )์ ์๋ต์ด ๋๊ฐ๋ค๊ฐ, ํด๋ผ์ด์ธํธ๊ฐ redirect ๊ฒฝ๋ก๋ก ๋ค์ ์์ฒญํ๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์งํ ์ ์๊ณ , URL ๊ฒฝ๋ก๋ ์ค์ ๋ก ๋ณ๊ฒฝ๋๋ค. ๋ฐ๋ฉด์ ํฌ์๋๋ ์๋ฒ ๋ด๋ถ์์ ์ผ์ด๋๋ ํธ์ถ์ด๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ํ ์ธ์งํ์ง ๋ชปํ๋ค.
ํ์ ๋ฑ๋ก ํผ - ๋ทฐ
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- ์๋๊ฒฝ๋ก ์ฌ์ฉ, [ํ์ฌ URL์ด ์ํ ๊ณ์ธต ๊ฒฝ๋ก + /save] -->
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">์ ์ก</button>
</form>
</body>
</html>
์ฌ๊ธฐ์ form์ action์ ๋ณด๋ฉด ์๋๊ฒฝ๋ก์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ์ฌ ๊ณ์ธต ๊ฒฝ๋ก: /servlet-mvc/members/
๊ฒฐ๊ณผ: /servlet-mvc/members/save
ํ์ ์ ์ฅ - ์ปจํธ๋กค๋ฌ
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/
save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);
//Model์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ค.
request.setAttribute("member", member);
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
} }
HttpServletRequest๋ฅผ Model๋ก ์ฌ์ฉํ๋ค.
request๊ฐ ์ ๊ณตํ๋ setAttribute()๋ฅผ ์ฌ์ฉํ๋ฉด request ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํด์ ๋ทฐ์ ์ ๋ฌํ ์ ์๋ค.
๋ทฐ๋ request.getAttribute()๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ฉด ๋๋ค.
ํ์ ์ ์ฅ - ๋ทฐ
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
</head>
<body> ์ฑ๊ณต
<ul>
<li>id=${member.id}</li>
<li>username=${member.username}</li>
<li>age=${member.age}</li>
</ul>
<a href="/index.html">๋ฉ์ธ</a>
</body>
</html>
JSP๋ ${} ๋ฌธ๋ฒ์ ์ ๊ณตํ๋๋ฐ, ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด request์ attribute์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์๋ค.
ํ์ ๋ชฉ๋ก ์กฐํ - ์ปจํธ๋กค๋ฌ
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/
members")
public class MvcMemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("MvcMemberListServlet.service");
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
} }
ํ์ ๋ชฉ๋ก ์กฐํ - ๋ทฐ
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/index.html">๋ฉ์ธ</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
members๋ฅผ JSP๊ฐ ์ ๊ณตํ๋ taglib๊ธฐ๋ฅ์ ์ฌ์ํด์ ๋ฐ๋ณตํ๋ฉด์ ์ถ๋ ฅ
<c:forEach> ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํด์ผ๋๋ค.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
MVCํจํด์ ์ ์ฉํ๋ฉด ์ปจํธ๋กค๋ฌ์ ์ญํ ๊ณผ ๋ทฐ๋ฅผ ๋ ๋๋ง ํ๋ ์ญํ ์ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
ํ์ง๋ง ์ปจํธ๋กค๋ฌ๋ฅผ ๋ณด๋ฉด ์ค๋ณต์ด ๋ง๊ณ , ํ์ํ์ง ์์ ์ฝ๋๋ค๋ ๋ง์ด ๋ณด์ธ๋ค.
ํฌ์๋ ์ค๋ณต
View๋ก ์ด๋ํ๋ ์ฝ๋๊ฐ ํญ์ ์ค๋ณต ํธ์ถ๋์ด์ผ ํ๋ค. ๋ฌผ๋ก ์ด ๋ถ๋ถ์ ๋ฉ์๋๋ก ๊ณตํตํํด๋ ๋์ง๋ง, ํด๋น ๋ฉ์๋๋ ํญ์ ์ง์ ํธ์ถํด์ผ ํ๋ค.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
ViewPath์ ์ค๋ณต
String viewPath = "/WEB-INF/views/new-form.jsp";
๋ง์ฝ jsp๊ฐ ์๋ thymeleaf ๊ฐ์ ๋ค๋ฅธ ๋ทฐ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด ์ ์ฒด ์ฝ๋๋ฅผ ๋ค ๋ณ๊ฒฝํด์ผ ํ๋ค.
์ฌ์ฉํ์ง ์๋ ์ฝ๋
๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋๋ ์๊ณ , ์ฌ์ฉํ์ง ์์ ๋๋ ์๋ค.
HttpServletRequest request, HttpServletResponse response
๊ณตํต ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค.
๊ธฐ๋ฅ์ด ๋ณต์กํด์ง ์๋ก ์ปจํธ๋กค๋ฌ์์ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ถ๋ถ์ด ์ ์ ๋ ์ฆ๊ฐํ ๊ฒ์ด๋ค.
์ ๋ฆฌํ๋ฉด ๊ณตํต ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค.
๊ทธ๋์ ํ์ํ ๊ฒ์ด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ๋์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ปจํธ๋กค๋ฌ ํธ์ถ ์ ์ ๊ณตํต ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ์์ ์๋ฌธ์ฅ ์ญํ ์ ํ๋ ๊ธฐ๋ฅ์ด๋ค. ์คํ๋ง MVC์ ํต์ฌ๋ ๋ฐ๋ก ์ด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ์๋ค.
๋ค์ ๊ธ์ ์ด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ๋ํด ์์๋ณด๊ฒ ๋ค ๐
๋นจ๋ฆฌ ํ๋ก์ ํธ ๊ฐ๋ฐํด๋ณด๊ณ ์ถ๋ค์ฉ ^-^