Spring / ์์ Servlet ํจํด, JSP ํจํด
by rlaehddnd0422์ด๋ฒ ํฌ์คํ ์์๋ ๊ฐ๋จํ๊ฒ ํ์๊ฐ์ , ํ์์กฐํ ๋ก์ง์ MVC ํจํด์ ์ดํด๋ณด๊ธฐ์ ์์ ์์ Servlet ํจํด๊ณผ JSP ํจํด์ ์ฌ์ฉํด์ ๊ตฌํํด๋ณด๊ณ , ๊ฐ ํจํด์ ํ๊ณ์ ๋จ์ ์ ์ดํด๋ณด๊ณ ๋ค์ ํฌ์คํ ์์ MVC ํจํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ์ ๋๋ฉ์ธ ์ ๋ณด
- ์ด๋ฆ : username
- ๋์ด : age
๊ธฐ๋ฅ
- ํ์ ์ ์ฅ
- ํ์ ๋ชฉ๋ก ์กฐํ
์์ Servlet
์ฐ์ ํ์ ๋๋ฉ์ธ ์ ๋ณด๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ์ฃ .
Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ Getter, Setter๋ ๋ฐ๋ก ๊ตฌํํ์ง ์์์ต๋๋ค.
Member.java
package hello.servlet.basic.domain.member;
import lombok.Getter;
import lombok.Setter;
@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;
}
}
๊ทธ๋ฆฌ๊ณ ๋๋ฉ์ธ์ ๊ธฐ๋กํ๊ธฐ ์ํด ๋๋ฉ์ธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ ๋ง๋ค์ด์ฃผ์ด์ผ๊ฒ ์ฃ . HashMap์ผ๋ก ๋ง๋ค์์ต๋๋ค.
MemberRepository.java
package hello.servlet.basic.domain.member;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MemberRepository {
private Map<Long,Member> store = new HashMap<>();
private static long sequence = 0L;
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();
}
}
์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ( ์๋ฐํ ๋งํ๋ฉด ํฐ์บฃ์๋ฒ๋ง ์ด์ฉ ) MemberRepository๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์งํ๊ธฐ ์ํด,
1. private MemberRepository ์์ฑ์๋ก ์ธ๋ถ์์ ์ธ์คํด์ค ์์ฑ ๋ฐด
2. ํด๋์ค๋ ๋ฒจ์ MemberRepository์ final๋ก ์ ์ธํด ๋ณ๊ฒฝ ๋ฐด
3. getInstance()๋ก ํญ์ ๊ฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์กฐํํ๋๋ก ์ค์ ํ์์ต๋๋ค.
์ด์ ์๋ธ๋ฆฟ๋ง์ ์ฌ์ฉํด์ ํ์ ๋ฑ๋ก, ์ ์ฅ, ์กฐํ ๋ก์ง์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ก, ๋ฑ๋ก ๋ก์ง์ ๋๋ค.
@WebServlet(name="memberFormServlet",urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet 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");
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");
}
}
1. HTML Form์ ํตํด์ ํ์์ ๋ฑ๋กํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, Content-type์ text/html;charset=utf-8 ์ผ๋ก ์ง์ ํด์ฃผ์์ต๋๋ค.
2. ์๋ธ๋ฆฟ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต ํํ๋ ๋ฌธ์๋ ๋ฐ์ดํธํํ๊ฐ ๋ ์ ์๋๋ฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฌธ์ ํํ๋ก ์๋ตํ๋ ค๋ฉด ๋ฐ์ดํฐ์ Stream์ ์ปจํธ๋กคํด์ผ ํฉ๋๋ค.
์ฆ, ํ ์คํธํํ๋ก ์๋ต์ ๋ณด๋ด๋๋ก ์ค์ ํ๊ธฐ ์ํด PrintWriter ํด๋์ค๋ฅผ ์ฌ์ฉํด getWriter() ๋ฉ์๋๋ฅผ ํตํด ์๋ต์ผ๋ก ๋ด๋ณด๋ผ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ป์ด๋ธ ํ ์คํธ๋ฆผ์ ํ ์คํธ๋ฅผ ๊ธฐ๋กํ์ด์.
3. ์ ์ก ๋ฒํผ์ ๋๋ฅด๋ฉด <form> tag์ action์ servlet/members/save๋ก, method๋ฅผ POST๋ก ์ง์ ํด ์ ๋ ฅํ ํผ์ servlet/members/save๋ก POSTํ๋๋ก ์ค์ ํ์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://charliecharlie.tistory.com/353
๋ ๋ฒ์งธ๋ก, ์ ์ฅ ๋ก์ง์ ๋๋ค.
์์ ๋ฑ๋ก ๋ก์ง์์ HTML Form์ ๋ด์ฉ์ servlet/members/save์ POST ํ์์ต๋๋ค.
์ ์ฅ ๋ก์ง์์๋
1. ๋ฑ๋ก ๋ก์ง์์์ HTML Form์ผ๋ก๋ถํฐ ์ ์ก๋ ๋๋ฉ์ธ ์ ๋ณด๋ฅผ ํตํด ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ ๋ค์,์ฑ๊ธํค์ผ๋ก ์์ฑํ ๋ฆฌํฌ์งํ ๋ฆฌ์ save ํฉ๋๋ค.
2. servlet/members/save์ POST๋ ๋๋ฉ์ธ ์ ๋ณด๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
@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 {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username,age);
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>");
}
}
์ฐ์ response๋ก ๋ถํฐ username๊ณผ age๋ฅผ getParameter()์ ์ฌ์ฉํด์ ์์ฒญ๋ฐ๊ณ ํด๋น ํ๋ผ๋ฏธํฐ ๊ฐ์ ํตํด, ๋๋ฉ์ธ์ ํ๋ ๋ง๋ค์ด ์ฃผ์์ต๋๋ค. ๊ทธ ํ ๋๋ฉ์ธ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ธฐ๋กํ์ด์.
๊ทธ ๋ค์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ก๋ถํฐ getterํ์ฌ PrintWriter ์ถ๋ ฅ์คํธ๋ฆผ์ ํตํด html ๋ฐฉ์์ผ๋ก ์ถ๋ ฅํด์ฃผ์์ต๋๋ค.
( setContentType, setCharacterEncoding ์ ํตํด Content-type : text/html;charset=utf-8 ๋ก ๋ฏธ๋ฆฌ ์ง์ )
์ธ ๋ฒ์งธ๋ก ํ์ ๋ชฉ๋ก ์กฐํ์ ๋๋ค.
package hello.servlet.web.servlet;
import hello.servlet.basic.domain.member.Member;
import hello.servlet.basic.domain.member.MemberRepository;
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.io.PrintWriter;
import java.util.List;
@WebServlet(name="memberListServlet",urlPatterns = "/servlet/members")
public class MemberListServlet extends HttpServlet {
MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
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>");
}
}
- URI๋ /servlet/members๋ก ์ ๊ทผํ ์ ์๊ณ , List์ findAll ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ธฐ๋ก๋ ๋๋ฉ์ธ ์ ๋ณด๋ค์ ์ ์ฅ.
- HTML ํ์์ผ๋ก ํ์๋ชฉ๋ก์ ๋ฟ๋ ค์ฃผ๊ธฐ ์ํด ๋ง์ฐฌ๊ฐ์ง๋ก ์ปจํ ์ธ ํ์ ์ html, ์ธ์ฝ๋ฉ์ utf-8๋ก ์ค์ ํ์ต๋๋ค.
์ด๋ ๊ฒ ํด์ ์์ฃผ์์ฃผ ๊ฐ๋จํ๊ฒ ์๋ธ๋ฆฟ๊ณผ ์๋ฐ์ฝ๋๋ง์ผ๋ก HTML์ ๋ง๋ค์ด๋ณด์๋๋ฐ, ์๋ธ๋ฆฟ ๋๋ถ์ ๋์ ์ผ๋ก HTML์ ๋ง๋ค ์ ์์ง๋ง,
์ฝ๋๋ฅผ ๋ณด๋ฉด ๋งค์ฐ ๋ณต์กํ๊ณ ๋นํจ์จ์ ์์ ๋ณผ ์ ์์ด์. ๋ฐ์ ์ฝ๋์ฒ๋ผ ์ผ์ผํ ๋ค ์ ๋ ๊ฒ HTML์ ์์ฑํ๋ ๊ฑด ๊ต์ฅํ ๋ถํธํ๊ณ ๊ท์ฐฎ๊ณ ๋นํจ์จ์ ์ ๋๋ค.
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>");
- ์๋ฐ์ฝ๋๋ก HTML์ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ฐจ๋ผ๋ฆฌ HTML ๋ฌธ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ๋ง ์๋ฐ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ ๋๋ค.
- ์ด๋ ๊ฒ HTML ๋ฌธ์์ Java ์ฝ๋๋ฅผ ๋ฃ๋ ๋ฐฉ์์ด ๋ฐ๋ก ํ ํ๋ฆฟ ์์ง์ ๋๋ค.
- ํ ํ๋ฆฟ ์์ง์๋ JSP, Thymeleaf, FreeMarker, Velocity ๋ฑ์ด ์์ต๋๋ค.
- ๊ฐ ์์ง๋ค์ ์ฅ๋จ์ ์ด ์๋๋ฐ ๊ทธ ์ค์์ JSP๋ฅผ ์ฌ์ฉํด์ ๋ก์ง ๊ตฌํ์ ํด๋ณด๊ฒ ์ต๋๋ค.
JSP ํจํด
JSP(Java Server Page)์ ํ ํ๋ฆฟ ์์ง ์ค ํ๋๋ก JSP๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด build.gradle์ JSP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
//JSP ์ถ๊ฐ ์์
implementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.44'
implementation 'javax.servlet:jstl'
//JSP ์ถ๊ฐ ๋
์ฒซ ๋ฒ์งธ ๋ฑ๋ก ๋ก์ง์ ๋๋ค.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<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>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
โฃ ์ฒซ ์ค์ JSP๋ฌธ์๋ผ๋ ๋ป์ผ๋ก JSP ๋ฌธ์๋ ์ด๋ ๊ฒ ์์ํด์ผ ํฉ๋๋ค.
ํ์๋ฑ๋ก ํผ JSP๋ฅผ ๋ณด๋ฉด ์ฒซ์ค์ ์ ์ธํ๊ณค HTML๊ณผ ์์ ํ ๋๊ฐ์ต๋๋ค.
JSP๋ ์๋ฒ ๋ด๋ถ์์ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋๊ธฐ ๋๋ฌธ์, ์๋ธ๋ฆฟ์ผ๋ก ์ง MemberFormSevlet๊ณผ ๊ฑฐ์ ๋น์ทํ๊ฒ ๋ณํ๋ฉ๋๋ค.
๋ ๋ฒ์งธ๋ ์ ์ฅ ๋ก์ง์ ๋๋ค.
<%@ page import="hello.servlet.basic.domain.member.Member" %>
<%@ page import="hello.servlet.basic.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// request, response ์ฌ์ฉ ๊ฐ๋ฅ
MemberRepository memberRepository = MemberRepository.getInstance();
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username,age);
memberRepository.save(member);
%>
<html>
<head>
<title>Title</title>
</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๋ฌธ
<% ~~ %>
โฃ ์ด ๋ถ๋ถ์ ์๋ฐ ์ฝ๋๋ฅผ ์ ๋ ฅํ ์ ์์ต๋๋ค.
<%= ~~ %>
โฃ ์ด ๋ถ๋ถ์ ์๋ฐ ์ฝ๋๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
JSP ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ request์ response๋ ์์ฝ์ด๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ ์ธํ์ง ์๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ๋ก์ง์ ํ์ ๋ชฉ๋ก ์กฐํ์ ๋๋ค.
<%@ page import="hello.servlet.basic.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.basic.domain.member.Member" %>
<%@ page import="java.util.List" %>
<%@ 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>
1. ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋จผ์ ์กฐํ
2. ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ -> ๋ฆฌ์คํธ
3. <tr><td> HTML ํ๊ทธ๋ฅผ ๋ฐ๋ณตํด์ ์ถ๋ ฅ
์ฌ๊ธฐ์ out ๋ํ JSP๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฝ์ด๋ก JSP ํ์ด์ง๊ฐ ์์ฑํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋ ์ฌ์ฉ๋๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kimkwon429&logNo=220759230473
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Front-Controller ํจํด (0) | 2023.02.27 |
---|---|
Spring / MVC ํจํด (0) | 2023.02.24 |
Spring MVC / HttpServletResponse (0) | 2023.02.22 |
Spring MVC / HttpServletRequest (0) | 2023.02.22 |
Spring MVC / ์น ์ ํ๋ฆฌ์ผ์ด์ (0) | 2023.02.21 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422