์๋ธ๋ฆฟ, JSP, MVC ํจํด
์๋ธ๋ฆฟ์ผ๋ก ๋ง๋ค์ด๋ณด๊ณ , JSP๋ก ๋ง๋ค์ด๋ณด๊ณ ๋ง์ง๋ง์ผ๋ก MVC๋ก ๋ง๋ค์ด ๋ณผ ๊ฒ์ด๋ค!
์๋ธ๋ฆฟ์ผ๋ก ๋ง๋ค์์ ๋ ์ผ๋ถ ์์
@WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members")
public class MemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
PrintWriter w = resp.getWriter();
w.write("<html>");
w.write("<head>");
w.write(" <meta charset=\"UTF-8\">");
w.write(" <title>Title</title>");
w.write("</head>");
w.write("<body>");
w.write("<a href=\"/index.html\">๋ฉ์ธ</a>");
w.write("<table>");
w.write(" <thead>");
w.write(" <th>id</th>");
w.write(" <th>username</th>");
w.write(" <th>age</th>");
w.write(" </thead>");
w.write(" <tbody>");
for (Member member : members) {
w.write(" <tr>");
w.write("<td>" + member.getId() + "</td>");
w.write("<td>" + member.getUserName() + "</td>");
w.write("<td>" + member.getAge() + "</td>");
w.write(" </tr>");
}
w.write(" </tbody>");
w.write("</table>");
w.write("</body>");
w.write("</html>");
}
}
- ๋ณต์กํ์ง๋งโฆ ๋์ ์ผ๋ก ์ํ๋ HTML์ ๋ง๋ค ์ ์๋ค.
- ๊ฐ ์์ฒญ๋ง๋ค Servlet์ ๋ง๋ค์ด์ผ ํ๋ค.
- ์๋ตํ HTML์ ์๋ฐ ์ฝ๋ ๋ด์ ์์ฑํด์ผํ๋ค.
JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
import๋ฌธ ์์ฑ
<%@ 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);
%>
<% %>
์์ ์๋ฐ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค.
- ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ฅผ ์์ ํ๋ค๊ฐ ๋น์ฆ๋์ค ๋ก์ง๋ ๊ฐ์ด ์์ ๋ ์ ์๋ค.
- ์ ์ง๋ณด์์ฑ์ด ๋จ์ด์ง๋ค.
MVC
Servlet, JSP์ ๋ฌธ์ ์
๋๋ฌด ๋ง์ ์ญํ
ํ๋์ ์๋ธ๋ฆฟ์ด๋ JSP๋ง์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ ๋ ๋๋ง๊น์ง ๋ชจ๋ ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด, ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ณ , ๋ํ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค.
๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด
๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ์ ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅด๋ค.
์๋ฅผ ๋ค์ด์ UI ๋ฅผ ์ผ๋ถ ์์ ํ๋ ์ผ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ์์ ํ๋ ์ผ์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ณ ๋๋ถ๋ถ ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ด๋ ๊ฒ ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅธ ๋ถ๋ถ์ ํ๋์ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ง ์๋ค.
๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ๋ ๊ธฐ์ค์ ๋ณ๊ฒฝ ์ฃผ๊ธฐ๊ฐ ๋ค๋ฅผ ๋๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
๊ธฐ๋ฅ ํนํ
๋ทฐ ํ ํ๋ฆฟ์ ํ๋ฉด์ ๋ ๋๋ง ํ๋๋ฐ ์ต์ ํ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์ ๋ฌด๋ง ๋ด๋นํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ด๋ค.
Model View Controller
MVC ํจํด์ ์๋ธ๋ฆฟ์ด๋, JSP๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ปจํธ๋กค๋ฌ(Controller)์ ๋ทฐ(View)๋ผ๋ ์์ญ์ผ๋ก ์๋ก ์ญํ ์ ๋๋ ๊ฒ์ ๋งํ๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณดํต ์ด MVC ํจํด์ ์ฌ์ฉํ๋ค.
Controller
HTTP ์์ฒญ์ ๋ฐ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋๋ค.
์ค์์์ ์กฐ์ข
ํ๋ ์ญํ . (๋น์ฆ๋์ค ๋ก์ง์ ๋ด์ ์ ์์ง๋ง, ์ญํ ์ด ๋๋ฌด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๋ค๊ณ ํ์.)
Model
๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๋ค.
๋ทฐ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ชจ๋ธ์ ๋ด์์ ์ ๋ฌํด์ฃผ๋ ๋๋ถ์ ๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋๊ณ , ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ผ์ ์ง์คํ ์ ์๋ค.
View
๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋ค. ์ฌ๊ธฐ์๋ HTML์ ์์ฑํ๋ ๋ถ๋ถ์ ๋งํ๋ค.
MVC ์ ์ฉํ๊ธฐ
- ์๋ธ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉ
- JSP๋ฅผ ๋ทฐ๋ก ์ฌ์ฉ
- HttpServletRequest ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ๋ก ์ฌ์ฉ (
request.setAttribute()
,request.getAttribute()
์ฌ์ฉ)
MvcMemberFormServlet
@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher requestDispatcher = req.getRequestDispatcher(viewPath); // ์ปจํธ๋กค๋ฌ์์ ๋ทฐ๋ก ์ด๋
requestDispatcher.forward(req, resp); // ์๋ธ๋ฆฟ์์ JSP๋ฅผ ํธ์ถํ๋ค.
}
}
dispatcher.forward()
: ๋ค๋ฅธ ์๋ธ๋ฆฟ์ด๋ JSP๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฒ ๋ด๋ถ์์ ๋ค์ ํธ์ถ์ด ๋ฐ์ํ๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ ๊ฐ๋ค๊ฐ ์ค๋๊ฒ ์๋(๋ฆฌ๋ค์ด๋ ํธ๊ฐ ์๋), ์๋ฒ ๋ด๋ถ์์ ํธ์ถํ ๊ฒ์ด๋ค./WEB-INF
: ์ด ๊ฒฝ๋ก์์ JSP๊ฐ ์์ผ๋ฉด ์ธ๋ถ์์ ์ง์ JSP๋ฅผ ํธ์ถํ ์ ์์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ค.
redirect vs forward
- redirect : ์ค์ ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ )์ ์๋ต์ด ๋๊ฐ๋ค๊ฐ, ํด๋ผ์ด์ธํธ๊ฐ redirect ๊ฒฝ๋ก๋ก ๋ค์ ์์ฒญํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ธ์งํ ์ ์๊ณ , URL ๊ฒฝ๋ก๋ ์ค์ ๋ก ๋ณ๊ฒฝ๋๋ค. - forward : ์๋ฒ ๋ด๋ถ์์ ์ผ์ด๋๋ ํธ์ถ์ด๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์งํ์ง ๋ชปํ๋ค.
MvcMemberSaveServlet
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
int age = Integer.parseInt(req.getParameter("age"));
// ๋น์ฆ๋์ค ๋ก์ง
Member member = new Member(username, age);
memberRepository.save(member);
// Model์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ค. - req ๊ฐ์ฒด์ Map์ด ์๋๋ฐ ์ฌ๊ธฐ์ ์ ์ฅํ๋ค.
req.setAttribute("member", member);
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher requestDispatcher = req.getRequestDispatcher(viewPath);
requestDispatcher.forward(req, resp);
}
}
save-result.jsp
<%@ 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๊ฐ ์ ๊ณตํ๋ ํ๋กํผํฐ ์ ๊ทผ๋ฒ์ผ๋ก, req์ ๋ด๊ฒจ์๋ attribute์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
MvcMemberListServlet
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
req.setAttribute("members", members);
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
dispatcher.forward(req, resp);
}
}
members.jsp ์ผ๋ถ
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
<c:forEach>
:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
๋ฅผ ์ ์ธํด์ผํ๋ค.
MVC ํจํด์ ํ๊ณ
forward์ ์ค๋ณต
๋ฉ์๋๋ฅผ ์ถ์ถํด๋ ๋์ง๋ง, ๋ฉ์๋ ํธ์ถ๋ง์ ์ค๋ณต์ผ๋ก ์ผ์ด๋๋ค.
ViewPath์ ์ค๋ณต
prefix์ธ /WEB-INF/views/
์ suffix์ธ .jsp
๊ฐ ์ค๋ณต์ผ๋ก ๋ฐ์ํ๋ค.
๋ง์ฝ jsp๊ฐ ์๋ thymeleaf ๊ฐ์ ๋ค๋ฅธ ๋ทฐ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด ์ ์ฒด ์ฝ๋๋ฅผ ๋ค ๋ณ๊ฒฝํด์ผ ํ๋ค.
์ฌ์ฉํ์ง ์๋ ์ฝ๋
HttpServletRequest request, HttpServletResponse response
์ ๊ฐ์ฒด๋ ์ฌ์ฉํ ์๋ ์๊ณ , ์ํ ์๋ ์๋ค.
๊ณตํต ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค.
์ปจํธ๋กค๋ฌ์์ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ถ๋ถ์ด ์ ์ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
๋จ์ํ ๊ณตํต ๊ธฐ๋ฅ์ ๋ฉ์๋๋ก ๋ฝ์ผ๋ฉด ๋ ๊ฒ ๊ฐ์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ํญ์ ํธ์ถํด์ผ ํ๊ณ , ์ค์๋ก ํธ์ถํ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋๋ค.
๋ํ ํธ์ถํ๋ ๊ฒ ์์ฒด๋ ์ค๋ณต์ด๋ค.
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(Front Controller) ํจํด์ ๋์ ํ๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
โ๏ธ ๊น์๋์ ์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ๊ฐ๋ฐ ํต์ฌ ๊ธฐ์ ๊ฐ์ ๋ ธํธ โ๏ธ