[Spring] 3.์๋ธ๋ฆฟ, JSP, MVC ํจํด
1. ํ์ ๊ด๋ฆฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ฌํญ
[ํ์ ์ ๋ณด]
์ด๋ฆ : username
๋์ด : age
[๊ธฐ๋ฅ ์๊ตฌ์ฌํญ]
ํ์์ ์ฅ
ํ์ ๋ชฉ๋ก ์กฐํ
[ํ์ ๋๋ฉ์ธ ๋ชจ๋ธ]
@Getter @Setter
public class Member {
private Long id;
private String username;
private int age;
public Member() {
}
public Member(String username, int age) {
this.username = username;
this.age = age;
}
}
* id๋ ํ์ repo(์ ์ฅ์)์ ์ ์ฅํ๋ฉด repo๊ฐ ํ ๋น
ํ์ ์ ์ฅ์
/**
* ๋์์ฑ ๋ฌธ์ ๊ฐ ๊ณ ๋ ค๋์ด ์์ง ์์,
* ์ค๋ฌด์์๋ ConcurrentHashMap, AtomicLong ์ฌ์ฉ ๊ณ ๋ ค
*/
public class MemberRepository {
private static Map<Long, Member> store = new HashMap<>(); //static ์ฌ์ฉ
private static long sequence = 0L; //static ์ฌ์ฉ
private static final MemberRepository instance = new MemberRepository();
public static MemberRepository getInstance() {
return instance;
}
private MemberRepository() {
}
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
public Member findById(Long id) {
return store.get(id);
}
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear();
}
}
* ์ฑ๊ธํค์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ static ์์ด๋ ๋จ
ํ์ ์ ์ฅ์๋ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๋ค.
์คํ๋ง์ ์ฌ์ฉํ๋ฉด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ๋์ง๋ง, ์ง๊ธ์ ์ต๋ํ ์คํ๋ง ์์ด ์์ ์๋ธ๋ฆฟ ๋ง์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. ์ฑ๊ธํค ํจํด์ ๊ฐ์ฒด๋ฅผ ๋จ ํ๋๋ง ์์ํด์ ๊ณต์ ํด์ผ ํ๋ฏ๋ก ์์ฑ์๋ฅผ private ์ ๊ทผ์๋ก ๋ง์๋๋ค. |
ํ์ ์ ์ฅ์ ํ ์คํธ ์ฝ๋
class MemberRepositoryTest {
MemberRepository memberRepository = MemberRepository.getInstance();
@AfterEach
void afterEach() {
memberRepository.clearStore();
}
@Test
void save() {
//given
Member member = new Member("hello", 20);
//when
Member savedMember = memberRepository.save(member);
//then
Member findMember = memberRepository.findById(savedMember.getId());
assertThat(findMember).isEqualTo(savedMember);
}
@Test
void findAll() {
//given
Member member1 = new Member("member1", 20);
Member member2 = new Member("member2", 30);
memberRepository.save(member1);
memberRepository.save(member2);
//when
List<Member> result = memberRepository.findAll();
//then
assertThat(result.size()).isEqualTo(2);
assertThat(result).contains(member1, member2);
}
}
2. ์๋ธ๋ฆฟ์ผ๋ก ํ์ ๊ด๋ฆฌ ์น ์ดํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ
์๋ธ๋ฆฟ์ผ๋ก ํ์ ๋ฑ๋ก HTML form ์ ๊ณต
WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<form action=\"/servlet/members/save\" method=\"post\">\n" +
" username: <input type=\"text\" name=\"username\" />\n" +
" age: <input type=\"text\" name=\"age\" />\n" +
" <button type=\"submit\">์ ์ก</button>\n" + "</form>\n" +
"</body>\n" +
"</html>\n");
}
}
ํ์ ์ ์ฅ
@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("MemberSaveServlet.service");
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);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" + "</head>\n" +
"<body>\n" +
"์ฑ๊ณต\n" +
"<ul>\n" +
" <li>id="+member.getId()+"</li>\n" +
" <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" + "</ul>\n" +
"<a href=\"/index.html\">๋ฉ์ธ</a>\n" + "</body>\n" +
"</html>");
}
}
MemberSaveServlet ์ ๋ค์ ์์๋ก ๋์ํ๋ค.
1. ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํด์ Member ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. 2. Member ๊ฐ์ฒด๋ฅผ MemberRepository๋ฅผ ํตํด์ ์ ์ฅํ๋ค. 3. Member ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๊ฒฐ๊ณผ ํ๋ฉด์ฉ HTML์ ๋์ ์ผ๋ก ๋ง๋ค์ด์ ์๋ตํ๋ค. |
๋ชจ๋ ํ์ ๋ชฉ๋ก ์กฐํ
@WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members")
public class MemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
List<Member> members = memberRepository.findAll();
PrintWriter w = response.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>");
}
}
MemberListServlet ์ ๋ค์ ์์๋ก ๋์ํ๋ค.
1. memberRepository.findAll() ์ ํตํด ๋ชจ๋ ํ์์ ์กฐํํ๋ค. 2. ํ์ ๋ชฉ๋ก HTML์ for ๋ฃจํ๋ฅผ ํตํด์ ํ์ ์ ๋งํผ ๋์ ์ผ๋ก ์์ฑํ๊ณ ์๋ตํ๋ค. |
ํ
ํ๋ฆฟ ์์ง์ผ๋ก
์ง๊ธ๊น์ง ์๋ธ๋ฆฟ๊ณผ ์๋ฐ ์ฝ๋๋ง์ผ๋ก HTML์ ๋ง๋ค์ด๋ณด์๋ค. ์๋ธ๋ฆฟ ๋๋ถ์ ๋์ ์ผ๋ก ์ํ๋ HTML์ ๋ง์๊ป ๋ง๋ค ์ ์๋ค. ์ ์ ์ธ HTML ๋ฌธ์๋ผ๋ฉด ํ๋ฉด์ด ๊ณ์ ๋ฌ๋ผ์ง๋ ํ์์ ์ ์ฅ ๊ฒฐ๊ณผ๋ผ๋๊ฐ, ํ์ ๋ชฉ๋ก ๊ฐ์ ๋์ ์ธ HTML์ ๋ง๋๋ ์ผ์ ๋ถ๊ฐ๋ฅ ํ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ, ์ฝ๋์์ ๋ณด๋ฏ์ด ์ด๊ฒ์ ๋งค์ฐ ๋ณต์กํ๊ณ ๋นํจ์จ ์ ์ด๋ค. ์๋ฐ ์ฝ๋๋ก HTML์ ๋ง๋ค์ด ๋ด๋ ๊ฒ ๋ณด๋ค ์ฐจ๋ผ๋ฆฌ HTML ๋ฌธ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ๋ง ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ ํ๋ฆฟ ์์ง์ด ๋์จ ์ด์ ์ด๋ค. ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด HTML ๋ฌธ์์์ ํ์ํ ๊ณณ๋ง ์ฝ๋๋ฅผ ์ ์ฉํด์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค. ํ ํ๋ฆฟ ์์ง์๋ JSP, Thymeleaf, Freemarker, Velocity๋ฑ์ด ์๋ค. ๋ค์ ์๊ฐ์๋ JSP๋ก ๋์ผํ ์์ ์ ์งํํด๋ณด์. |
3. JSP๋ก ํ์ ๊ด๋ฆฌ ์น ์ดํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ
๊ธฐ๋ณธ ์ค์ ํ๊ธฐ (๊ต์ฌ ํ์ธ)
ํ์ ๋ฑ๋ก ํผ
<%@ page contentType="text/html;charset=UTF-8" language="java" %> // JSP ๋ฌธ์๋ผ๋ ๋ป
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/jsp/members/save.jsp" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" /> <button type="submit">์ ์ก</button>
</form>
</body>
</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>
* ์๋ฐ ์ฝ๋ ์ฌ์ฉ ๊ฐ๋ฅ
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
|
<% ~~ %> : ์๋ฐ ์ฝ๋ ์ ๋ ฅ ๊ฐ๋ฅ
<%= ~~ %> : ์๋ฐ ์ฝ๋ ์ถ๋ ฅ ๊ฐ๋ฅ
ํ์ ์ ์ฅ JSP๋ฅผ ๋ณด๋ฉด, ํ์ ์ ์ฅ ์๋ธ๋ฆฟ ์ฝ๋์ ๊ฐ๋ค.
๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด, HTML์ ์ค์ฌ์ผ๋ก ํ๊ณ , ์๋ฐ์ฝ๋๋ฅผ ๋ถ๋ถ๋ถ๋ถ ์ ๋ ฅํด์ฃผ์๋ค. <% ~ %> ๋ฅผ ์ฌ์ฉํด์ HTML ์ค๊ฐ์ ์๋ฐ ์ฝ๋๋ฅผ ์ถ๋ ฅํ๊ณ ์๋ค. |
ํ์ ๋ชฉ๋ก JSP
<%@ page import="java.util.List" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
List<Member> members = memberRepository.findAll();
%>
<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>
<%
for (Member member : members) {
out.write(" <tr>");
out.write(" <td> " + member.getId() + "</td>");
out.write(" <td> " + member.getUsername() + "</td>");
out.write(" <td> " + member.getAge() + "</td>");
out.write(" </tr>");
}
%>
</tbody>
</table>
</body>
</html>
ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋จผ์ ์กฐํํ๊ณ ,
๊ฒฐ๊ณผ List๋ฅผ ์ฌ์ฉํด์ ์ค๊ฐ์ <tr><td> HTML ํ๊ทธ๋ฅผ ๋ฐ๋ณตํด์ ์ถ๋ ฅํ๊ณ ์๋ค.
์๋ธ๋ฆฟ๊ณผ JSP์ ํ๊ณ
์๋ธ๋ฆฟ์ผ๋ก ๊ฐ๋ฐํ ๋๋ ๋ทฐ(View)ํ๋ฉด์ ์ํ HTML์ ๋ง๋๋ ์์
์ด ์๋ฐ ์ฝ๋์ ์์ฌ์ ์ง์ ๋ถํ๊ณ ๋ณต์กํ๋ค.
JSP๋ฅผ ์ฌ์ฉํ ๋๋ถ์ ๋ทฐ๋ฅผ ์์ฑํ๋ HTML ์์ ์ ๊น๋ํ๊ฒ ๊ฐ์ ธ๊ฐ๊ณ , ์ค๊ฐ์ค๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ์๋ง ์๋ฐ ์ฝ๋๋ฅผ ์ ์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํด๋ ํด๊ฒฐ๋์ง ์๋ ๋ช๊ฐ์ง ๊ณ ๋ฏผ์ด ๋จ๋๋ค. ํ์ ์ ์ฅ JSP๋ฅผ ๋ณด์. ์ฝ๋์ ์์ ์ ๋ฐ์ ํ์์ ์ ์ฅํ๊ธฐ ์ํ ๋น์ฆ๋์ค ๋ก์ง์ด๊ณ , ๋๋จธ์ง ํ์ ์ ๋ฐ๋ง ๊ฒฐ๊ณผ๋ฅผ HTML๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๋ทฐ ์์ญ์ด๋ค. ํ์ ๋ชฉ๋ก์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ฝ๋๋ฅผ ์ ๋ณด๋ฉด, JAVA ์ฝ๋, ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ๋ฑ ๋ค์ํ ์ฝ๋๊ฐ ๋ชจ๋ JSP์ ๋ ธ์ถ๋์ด ์๋ค. JSP๊ฐ ๋๋ฌด ๋ง์ ์ญํ ์ ํ๋ค. ์ด๋ ๊ฒ ์์ ํ๋ก์ ํธ๋ ๋ฒ์จ ๋จธ๋ฆฌ๊ฐ ์ํ์ค๋๋ฐ, ์๋ฐฑ ์์ฒ์ค์ด ๋์ด๊ฐ๋ JSP๋ฅผ ๋ ์ฌ๋ ค๋ณด๋ฉด ์ ๋ง ์ง์ฅ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค. (์ ์ง๋ณด์ ์ง์ฅ) |
MVC ํจํด์ ๋ฑ์ฅ
๋น์ฆ๋์ค ๋ก์ง์ ์๋ธ๋ฆฟ ์ฒ๋ผ ๋ค๋ฅธ๊ณณ์์ ์ฒ๋ฆฌํ๊ณ , JSP๋ ๋ชฉ์ ์ ๋ง๊ฒ HTML๋ก ํ๋ฉด(View)์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์ค
4. MVC ํจํด - ๊ฐ์
๋๋ฌด ๋ง์ ์ญํ
- ํ๋์ ์๋ธ๋ฆฟ/JSP -> ๋น์ฆ๋์ค ๋ก์ง + ๋ทฐ ๋ ๋๋ง
- ์ ์ง๋ณด์ ์ด๋ ค์์ง
๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด
- ๋ณ๊ฒฝ์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋ค๋ฅธ ๋ถ๋ถ์ ํ๋์ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ง ์์
๊ธฐ๋ฅ ํนํ
- JSP (๋ทฐ ํ ํ๋ฆฟ) -> ํ๋ฉด ๋ ๋๋ง ์ต์ ํ (์ฌ๊ธฐ์ ์ง์ค)
MVC (Model View Controller)
- ์๋ธ๋ฆฟ์ด๋ JSP๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ปจํธ๋กค๋ฌ(Controller)์ ๋ทฐ(View)๋ก ์ญํ ๋๋ ๊ฒ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต MVC ํจํด ์ฌ์ฉ
[๋ชจ๋ธ]
- ๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์ ๋ฌํด์ฃผ๋ ์ญํ
- ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ์ ์ ๊ทผ ๋ชฐ๋ผ๋ ๋๊ณ ํ๋ฉด ๋ ๋๋ง์ ์ง์ค ๊ฐ๋ฅ
[๋ทฐ]
- ๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ ์ฌ์ฉํด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์ค
- HTML ์์ฑ ๋ถ๋ถ
[์ปจํธ๋กค๋ฌ]
- HTTP ์์ฒญ์ ๋ฐ์ ํ๋ผ๋ฏธํฐ ๊ฒ์ฆ + ๋น์ฆ๋์ค ๋ก์ง ์คํ
- ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด์
์ฐธ๊ณ )
์ปจํธ๋กค๋ฌ์ ๋น์ฆ๋์ค ๋ก์ง ๋ ์ ์์ง๋ง, ์ปจํธ๋กค๋ฌ ๋ถ๋ด ๋ง์์ง
๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์๋น์ค(Service)๊ณ์ธต์์ ์ฒ๋ฆฌ
์ปจํธ๋กค๋ฌ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค๋ฅผ ํธ์ถ
๋น์ฆ๋์ค ๋ก์ง ๋ณ๊ฒฝ -> ์ปจํธ๋กค๋ฌ ์ฝ๋ ๋ณ๊ฒฝํ ์ ์์
MVC ํจํด 1
MVC ํจํด 2
5. MVC ํจํด - ์ ์ฉ
์๋ธ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๋ก ์ฌ์ฉํ๊ณ , 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๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฒ ๋ด๋ถ์์ ๋ค์ ํธ์ถ์ด ๋ฐ์
* ์ด ๊ฒฝ๋ก์์ 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์ ๋ณด๋ฉด ์ ๋๊ฒฝ๋ก(/๋ก์์) ์๋๋ผ ์๋๊ฒฝ๋ก
- ์ด๋ ๊ฒ ์๋๊ฒฝ๋ก ์ด์ฉํ๋ฉด ํผ ์ ์ก์ ํ์ฌ URL์ด ์ํ ๊ณ์ธต ๊ฒฝ๋ก + save ํธ์ถ
ex)
ํ์ฌ ๊ณ์ธต ๊ฒฝ๋ก : '/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);
}
}
ํ์ ์ ์ฅ ๋ทฐ
<%@ 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>
ํ์ ๋ชฉ๋ก ์กฐํ
ํ์ ๋ชฉ๋ก ์กฐํ ์ปจํธ๋กค๋ฌ
@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);
}
}
- request ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ธ์ ์ ์ฅ
ํ์ ๋ชฉ๋ก ์กฐํ ๋ทฐ
<%@ 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>
- c: forEach = jstl ๋ฌธ๋ฒ
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
5. MVC ํจํด - ํ๊ณ
MVC ํจํด์ ์ ์ฉํ ๋๋ถ์ ์ปจํธ๋กค๋ฌ์ ์ญํ ๊ณผ ๋ทฐ๋ฅผ ๋ ๋๋ง ํ๋ ์ญํ ์ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
ํนํ ๋ทฐ๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ญํ ์ ์ถฉ์คํ ๋๋ถ์, ์ฝ๋๊ฐ ๊น๋ํ๊ณ ์ง๊ด์ ์ด๋ค. ๋จ์ํ๊ฒ ๋ชจ๋ธ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๊ณ , ํ๋ฉด์ ๋ง๋ค๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ปจํธ๋กค๋ฌ๋ ๋ฑ ๋ด๋ ์ค๋ณต์ด ๋ง๊ณ , ํ์ํ์ง ์๋ ์ฝ๋๋ค๋ ๋ง์ด ๋ณด์ธ๋ค |
MVC ์ปจํธ๋กค๋ฌ์ ๋จ์
1) ํฌ์๋ ์ค๋ณต
- View๋ก ์ด๋ํ๋ ์ฝ๋๊ฐ ํญ์ ์ค๋ณต ํธ์ถ๋์ด์ผ ํ๋ค.
- ๋ฌผ๋ก ์ด ๋ถ๋ถ์ ๋ฉ์๋๋ก ๊ณตํตํํด๋ ๋์ง๋ง, ํด๋น ๋ฉ์๋๋ ํญ์ ์ง์ ํธ์ถํด์ผ ํ๋ค.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
2) ViewPath์ ์ค๋ณต
String viewPath = "/WEB-INF/views/new-form.jsp";
prefix & suffix
-> ๋ง์ฝ jsp์์ thymeleaf ๋ทฐ๋ก ๋ณ๊ฒฝ๋๋ฉด ์ ์ฒด ์ฝ๋ ๋ค ๋ณ๊ฒฝํด์ผํจ
3) ์ฌ์ฉํ์ง ์๋ ์ฝ๋
HttpServletRequest request, HttpServletResponse response
- ํ์ฌ ์์์์ reponse ์ฌ์ฉ๋์ง ์์
4) ๊ณตํต ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์ **
- ๊ธฐ๋ฅ ๋ณต์กํด์ง์๋ก ์ปจํธ๋กค๋ฌ์์ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋ ๋ถ๋ถ ๋์ด๋จ
- ๊ณตํต ๊ธฐ๋ฅ์ ๋ฉ์๋๋ก ๋ฝ์ผ๋ฉด ๋ ๊ฒ ๊ฐ์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก ํญ์ ํด๋น ๋ฉ์๋ ํธ์ถํด์ผํจ
[์ ๋ฆฌ]
๊ณตํต ์ฒ๋ฆฌ ์ด๋ ค์
-> ๊ณตํต ๊ธฐ๋ฅ ์ฒ๋ฆฌ (์๋ฌธ์ฅ ์ญํ )
-> Front Controller (ํ๋ก ํธ ์ปจํธ๋กค๋ฌ) ํจํด์ผ๋ก ํด๊ฒฐ (ํต์ฌ)
'๐จโ๐ป Web Development > Spirng - MVC ํจํด l' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] 6.์คํ๋ง MVC - ๊ธฐ๋ณธ ๊ธฐ๋ฅ (0) | 2023.03.15 |
---|---|
[Spring] 5.์คํ๋ง MVC - ๊ตฌ์กฐ ์ดํด (0) | 2023.03.14 |
[Spring] 4.MVC ํ๋ ์์ํฌ ๋ง๋ค๊ธฐ (0) | 2023.03.13 |
[Spring] 2.์๋ธ๋ฆฟ (0) | 2023.03.12 |
[Spring] 1.์น ์ ํ๋ฆฌ์ผ์ด์ ์ดํด (0) | 2023.03.11 |
์ต๊ทผ๋๊ธ