/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ | ๊น์ํ - ์ธํ๋ฐ
๊น์ํ | ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ํ์ํ ๋ชจ๋ ์น ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง MVC์ ํต์ฌ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต
www.inflearn.com
1. MVCํจํด ๊ฐ์
1) ๋๋ฌด ๋ง์ ์ญํ
- ํ๋์ ์๋ธ๋ฆฟ์ด๋ JSP๋ง์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ ๋ ๋๋ง๊น์ง ๋ชจ๋ ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด, ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ฒ ๋๊ณ
๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค.
(HTML ์ฝ๋ ํ๋ ์์ ํด์ผํ๋๋ฐ ์๋ฐฑ์ค์ ์๋ฐ ์ฝ๋๊ฐ ์๊ฑฐ๋, ๋น์ฆ๋์ค ๋ก์ง ํ๋๋ฅผ ์์ ํด์ผ ๋๋๋ฐ
์๋ฐฑ, ์์ฒ์ค์ HTML์ฝ๋๊ฐ ํจ๊ป ์๋ค๊ณ ์์ํด๋ณด๋ฉด ๋๋ค)
2) ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด
- ์ง์ง ๋ฌธ์ ๋ ๋ ์ฌ์ด์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅด๋ค๋ ์ ์ด๋ค. ์๋ฅผ๋ค์ด UI ์ผ๋ถ๋ฅผ ์์ ํ๋ ์ผ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์
์์ ํ๋ ์ผ์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ณ , ๋๋ถ๋ถ ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ด๋ ๊ฒ ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅธ ๋ถ๋ถ์ ํ๋์ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ง ์๋ค.
3) ๊ธฐ๋ฅ ํนํ
- ํนํ JSP ๊ฐ์ ๋ทฐ ํ ํ๋ฆฟ์ ํ๋ฉด์ ๋ ๋๋ง ํ๋๋ฐ ์ต์ ํ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ถ๋ถ์ ์ ๋ฌด๋ง ๋ด๋นํ๋ ๊ฒ์ด ๊ฐ์ฅ
ํจ๊ณผ์ ์ด๋ค.
4) Model View Controller
- MVC ํจํด์ ์ง๊ธ๊น์ง ํ์ตํ ๊ฒ ์ฒ๋ผ ํ๋์ ์๋ธ๋ฆฟ, JSP๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ปจํธ๋กค๋ฌ์ ๋ทฐ๋ผ๋ ์์ญ์ผ๋ก ์๋ก ์ญํ ์
๋๋ ๊ฒ์ ๋งํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต MVC ํจํด์ ์ฌ์ฉํ๋ค
- Controller : HTTP ์์ฒญ์ ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ
์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋๋ค
- Model : ๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๋ค. ๋ทฐ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ชจ๋ธ์ ๋ด์์ ์ ๋ฌํด์ฃผ๋ ๋๋ถ์ ๋ทฐ๋ ๋น์ฆ๋์ค
๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋๋ฉฐ, ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ผ์ ์ง์คํ ์ ์๋ค.
- View : ๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋ค. = HTML
* ์ปจํธ๋กค๋ฌ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์๋ ์์ง๋ง ๊ทธ๋ ๊ฒ ๋๋ฉด ๋๋ฌด ๋ง์ ์ญํ ์ ๋ด๋นํ๋ฏ๋ก '์๋น์ค(Service)' ๋ผ๋ ๊ณ์ธต์
๋ณ๋๋ก ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค๋ฅผ ํธ์ถํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
2. MVCํจํด ์ ์ฉ
- ์๋ธ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉํ๊ณ , JSP๋ฅผ ๋ทฐ๋ก ์ฌ์ฉํด์ MVCํจํด์ ์ ์ฉํด๋ณด์
1) ํ์ ๋ฑ๋ก ํผ
ํ์ ๋ฑ๋ก ํผ - ์ปจํธ๋กค๋ฌ
@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๋ฅผ ํธ์ถํ ์ ์๋ค.
- redirct / forward : ๋ฆฌ๋ค์ด๋ ํธ๋ ์ค์ ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ )์ ์๋ต์ด ๊ฐ๋ค๊ฐ ํด๋ผ์ด์ธํธ๊ฐ redirect ๊ฒฝ๋ก๋ก ๋ค์
์์ฒญํ๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์งํ ์ ์๊ณ URL๋ ๋ณ๊ฒฝ๋๋ค. ๋ฐ๋ฉด์ forward๋ ์๋ฒ ๋ด๋ถ์์ ์ผ์ด๋๋ ํธ์ถ์ด๊ธฐ
๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ํ ์ธ์งํ์ง ๋ชปํ๋ค.
ํ์ ๋ฑ๋ก ํผ - ๋ทฐ
<%@ 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์ ๋ณด๋ฉด ๊ฒฝ๋ก๊ฐ '/' ๋ก ์์ํ์ง ์์ ์๋๊ฒฝ๋ก์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ ๊ฒ ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด,
ํผ ์ ์ก์ ํ์ฌ URL์ด ์ํ ๊ณ์ธต ๊ฒฝ๋ก + save๊ฐ ํธ์ถ๋๋ค
* ํ์ฌ ๊ณ์ธต ๊ฒฝ๋ก : /servlet-mvc/members/
* ๊ฒฐ๊ณผ : /servelt-mvc/members/save
2) ํ์ ์ ์ฅ
ํ์ ์ ์ฅ - ์ปจํธ๋กค๋ฌ
@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);
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);
}
}
- request๊ฐ ์ ๊ณตํ๋ setAttribute()๋ฅผ ์ฌ์ฉํ๋ฉด request ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํด์ ๋ทฐ์ ์ ๋ฌํ ์ ์๋ค.
ํ์ ์ ์ฅ - ๋ทฐ
<%@ 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>
- <%= request.getAttribute("member") %>๋ก ๋ชจ๋ธ์ ์ ์ฅํ member ๊ฐ์ฒด๋ฅผ ๊บผ๋ผ ์ ์์ง๋ง ๋ณต์กํ๋ค.
JSP๋ ${ } ๋ฌธ๋ฒ์ ํตํ์ฌ attribute์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์๋ค.
3) ํ์ ๋ชฉ๋ก ์กฐํ
ํ์ ๋ชฉ๋ก ์กฐํ - ์ปจํธ๋กค๋ฌ
@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 {
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>
3. MVCํจํด ํ๊ณ
- MVC ํจํด์ ์ ์ฉํ ๋๋ถ์ ์ปจํธ๋กค๋ฌ์ ์ญํ ๊ณผ ๋ทฐ๋ฅผ ๋ ๋๋งํ๋ ์ญํ ์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ปจํธ๋กค๋ฌ๋ ๋ฑ ๋ด๋ ์ค๋ณต์ด ๋ง๊ณ , ํ์ํ์ง ์๋ ์ฝ๋๋ค๋ ๋ง์ด ๋ณด์ธ๋ค
MVC ์ปจํธ๋กค๋ฌ์ ๋จ์
1) ํฌ์๋ ์ค๋ณต
: view๋ก ์ด๋ํ๋ ์ฝ๋๊ฐ ํญ์ ์ค๋ณต ํธ์ถ๋์ด์ผ ํ๋ค. ๋ฌผ๋ก ์ด ๋ถ๋ถ์ ๋ฉ์๋๋ก ๊ณตํตํ ํด๋ ๋์ง๋ง,
๋ฉ์๋๋ ํญ์ ์ง์ ํธ์ถํด์ผ ํ๋ค.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
2) ViewPath ์ค๋ณต
String viewPath = "/WEB-INF/views/members.jsp";
3) ์ฌ์ฉํ์ง ์๋ ์ฝ๋
HttpServletRequest request, HttpServletResponse response
4) ๊ณตํต์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค
: ๊ธฐ๋ฅ์ด ๋ณต์กํด์ง์๋ก ์ปจํธ๋กค๋ฌ์์ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ถ๋ถ์ด ์ ์ ๋ ๋ง์ด ์ฆ๊ฐํ ๊ฒ์ด๋ค. ๋จ์ํ ๊ณตํต ๊ธฐ๋ฅ์
๋ฉ์๋๋ก ๋ฝ์ผ๋ฉด ๋ ๊ฒ ๊ฐ์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ํญ์ ํธ์ถํด์ผ ํ๋ค.
* ์ ๋ฆฌํ์๋ฉด ๊ณตํต ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ปจํธ๋กค๋ฌ ํธ์ถ ์ ์ ๋จผ์ ๊ณตํต ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํด์ผ ํ๋ค. Front Controller ํจํด์ ๋์ ํ๋ฉด
์ด๋ฐ ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค(์ ๊ตฌ๋ฅผ ํ๋๋ก). ์คํ๋ง MVC์ ํต์ฌ๋ ๋ฐ๋ก ์ด ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ์๋ค๊ณ ํ๋ค!