Spring / MVC ํจํด
by rlaehddnd0422๊ธฐ์กด Servlet + ์๋ฐ, ํ ํ๋ฆฟ ์์ง JSP ๋ฐฉ์์
(์์ ์์๋ ๋น๊ต์ ๊ฐ๋จํ์ง๋ง) ์ค์ผ์ผ์ด ์ปค์ง์๋ก ๋น์ฆ๋์ค ๋ก์ง(ํ์ ๊ฐ์ , ์ ์ฅ, ๋ชฉ๋ก์กฐํ)๊ณผ ๋ทฐ ๋ ๋๋ง(ํด๋ผ์ด์ธํธ์๊ฒ ๊ฒฐ๊ณผ ํ๋ฉด ์ ์)๊น์ง ํ๋์ ์๋ธ๋ฆฟ๊ณผ JSP์์ ๋๋ฌด ๋ง์ ์ญํ ์ ์ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต์ต๋๋ค.
ex) JSP ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์์.
๋น์ฆ๋์ค ๋ก์ง์ ๊ณ ์ณ์ผ ํ๋ค -> JSP๋ฅผ ์์ ํด์ผํจ.
UI๋ฅผ ์์ ํด์ผ ํ๋ค -> JSP๋ฅผ ์์ ํด์ผํจ.
ํ๋์ ์ฝ๋๋ก ๊ด๋ฆฌ -> ์ ์ง๋ณด์์ ์ด๋ ค์.
ํนํ JSP ๊ฐ์ ๋ทฐ ํ ํ๋ฆฟ์ ํ๋ฉด์ ๋ ๋๋งํ๋๋ฐ ์ต์ ํ ๋์ด ์๊ธฐ ๋๋ฌธ์ JSP๋ ์ด ๋ถ๋ถ์ ์ ๋ฌด๋ง ๋ด๋นํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ ๋๋ค.
MVC(Model View Controller) ํจํด
- Controller : HTTP ์์ฒญ์ ๋ฐ์ - ๋น์ฆ๋์ค ๋ก์ง ์คํ - ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด์
- Model : View์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์. ๋ชจ๋ธ ๋๋ถ์ ๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋จ
- View : ๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์ค.
MVC ํจํด์ ์ง๊ธ๊น์ง ํ๋ ๊ฒ์ฒ๋ผ ํ๋์ JSP๋ ์๋ธ๋ฆฟ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ Controller ์ View๋ก ์์ญ์ ๋๋ ๊ฒ์ ๋งํฉ๋๋ค.
MVC ํจํด์ ํฌ๊ฒ ๋ ๊ฐ์ง ํจํด์ด ์์ต๋๋ค.
ํจํด 1. M-VC
1. ํด๋ผ์ด์ธํธ์์ ์ปจํธ๋กค๋ฌ(JSP) ํธ์ถ.
2. ์ปจํธ๋กค๋ฌ(JSP)์์ ํด๋น ์์ฒญ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ๋ฉด ๋ทฐ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
3. ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ ๊ฒฝ์ฐ Service, Repository ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์ ๊ทผ์ ํ ํ ๋ก์ง ์ํ ํ Model์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ.
4. View(JSP) ์์ Model์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ํ ํด๋ผ์ด์ธํธ์๊ฒ ๋์ ๋ฆฌ์์ค ์ ๊ณต.
ํน์ง
- ๋ทฐ์ ์ปจํธ๋กค๋ฌ์ ์ญํ ์ด ํฉ์ณ์ ธ ์์ต๋๋ค.
- MVC 1์์๋ JSP๊ฐ View์ Controller์ ์ญํ ์ ๋ชจ๋ ์ํํฉ๋๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด JSP์ ์๋ฐ์ฝ๋, html ์ฝ๋, css ๋ฑ์ ์ฝ๋๊ฐ ์์ฌ์์ด ์์ค๊ฐ ๋ณต์กํ๊ณ ์ฝ๊ธฐ ์ด๋ ค์์ ธ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋๋ค.
- ํ์ง๋ง ์๋์ ์ผ๋ก ์ค๊ณ๊ฐ ๊ฐ๋จํ๊ณ ์์ ํ๋ก์ ํธ์ ๊ฐ๋ฐ์๋๊ฐ ๋น ๋ฅด๋ค๋ ์ ์ด ์์ต๋๋ค.
ํจํด 2 M-V-C
1. ํด๋ผ์ด์ธํธ์์ ์ปจํธ๋กค๋ฌ(Servlet) ํธ์ถ.
2. ์ปจํธ๋กค๋ฌ(Servet)์์ ํด๋น ์์ฒญ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ๋ฉด ๋ทฐ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
3. ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ ๊ฒฝ์ฐ Service, Repository ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์ ๊ทผ์ ํ ํ ๋ก์ง ์ํ ํ Model์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ.
4. View(JSP) ์์ Model์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ํ ํด๋ผ์ด์ธํธ์๊ฒ ๋์ ๋ฆฌ์์ค ์ ๊ณต.
ํน์ง
- Servlet๊ณผ JSP๊ฐ ๋๋์ด์ ธ ์์ด ์ฝ๋๊ฐ ์์ผ ์ผ์ด ์์.
- HTML๊ณผ Java์ฝ๋๊ฐ ๋ถ๋ฆฌ๋์ด ํ์ฅ์ ์ฉ์ด. ์ ์ง๋ณด์๊ฐ ์ฝ๋ค.
- ์ค๊ณ๋จ๊ณ์ ๋น์ฉ์ด ๋ง์ด๋ค์ด ๊ฐ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
MVC ํจํด ์ ์ฉ
Servlet์ Controller๋ก, JSP๋ฅผ View๋ก ์ฌ์ฉํด์ MVCํจํด์ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
Model์ HttpServletRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
(request๋ ๋ด๋ถ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ request.setAttribute(), request.getAttribute()๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์กฐํํ ์ ์์ต๋๋ค.)
ํ์ ๋ฑ๋ก ํผ - ์ปจํธ๋กค๋ฌ
package hello.servlet.web.servletmvc;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@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() : ๋ค๋ฅธ Servlet์ด๋ JSP๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก ์๋ฒ ๋ด๋ถ์์ ํธ์ถ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ค์ด๋ ํธ์ ๋ฌ๋ฆฌ ํด๋ผ์ด์ธํธ๋ ์ธ์งํ ์ ์์ต๋๋ค.
- /WEB-INT : ์ด ๊ฒฝ๋ก ์์ JSP๊ฐ ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํ ์ธ๋ถ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ค์ง ์ปจํธ๋กค๋ฌ(Servlet)์ ํตํด์๋ง ์ ๊ทผํ ์ ์์ต๋๋ค. ( ์ค์ง /servlet-mvc/members/new-form ์ ํตํด์๋ง ์ ๊ทผ ๊ฐ๋ฅ)
ํ์ ๋ฑ๋ก ํผ - ๋ทฐ
<%@ 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์ ๋ณด๋ฉด ์ ๋ ๊ฒฝ๋ก( / ๋ก ์์)๊ฐ ์๋๋ผ ์๋๊ฒฝ๋ก( / ๋ก ์์X)์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ํผ ์ ์ก์ ํ์ฌ URL์ด ์ํ ๊ณ์ธต ๊ฒฝ๋ก + save๊ฐ ํธ์ถ๋ฉ๋๋ค.
ํ์ฌ ๊ณ์ธต ๊ฒฝ๋ก: /servlet-mvc/members/
๊ฒฐ๊ณผ: /servlet-mvc/members/save
๋ฑ๋ก ํผ์์๋ ํฌ๊ฒ ๋ฌ๋ผ์ง ๊ฒ ์์ต๋๋ค. ํ์ ์ ์ฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ ์ ์ฅ - ์ปจํธ๋กค๋ฌ
package hello.servlet.web.servletmvc;
import hello.servlet.basic.domain.member.Member;
import hello.servlet.basic.domain.member.MemberRepository;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@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);
request.setAttribute("member",member);
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);
}
}
์๋ธ๋ฆฟ๋ฐฉ์๊ณผ JSP ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก /servlet-mvc/members/save์ POST๋ username๊ณผ age ์ ๋ณด๋ก ๋๋ฉ์ธ์ ์์ฑํ๊ณ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฅํ์ต๋๋ค.
Model(HttpServletRequest)์ ๋๋ฉ์ธ์ ์ ์ฅ ํ -> view๋ก ์ด๋
ํ์ ์ ์ฅ - ๋ทฐ
<%@ page import="hello.servlet.basic.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
์ฑ๊ณต
<ul>
<%-- <li>id=<%=((Member)request.getAttribute("member")).getId()%></li>--%>
<%-- <li>username=<%=((Member)request.getAttribute("member")).getUsername()%></li>--%>
<%-- <li>age=<%=((Member)request.getAttribute("member")).getAge()%></li>--%>
<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("ํ๋ผ๋ฏธํฐ ์ด๋ฆ")์ ํตํด Model์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Member๋ก ์บ์คํ ํ๋ฉฐ getterํ์ฌ ์ถ๋ ฅํ๋ ๋ฐฉ์๋ ์์ง๋ง,
JSP๋ ${} ๋ฌธ๋ฒ์ ์ ๊ณตํ๋๋ฐ, ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด request์ attribute์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ํ์ ๋ชฉ๋ก์ ์กฐํํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ ๋ชฉ๋ก ์กฐํ - ์ปจํธ๋กค๋ฌ
package hello.servlet.web.servletmvc;
import hello.servlet.basic.domain.member.Member;
import hello.servlet.basic.domain.member.MemberRepository;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@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);
}
}
๋ง์ฐฌ๊ฐ์ง๋ก request ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ List๋ฅผ ๋ชจ๋ธ์ ๋ณด๊ดํ์ต๋๋ค.
ํ์ ๋ชฉ๋ก ์กฐํ - ๋ทฐ
<%@ 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๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ฐ๋ณตํ๋ฉด์ ์ถ๋ ฅํ์ต๋๋ค.
members ๋ฆฌ์คํธ์์ member๋ฅผ ์์๋๋ก ๊บผ๋ด item ๋ณ์์ ๋ด๊ณ ์ถ๋ ฅํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ์ต๋๋ค.
<c:forEach> ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์๋ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
for (Member member : members) {
out.write(" <tr>");
out.write("
out.write("
out.write("
out.write(" </tr>");
<td>" + member.getId() + "</td>");
<td>" + member.getUsername() + "</td>");
<td>" + member.getAge() + "</td>");
}
%>
- JSP์์ ์ผ๋ ์์ฝ์ด out์ ์ฌ์ฉํด ์ถ๋ ฅํด๋ ๋๊ธด ํ์ง๋ง ์ฝ๋๊ฐ ๋น๊ต์ ์ง์ ๋ถํฉ๋๋ค.
- JSP๊ฐ์ ๋ทฐํ ํ๋ฆฟ์ ์ด๋ ๊ฒ ํ๋ฉด์ ๋ ๋๋งํ๋๋ฐ ํนํ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
MVC ํจํด์ ์ฅ์
- ์ปจํธ๋กค๋ฌ์ ์ญํ ๊ณผ ๋ทฐ๋ฅผ ๋ ๋๋งํ๋ ์ญํ ์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ๋ทฐ๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ญํ ์ ์ถฉ์คํ ๋๋ถ์ ์ฝ๋๊ฐ ๊น๋ํ๊ณ ์ง๊ด์ ์ ๋๋ค.
ํ์ง๋ง ์ปจํธ๋กค๋ฌ์๋ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ง๊ณ ํ์ํ์ง ์์ ์ฝ๋ (ex. response)๋ค๋ ๋ง์ด ๋ณด์ ๋๋ค.
MVC ํจํด์ ํ๊ณ
์ค๋ณต ์ฝ๋
String viewPath = "/WEB-INF/views/~~~.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);
๊ณตํต ์ฒ๋ฆฌ์ ์ด๋ ค์
- ๊ธฐ๋ฅ์ด ๋ณต์กํด์ง์๋ก ์ปจํธ๋กค๋ฌ์์ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋ ๋ถ๋ถ๋ค์ด ์ ์ ๋ ๋ง์์ง๋๋ค. ๊ณตํต ๊ธฐ๋ฅ์ ๋ฉ์๋๋ก ๋ฝ์ผ๋ฉด ๋๊ฒ ์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ํญ์ ํธ์ถํด์ผ ํ๊ณ , ๋ ํธ์ถํ๋๊ฒ ์์ฒด๋ ์ฌ๋ฌ ์ปจํธ๋กค๋ฌ์์ ์ํํด์ผ ํ๋ ์ค๋ณต๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋จผ์ ์ปจํธ๋กค๋ฌ์์ ๊ณตํต ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ด ์์ต๋๋ค.
- ๋ค์ ํฌ์คํ ์์๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
https://cocoon1787.tistory.com/733
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Adapter ํจํด (0) | 2023.03.02 |
---|---|
Front-Controller ํจํด (0) | 2023.02.27 |
Spring / ์์ Servlet ํจํด, JSP ํจํด (0) | 2023.02.23 |
Spring MVC / HttpServletResponse (0) | 2023.02.22 |
Spring MVC / HttpServletRequest (0) | 2023.02.22 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422