๐์๋ธ๋ฆฟ๊ณผ JSP
Spring MVC
์๋ ์ ์ฌ์ ํ๋ฒ๋ ๋ณด์ง ์์ ์ฑ ์ค์ JSP/์๋ธ๋ฆฟ์ด๋ผ๋ ์ฑ ์ด ์์๋ค. ๋ง์ฐํ๊ฒ ์๋ฐ๋ฅผ ํตํด ๊ตฌํํ๋ ์น์ด๋ผ๋๊ฒ ์ด์ธ์๋ JSP๊ฐ ๋ญ์ง ์๋ธ๋ฆฟ์ด ๋ญ์ง ์ ํ ๊ฐ์ด ์์๋ค. JSP๊ฐ ํ ํ๋ฆฟ ์์ง์ด๋ผ๋ ์ฌ์ค๋ ์ด๋ฒ์์์ผ ์๊ฒ ๋์๋ค.
์๋๋ ์ง๋ ์ฉ ์๋ธ๋ฆฟ, ๊ทธ๋ฆฌ๊ณ JSP๋ฅผ ํ ํ๋ฆฟ ์์ง์ผ๋ก ์ฌ์ฉํ๋ ์ผ์ ๊ฑฐ์ ์๊ฒ ์ง๋ง ์คํ๋ง์ ๊ทผ๊ฐ์ด ๋๋ฏ๋ก ์กฐ๊ธ์ ์ ๋ฆฌํด๋ณด๋๋ก ํ์. ( ์๋ API๋ฅ๋ ์ข ์๋ตํด๋ ๋ ๊ฑฐ๊ฐ๋ค.)
์คํ๋ง๋ถํธ๋ ์๋ธ๋ฆฟ์ ํฌํจํ๊ณ ์์ผ๋ฏ๋ก(wrappingํ์์ผ๋ ๋น์ฐํ๊ฒ๋), ์์ ์ฝ๋๋ ๋ชจ๋ ์คํ๋ง ๋ด์์ ์์ฑํ ๋ฒ์ ์ผ๋ก ํ๋ค.
@ServletComponentScan // ์๋ธ๋ฆฟ ์๋ ๋ฑ๋ก
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
์์ ๊ฐ์ ์ ๋ ธํ ์ด์ ์ ํตํด ์๋ธ๋ฆฟ์ ์๋๋ฑ๋กํ๋๋ก ํ ๋ค, ์ฒซ ์๋ธ๋ฆฟ์ ์์ฑํ์ฌ ๋ฑ๋กํ๋๋ก ํ์.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
//http://localhost:8080/request-param?username=hello&age=20
String username = request.getParameter("username"); // ์ฟผ๋ฆฌ ํ๋ผ๋ฉํฐ
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username)
}
}
๋ค์ง๊ณ ์ง ์ฝ๋๋ถํฐ ์ดํด๋ณด์๋๋ฐ ๊ฐ๋จํ ์ดํด๋ณด๋ฉด ์์ง ์ค๋ช
ํ์ง ์์ ์๋ธ๋ฆฟ
์ด ๋ฌด์์ธ์ง๋ฅผ ์ ์ ์์ ๊ฒ์ด๋ค. ๊ฐ๋จํ๊ฒ ์ค๋ช
ํ์๋ฉด ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฐ ํด๋์ค์ธ ๊ฒ์ด๋ค.
@WebServlet
์๋ธ๋ฆฟ ์ ๋
ธํ
์ด์
์ ํตํด ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ฑ๋กํ ์ ์์ผ๋ฉฐ, name ๋ฐ urlPatterns์ ์ ์ํ ์ ์๋ค. ์ ์์ ์ ์๋ธ๋ฆฟ์ http://localhost:8080/hello
์ ๋ํ ์น ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ์ด๋ค.
์๋ธ๋ฆฟ์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋
์ ๋ณด๊ด๋๋ฉฐ ๋งค์น๋๋ url๋ก ์์ฒญ์ด ์ค๋ฉด ์๋์ ๊ฐ์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ๊ฐ๋ฐ์๋ ์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ํด๋น ์์ฒญ์ ๋ํ ๋์์ ์ ์ํ๋ ๊ฒ์ด๋ค.
protected void service(HttpServletRequest request, HttpServletResponse response)
ํ์ฌ์ ์คํ๋ง๋ถํธ๋ ๋ค๋ฅธ ์น ํ๋ ์์ํฌ๋ฅผ ์๊ฐํด๋ณด๋ฉด ์์ฌ์ธ ์๋ ์์ง๋ง, ์ด๋ฏธ ์๋ธ๋ฆฟ๋ง์ผ๋ก๋ http request์ ๋ํ ์ถ์ํ๊ฐ ๋ง์ด ์ด๋ฃจ์ด์ ธ ์๋ค. HttpServletRequest๋ผ๋ ํด๋์ค๊ฐ ์ด๋ฏธ request๋ฅผ ์ถ์ํํ๋ค๋ ์๋ฏธ๊ฐ ๋์ง ์๊ฒ ๋๊ฐ? ๊ฐ๋จํ ์๋ฅผ ๋ค๋ฉด Http request header์ Content-Length๋ง ํด๋ ๊ณ์ฐ์์ด ์๋์ผ๋ก ์๋ธ๋ฆฟ์ ์ ๊ณต์ด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ธ๋ฆฟ๋ค์ด ์ ์ฅ๋๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด๋์ ์๋๊ฑธ๊น? ์ ๋ต์ ํฐ์ผ(Tomcat) ์๋ฒ์ด๋ค. ์คํ๋ง๋ถํธ๋ฅผ ํตํด ์๋ธ๋ฆฟ์ ์์ฑํ๋ฉด ๋ด์ฅ๋ ํฐ์ผ ์๋ฒ๋ฅผ ํตํด ์๋ธ๋ฆฟ์ด ์คํ๋๋ ๊ฒ์ด๋ค. ํ์คํ WAS๋ต๊ฒ ๋จ์ํ ์น ์๋ฒ์๋ ๋ฌ๋ฆฌ ๋ก์ง์ ๋ณด๊ดํ๋ค.
HttpServletRequest
์ด์ ์ข ๋ ๋ํ
์ผํ๊ฒ ์๋ธ๋ฆฟ์ ์์๋ฅผ ์ดํด๋ณด์. ๋จผ์ HttpServletRequest
์ด๋ค. ์๋ธ๋ฆฟ์ ๊ฐ๋ฐ์ ๋์ http request message๋ฅผ ํ์ฑํด์ ์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ service ๋ฉ์๋์ ์ธ์๋ก ๋ฃ์ด์ค๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ์ ๊ณตํด์ค ์ ์๋ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค.
- HTTP ๋ฉ์๋(GET, POST, DELETE, PUT, โฆ)
- URL
- query string
- ์คํค๋ง
- ํ๋กํ ์ฝ ํค๋
- form ํ๋ผ๋ฏธํฐ ํ์ ์กฐํ
- message body ๋ฐ์ดํฐ ์ง์ ์กฐํ
์ด๊ฒ๋ง์ผ๋ก๋ ์ฌ๋ฏธ๊ฐ ์๋ค. ํ์ฑ์ ๋๋ ์์ํ์ง ์๊ฒ ๋๊ฐ? ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์๋์ ๊ฐ์ด ์ ๊ณตํ๋ค.
- ์์ ์ ์ฅ์ ๊ธฐ๋ฅ
ํด๋น HTTP ์์ฒญ์ด ์์๋ถํฐ ๋๋ ๋ ๊น์ง ์ ์ง๋๋ ์์ ์ ์ฅ์๋ฅผ ์ ๊ณตํ๋ค. ๋์ค์๋ ํต์ฌ์ ์ผ๋ก ์ฐ๊ฒ๋๋ ๊ธฐ๋ฅ์ด๋ ๊ธฐ์ตํด๋์.
request.setAttribute(name, value)
request.getAttribute(name)
- ์ธ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ
request.getSession(create: true)
์ด๋ ๊ฒ HttpRequest์ ๋ํ ๋๋ถ๋ถ์ ์ ๋ณด๋ฅผ API๋ฅผ ํตํด ์ป์ด์ฌ ์ ์๋ค. ์คํ๋ง์์๋ ํ์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ํ์ํ ๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ์๋ณด๋๋ก ํ์.
Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์คํ๋ง์์๋ ํ์์์ง๋ง ๊ฐ๋ ๋ณด์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ์ ์ ๋ฆฌํด๋ณธ๋ค. ๋ง์น node.js์ javascript๊ฐ์ ๊ทธ๋ฌํ๋ฏ์ด JSON ํ์์ ๋ฐ์์ ๋ฐ๋ก ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค. ์คํ๋ง์์๋ ๊ธฐ๋ฅ ๋๋ค.
POST http://localhost:8080/request-body-json
content-type: application/json
message body:
{โusernameโ: โhelloโ, โageโ: 20} ๊ฒฐ๊ณผ: messageBody = {โusernameโ: โhelloโ, โageโ: 20}
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
import com.fasterxml.jackson.databind.ObjectMapper;
// ์ด ๋
์์ด json์ object๋ก ๋งคํํด์ค๋ค.
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-
json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
HelloData helloData = objectMapper.readValue(messageBody,
HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
response.getWriter().write("ok");
}
}
HttpServletResponse
- HttpServletResponse ์ญํ
- HTTP ์๋ต ๋ฉ์์ง ์์ฑ HTTP ์๋ต์ฝ๋ ์ง์ ํค๋ ์์ฑ
- ๋ฐ๋ ์์ฑ
- ํธ์ ๊ธฐ๋ฅ ์ ๊ณต
- Content-Type, ์ฟ ํค, Redirect
request์ ๋ง์ฐฌ๊ฐ์ง๋ก response๋ ํธ์๊ธฐ๋ฅ์ ๋ง์ด ์ ๊ณตํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ญ์๋ ์คํ๋ง์์๋ ๋ ํธํ๊ฒ ์ ๊ณตํ๋ค.
Response์ ํค๋๋ ์ ๋ ๊ฒ ์์ฑํ๋ค ์น๊ณ , ์ด์ response ๋ฉ์์ง์ body๋ฅผ ์์ฑํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ์์ฆ์ rest api๋ฅผ ๋ฐํํ๊ณ ํ๋ก ํธ์๋๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ๊ตฌ์ฑํ๋๊ฒ ์ผ๋ฐ์ ์ด์ง๋ง ์์ ์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ด ์ผ๋ฐ์ ์ด์๊ณ , ๋ฐ๋ผ์ ์น ์์ฒญ์ ๋ํด html์ ๋ฐํํ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค.
@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");
// ์ฐธ๊ณ : ์ฟ ํค ์ ๋ฌํ๋๋ฒ
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600์ด
response.addCookie(cookie);
// ๋์?
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");
}
}
์์ด๊ณ ์ผโฆHTML์ ์ง์ ์์ฑํด์ response๋ก ์ ๋ฌํ๊ณ ์๋ค.
์๋ฐ ์ฝ๋๋ก HTML์ ๋ง๋ค์ด ๋ด๋ ๊ฒ ๋ณด๋ค ์ฐจ๋ผ๋ฆฌ HTML ๋ฌธ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ๋ง ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ
ํ๋ฆฟ ์์ง์ด ๋์จ ์ด์ ์ด๋ค. ํ
ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด HTML ๋ฌธ์์์ ํ์ํ ๊ณณ๋ง ์ฝ๋๋ฅผ ์ ์ฉํด์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
ํ
ํ๋ฆฟ ์์ง์๋ JSP, Thymeleaf, Freemarker, Velocity๋ฑ์ด ์๋ค.
JSP
๋ญ์ง๋ ๋ชฐ๋๋ JSP. ์๊ณ ๋ณด๋ ํ ํ๋ฆฟ ์์ง์ด์๋ค. ๊นจ๋ซ๊ณ ๋๋ ์๋ฌด๋ ์ด์ ๋ ์ฐ์ง ์๋๋ค. ๊ทธ๋๋ ์์๋ณด์.
๊ทธ๋ฐ๋ฐ, ์ฝ๋์์ ๋ณด๋ฏ์ด ์ด๊ฒ์ ๋งค์ฐ ๋ณต์กํ๊ณ ๋นํจ์จ ์ ์ด๋ค. ์๋ฐ ์ฝ๋๋ก HTML์ ๋ง๋ค์ด ๋ด๋ ๊ฒ ๋ณด๋ค ์ฐจ๋ผ๋ฆฌ HTML ๋ฌธ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ๋ง ์๋ฐ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ฉด ๋ ํธ๋ฆฌํ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ
ํ๋ฆฟ ์์ง์ด ๋์จ ์ด์ ์ด๋ค. ํ
ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด HTML ๋ฌธ์์์ ํ์ํ ๊ณณ๋ง ์ฝ๋๋ฅผ ์ ์ฉํด์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
ํ
ํ๋ฆฟ ์์ง์๋ JSP, Thymeleaf, Freemarker, Velocity๋ฑ์ด ์๋ค.
<%@ 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>
๋ณด๋ฉด ์๋ฐ์ฝ๋๊ฐ ๊ธฐ๋ฅ ๋ค์ด๊ฐ ์๋ค.
ํ์ ์ ์ฅ JSP๋ฅผ ๋ณด๋ฉด, ํ์ ์ ์ฅ ์๋ธ๋ฆฟ ์ฝ๋์ ๊ฐ๋ค. ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด, HTML์ ์ค์ฌ์ผ๋ก ํ๊ณ , ์๋ฐ
์ฝ๋๋ฅผ ๋ถ๋ถ๋ถ๋ถ ์
๋ ฅํด์ฃผ์๋ค. <% ~ %> ๋ฅผ ์ฌ์ฉํด์ HTML ์ค๊ฐ์ ์๋ฐ ์ฝ๋๋ฅผ ์ถ๋ ฅํ๊ณ ์๋ค.
<%@ page contentType=โtext/html;charset=UTF-8โ language=โjavaโ %>
์ฒซ ์ค์ JSP๋ฌธ์๋ผ๋ ๋ป์ด๋ค. JSP ๋ฌธ์๋ ์ด๋ ๊ฒ ์์ํด์ผ ํ๋ค.
๋ค๋ฅธ ํ ํ๋ฆฟ์์ง(django template, pug ๊ฐ์๊ฒ๋ ๋ดค์ผ๋ ๋ญ์ง ๋์ถฉ ์๊ฒ์ด๋ค.
ํ์ ๋ฑ๋ก ํผ JSP๋ฅผ ๋ณด๋ฉด ์ฒซ ์ค์ ์ ์ธํ๊ณ ๋ ์์ ํ HTML์ ๋๊ฐ๋ค. JSP๋ ์๋ฒ ๋ด๋ถ์์ ์๋ธ๋ฆฟ์ผ๋ก
๋ณํ๋๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์๋ MemberFormServlet๊ณผ ๊ฑฐ์ ๋น์ทํ ๋ชจ์ต์ผ๋ก ๋ณํ๋๋ค.
์คํ
http://localhost:8080/jsp/members/new-form.jsp
์คํ์ .jsp ๊น์ง ํจ๊ป ์ ์ด์ฃผ์ด์ผ ํ๋ค.
์ฆ, ๋จ์ html์ ๋ฐํํ๋ ์๋ธ๋ฆฟ์ด๋ผ๋ฉด ์๋ธ๋ฆฟ์ ์์ฑํ ํ์์์ด jsp๋ง ์์ฑํ๋ฉด ๊ทธ url๋กฒ์ ์์ ๋์ผํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ด์ผ๊ธฐ์ด๋ค.
์๋ฐ์ง์์ ์๋ํ ๊ฟ. ์๋ฐ๋ ์๋ฐ ๊ฐ์๋จธ์ ์์์ ๋์ํ๋ค. ๊ทธ๋์ ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์๋จธ์ ์ ํ์ฌํด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ ์กํด์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๊ณ ์ถ์ ์๋ํ ๋ชฉํ๊ฐ ์์๋๋ฐ, ๊ฒฐ๊ตญ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ์น ์ธ๊ณ๋ฅผ ์ง๋ฐฐํด๋ฒ๋ฆฌ๊ณ ๋ง์๋ค.
์๋ธ๋ฆฟ๊ณผ JSP์ ํ๊ณ
์๋ธ๋ฆฟ์ผ๋ก ๊ฐ๋ฐํ ๋๋ ๋ทฐ(View)ํ๋ฉด์ ์ํ HTML์ ๋ง๋๋ ์์
์ด ์๋ฐ ์ฝ๋์ ์์ฌ์ ์ง์ ๋ถํ๊ณ ๋ณต์กํ๋ค.
JSP๋ฅผ ์ฌ์ฉํ ๋๋ถ์ ๋ทฐ๋ฅผ ์์ฑํ๋ HTML ์์
์ ๊น๋ํ๊ฒ ๊ฐ์ ธ๊ฐ๊ณ , ์ค๊ฐ์ค๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ์๋ง ์๋ฐ ์ฝ๋๋ฅผ ์ ์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํด๋ ํด๊ฒฐ๋์ง ์๋ ๋ช๊ฐ์ง ๊ณ ๋ฏผ์ด ๋จ๋๋ค.
ํ์ ์ ์ฅ JSP๋ฅผ ๋ณด์. ์ฝ๋์ ์์ ์ ๋ฐ์ ํ์์ ์ ์ฅํ๊ธฐ ์ํ ๋น์ฆ๋์ค ๋ก์ง์ด๊ณ , ๋๋จธ์ง ํ์ ์ ๋ฐ๋ง ๊ฒฐ๊ณผ๋ฅผ HTML๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๋ทฐ ์์ญ์ด๋ค. ํ์ ๋ชฉ๋ก์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
์ฝ๋๋ฅผ ์ ๋ณด๋ฉด, JAVA ์ฝ๋, ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ๋ฑ ๋ค์ํ ์ฝ๋๊ฐ ๋ชจ๋ JSP์ ๋ ธ์ถ๋์ด ์๋ค. JSP๊ฐ ๋๋ฌด ๋ง์ ์ญํ ์ ํ๋ค. ์ด๋ ๊ฒ ์์ ํ๋ก์ ํธ๋ ๋ฒ์จ ๋จธ๋ฆฌ๊ฐ ์ํ์ค๋๋ฐ, ์๋ฐฑ ์์ฒ์ค์ด ๋์ด๊ฐ๋ JSP๋ฅผ ๋ ์ฌ๋ ค๋ณด๋ฉด ์ ๋ง ์ง์ฅ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค. (์ ์ง๋ณด์ ์ง์ฅ ์ฐ)
MVC ํจํด์ ๋ฑ์ฅ
๋น์ฆ๋์ค ๋ก์ง์ ์๋ธ๋ฆฟ ์ฒ๋ผ ๋ค๋ฅธ๊ณณ์์ ์ฒ๋ฆฌํ๊ณ , JSP๋ ๋ชฉ์ ์ ๋ง๊ฒ HTML๋ก ํ๋ฉด(View)์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋๋ก ํ์. ๊ณผ๊ฑฐ ๊ฐ๋ฐ์๋ค๋ ๋ชจ๋ ๋น์ทํ ๊ณ ๋ฏผ์ด ์์๊ณ , ๊ทธ๋์ MVC ํจํด์ด ๋ฑ์ฅํ๋ค. ์ฐ๋ฆฌ๋ ์ง์ MVC ํจํด์ ์ ์ฉํด์ ํ๋ก์ ํธ๋ฅผ ๋ฆฌํฉํฐ๋ง ํด๋ณด์.
Model View Controller
MVC ํจํด์ ์ง๊ธ๊น์ง ํ์ตํ ๊ฒ ์ฒ๋ผ ํ๋์ ์๋ธ๋ฆฟ์ด๋, JSP๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ปจํธ๋กค๋ฌ(Controller)์ ๋ทฐ(View)๋ผ๋ ์์ญ์ผ๋ก ์๋ก ์ญํ ์ ๋๋ ๊ฒ์ ๋งํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณดํต ์ด MVC ํจํด์ ์ฌ์ฉํ๋ค.
์ปจํธ๋กค๋ฌ: HTTP ์์ฒญ์ ๋ฐ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ทฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ๋ชจ๋ธ์ ๋ด๋๋ค.
๋ชจ๋ธ: ๋ทฐ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๋ค. ๋ทฐ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ชจ๋ธ์ ๋ด์์ ์ ๋ฌํด์ฃผ๋ ๋๋ถ์ ๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฐ๋ผ๋ ๋๊ณ , ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ผ์ ์ง์คํ ์ ์๋ค.
๋ทฐ: ๋ชจ๋ธ์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ผ์ ์ง์คํ๋ค. ์ฌ๊ธฐ์๋ HTML์ ์์ฑํ๋ ๋ถ๋ถ์ ๋งํ๋ค
์ฐธ๊ณ
์ปจํธ๋กค๋ฌ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์๋ ์์ง๋ง, ์ด๋ ๊ฒ ๋๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ๋๋ฌด ๋ง์ ์ญํ ์ ๋ด๋นํ๋ค. ๊ทธ๋์
์ผ๋ฐ์ ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์๋น์ค(Service)๋ผ๋ ๊ณ์ธต์ ๋ณ๋๋ก ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค๋ฅผ ํธ์ถํ๋ ๋ด๋นํ๋ค. ์ฐธ๊ณ ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝํ๋ฉด ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๋ ์ปจํธ๋กค๋ฌ์ ์ฝ๋๋ ๋ณ๊ฒฝ๋ ์ ์๋ค. ์์์๋ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๋ค๋ ํํ ๋ณด๋ค๋, ๋น์ฆ๋์ค ๋ก์ง์ด๋ผ ์ค๋ช ํ๋ค.
์ ์ฉ
@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);
} }
dispatcher.forward() : ๋ค๋ฅธ ์๋ธ๋ฆฟ์ด๋ JSP๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฒ ๋ด๋ถ์์ ๋ค์ ํธ์ถ์ด
๋ฐ์ํ๋ค.
/WEB-INF
์ด ๊ฒฝ๋ก์์ JSP๊ฐ ์์ผ๋ฉด ์ธ๋ถ์์ ์ง์ JSP๋ฅผ ํธ์ถํ ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ๊ฒ์ ํญ์ ์ปจํธ๋กค๋ฌ๋ฅผ
ํตํด์ JSP๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
redirect vs forward
๋ฆฌ๋ค์ด๋ ํธ๋ ์ค์ ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ )์ ์๋ต์ด ๋๊ฐ๋ค๊ฐ, ํด๋ผ์ด์ธํธ๊ฐ redirect ๊ฒฝ๋ก๋ก ๋ค์
์์ฒญํ๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์งํ ์ ์๊ณ , URL ๊ฒฝ๋ก๋ ์ค์ ๋ก ๋ณ๊ฒฝ๋๋ค. ๋ฐ๋ฉด์ ํฌ์๋๋ ์๋ฒ ๋ด๋ถ์์ ์ผ์ด๋๋ ํธ์ถ์ด๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ํ ์ธ์งํ์ง ๋ชปํ๋ค.
View
<%@ 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>
<%= request.getAttribute(โmemberโ)%> ๋ก ๋ชจ๋ธ์ ์ ์ฅํ member ๊ฐ์ฒด๋ฅผ ๊บผ๋ผ ์ ์์ง๋ง, ๋๋ฌด ๋ณต์กํด์ง๋ค.
JSP๋ ${} ๋ฌธ๋ฒ์ ์ ๊ณตํ๋๋ฐ, ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด request์ attribute์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์๋ค.