๐ MVC ํจํด ์ฌ์ฉ ์ด์ ?
- ๋๋ฌด ๋ง์ ์ญํ : ํ๋์ ํ์ผ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ณ ๋ทฐ ๋ ๋๋ง๊น์ง ์ฒ๋ฆฌํ๋ฉด ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
- ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด : ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ ๋ ๋๋ง์ ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅด๋ฏ๋ก ํ ํ์ผ์ ๋๋ฉด ์ ์ง๋ณด์ํ๊ธฐ ์ข์ง ์๋ค.
- ๊ธฐ๋ฅ ํนํ : JSP๋ ๋ทฐ ํ ํ๋ฆฟ์ผ๋ก ํ๋ฉด์ ๋ ๋๋งํ๋๋ฐ ์ต์ ํ ๋์ด์๋ค.
๐ Model-View-Controller

- ์ปจํธ๋กค๋ฌ : HTTP ์์ฒญ์ ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋ ์ญํ ์ ํ๋ค.
- ๋ชจ๋ธ : ์ปจํธ๋กค๋ฌ๊ฐ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ทฐ์ ์ ๋ฌํ๋ค. ๋ทฐ๋ ๋๋ถ์ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋๊ณ , ํ๋ฉด์ ๋ ๋๋งํ๋ ์ผ์ ์ง์คํ ์ ์๋ค.
- ๋ทฐ : ๋ชจ๋ธ์ ๋ด๊ฒจ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด์ ์ถ๋ ฅํ๋ค.
โป์ฐธ๊ณ โป
์ผ๋ฐ์ ์ผ๋ก ์ค๋ฌด์์ ๋น์ฆ๋์ค ๋ก์ง์ ์๋น์ค๋ผ๋ ๊ณ์ธต์ ๋ณ๋๋ก ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๊ณ , ์ปจํธ๋กค๋ฌ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค๋ฅผ ํธ์ถํ๋ ์ญํ ์ ํ๋ค.
๐ ์๋ธ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๋ก, JSP๋ฅผ ๋ทฐ๋ก ์ฌ์ฉํ๊ธฐ
๊ธฐ์กด์ ๊ตฌํํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ MVC ํจํด์ ์ ์ฉํด์ ๋ฆฌํฉํ ๋ง ํด๋ณด์!
โ ํ์ ๋ฑ๋ก ํผ - ์ปจํธ๋กค๋ฌ (Servlet)
@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);// controller์์ view๋ก ์ด๋ํ ๋ ์ฌ์ฉ
dispatcher.forward(request, response);
}
}
- dispatcher.forward() : ๋ค๋ฅธ ์๋ธ๋ฆฟ ๋๋ JSP๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฒ ๋ด๋ถ์์ ๋ค์ ํธ์ถ์ด ๋ฐ์ํ๋ค. (๋ฆฌ๋ค์ด๋ ์ X)
โป ์ฐธ๊ณ โป
redirect vs forward
- redirect: ์น ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ํธ์ถ์ด ๋๋ฒ ๋ฐ์. ์ฒ์ ํธ์ถ + ๋ฆฌ๋ค์ด๋ ์ ์ ์ฌํธ์ถ, ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ง ๊ฐ๋ฅ
- forward: ์น ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ํธ์ถ์ ํ๋ฒ๋ง ๋ฐ์. ์๋ฒ ๋ด๋ถ์์ ์ฌ๋ฌ ํธ์ถ์ด ๋ฐ์, ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ง ๋ถ๊ฐ
โ ํ์ ๋ฑ๋ก ํผ - ๋ทฐ (JSP)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">์ ์ก</button>
</body>
</html>
- JSP ํ์ผ์ด /WEB-INF ๊ฒฝ๋ก์ ์์ผ๋ฉด ์ธ๋ถ์์ ์ง์ JSP๋ฅผ ํธ์ถํ ์ ์๋ค. ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ํธ์ถํ๋ ค๋ฉด ์ด ๊ฒฝ๋ก์ ํ์ผ์ ๋๋ค.
โ ํ์ ์ ์ฅ - ์ปจํธ๋กค๋ฌ (Servlet)
@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);
}
}
- HttpServletRequest ๊ฐ์ฒด๋ฅผ Model๋ก ์ฌ์ฉํ๋ค.
- request.setAttribute() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ดํ๊ณ , ๋ทฐ๋ก ์ ๋ฌํ๋ค.
- ์ด๋ key=์ด๋ฆ, value=member ํ์์ผ๋ก ์ ์ฅ๋๋ค.
โ ํ์ ์ ์ฅ - ๋ทฐ (JSP)
<ul>
<!--(Member)(request.getAttribute("member")).getId()์ ๋๊ฐ์ ์ญํ -->
<li>id=${member.id}</li>
<li>username=${member.username}</li>
<li>age=${member.age} </li>
</ul>
- JSP๊ฐ ์ ๊ณตํ๋ ${ } ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ request์ attribute์ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์๋ค.
โ ํ์ ๋ชฉ๋ก - ์ปจํธ๋กค๋ฌ (Servlet)
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
- List๋ฅผ ์์ฑํด์ ๋ชจ๋ธ์ ๋ณด๊ดํ๋ค.
โ ํ์ ๋ชฉ๋ก - ๋ทฐ (JSP)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:forEach var="item" items="${members}"> <!--model์ attribure ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ด-->
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
- ๋ชจ๋ธ์ ๋ด์๋ ๋ฆฌ์คํธ๋ฅผ JSP๊ฐ ์ ๊ณตํ๋ taglib ๊ธฐ๋ฅ์ ์ฌ์ฉํด for๋ฌธ์ ๋๋ฆฐ ๊ฒ ์ฒ๋ผ ์ถ๋ ฅํ๋ค.
- members ๋ฆฌ์คํธ์์ member๋ฅผ ์์๋๋ก ๊บผ๋ด item ๋ณ์์ ๋ด์ ์ถ๋ ฅํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฒซ์ค์ฒ๋ผ ์ ์ธํด์ฃผ์ด์ผ ํ๋ค.
- JSP์ ๊ฐ์ ๋ทฐ ํ ํ๋ฆฟ์ ์ด๋ ๊ฒ ํ๋ฉด์ ๋ ๋๋งํ๋๋ฐ ํนํ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๐ ์๋ธ๋ฆฟ๊ณผ JSP๋ก MVC ํจํด ๊ตฌํ ์ ํ๊ณ
์ปจํธ๋กค๋ฌ์ ๋ทฐ ๋ ๋๋ง ์ญํ ์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ์ง๋ง, ์ปจํธ๋กค๋ฌ์ ์ค๋ณต๋๋ ์ฝ๋๊ฐ ๋ง๋ค.
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
- forward ์ค๋ณต : dispatcher๋ฅผ ๊ฐ์ ธ์ view๋ก ์ด๋ํ๊ธฐ ์ํ ์ฝ๋๊ฐ ํญ์ ์ค๋ณต ํธ์ถ๋์ด์ผ ํ๋ค.
- viewPath ์ค๋ณต : ๊ฒฝ๋ก ๋ถ๋ถ(prefix)๊ณผ ํ์ฅ์ ๋ถ๋ถ(suffix)์ด ์ค๋ณต๋๋ค. ๋ง์ฝ ํด๋ ์ ์ฒด๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ํ ํ๋ฆฟ ์์ง์ ๋ฐ๊พธ๋ ๋ฑ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง๋ฉด ์ ์ฒด ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค.
- ์ฌ์ฉํ์ง ์๋ ์ฝ๋ : request ๊ฐ์ฒด๋ ๋ชจ๋ธ์ ์ฌ์ฉํ ๋์๋ ์ฌ์ฉํ์ง๋ง response ๊ฐ์ฒด๋ ์์ ์ฌ์ฉํ์ง ์์๋ค. ๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ธฐ๋ ์ด๋ ต๋ค.
→ ๊ณตํต ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค
์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ปจํธ๋กค๋ฌ ํธ์ถ์ ์ ๊ณตํต ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค. ๋ชจ๋ ์์ฒญ์ ์๋ฌธ์ฅ ์ญํ ์ ํ๋ ๊ฐ์ฒด(ํ๋ก ํธ ์ปจํธ๋กค๋ฌ)๋ฅผ ํตํด์ ๋ค์ด์์ ๋ค์ ์๋ ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๋๋ก ํ์!
๊ฐ์ ๋งํฌ
์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ - ์ธํ๋ฐ | ๊ฐ์
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ํ์ํ ๋ชจ๋ ์น ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง MVC์ ํต์ฌ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค., -
www.inflearn.com