์๋ฐํ์ผ์์ javax.servlet.Servlet ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์์ฑ
spring์ด servlet stack๊ธฐ๋ฐ ๊ธฐ์ ์ด๋ค. ๊ทธ๋์ ์ ์์๋์์ผํ๋ค.
servlet ์คํ์ ๊ตฌํํ Tomcat ์น ์๋ฒ๋ฅผ ์ค์นํ์ฌ ํ์ฉ ๊ฐ๋ฅ
Servlet์ด๋
ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์์ฒญ์ ํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ์กํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์น ์ดํ๋ฆฌ์ผ์ด์
์๋ฒ์์ ๋์ํ๋ ํ๋ก๊ทธ๋จ ๊ตฌํ์ ์ฌ์ฉํ๋ค.
์๋ธ๋ฆฟ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์คํํ ์ ์๋ ์ ์ผํ ์๋ฐ ํ์ผ์ด๋ค.
์๋ธ๋ฆฟ์ ๋์์ํค๊ธฐ ์ํ ์กฐ๊ฑด์ ์๋ธ๋ฆฟ API๋ฅผ ํตํด ์ ๊ณต๋ฐ์ ์ ์์ผ๋ฉฐ,
์๋ธ๋ฆฟ์ ๊ตฌํํ ๋ ํด๋น API์ธ javax.servlet.http.HttpServlet ๋ง ์์(extends) ๋ฐ์ผ๋ฉด ๋จ
๋ชจ๋ ์๋ฐ ํ์ผ์ extends HttpServlet์ ์์ฑํ์ฌ ํด๋น java ํ์ผ์ ์๋ธ๋ฆฟ์ผ๋ก ๋์ํ๋๋ก ๊ตฌํ
HttpServlet
HttpServlet์ ์์๋ฐ์ ํด๋์ค๋ฅผ Servlet ์ด๋ผ๊ณ ํจ
HTTP ์์ฒญ ๋ฉ์๋์ ๋ฐ๋ผ doGet(), doPost(), doPut() ๋ฑ ์์ฒญ ๋ฉ์๋์ ๋ง๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์(Overriding)ํ์ฌ ์ฌ์ฉํด์ผํจ
doGet() : ํด๋น ์๋ธ๋ฆฟ์ด HTTP GET ์์ฒญ์ ๋ฐ์์ ๋ ๋์ํ๋ ๋ฉ์๋
doPost() : ํด๋น ์๋ธ๋ฆฟ์ด HTTP POST ์์ฒญ์ ๋ฐ์์ ๋ ๋์ํ๋ ๋ฉ์๋
๊ทธ ์ธ ์๋ช
์ฃผ๊ธฐ์ ๊ด๋ จ๋ init(), destory()
class HelloServlet extends HttpServlet { ... }
Servlet์ ์ ์ฐ๋์ง
์ฌ์ฉ์์ ์์ฒญ์ ์ํด ์์ฑ๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋ ๋ด๋ถ์ ๋ณด๊ดํ๋ค. ์ดํ ๋์ผํ ๊ฒฝ๋ก๋ก ์์ฒญ์ด ์ฌ ๊ฒฝ์ฐ,
๋ณด๊ดํ๊ณ ์๋ ์๋ธ๋ฆฟ์ ์ฌ์ฌ์ฉํ์ฌ ์์ฒญ ์๋ง๋ค ์๋กญ๊ฒ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ค.
์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ์๋ธ๋ฆฟ ํด๋์ค๋ค์ ์ธ์คํด์คํํ๊ณ
์๋ธ๋ฆฟ ์ปจํ
์ด๋ ๋ด๋ถ์ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ ์์ฒญ์ ๋ฐ๋ผ ํด๋น ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์ฌ์คํ ์์ผ์ฃผ๋ ์ญํ ์ ํจ
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์์ฒญ์ด ์ต์ด ์์ฒญ์ธ์ง ์๋์ง์ ๋ฐ๋ผ ํด๋น ์์ฒญ์ ๋ง๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด์ ์์ฑ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋จ
์ด ์๋ธ๋ฆฟ ์ปจํ
์ด๋ ์ค ๋ํ์ ์ผ๋ก Apache Tomcat์ด ์๋ค.
@WebServlet(urlPatterns="/first-request-servlet")
public class FirstHttpRequestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("request" + req);
System.out.println("response" + resp);
}
}
pom.xml
Maven์ ๋น๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ์ผ. POM(Project Object Model)์ ์ค์ ํ๋ ๋ถ๋ถ์ผ๋ก, ํ๋ก์ ํธ ๋ด ๋น๋ ์ต์
์ ์ค์ ํ๋ ๋ถ๋ถ์ด๋ค. ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ๋ณต๋ถ์ด ๊ฐ๋ฅํ์ฌ, ํ์
ํ ๋ ๋ฒ์ ํต์ผํ ๋ ํธํ๊ฒ ํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ ํด์ผํ ๋ dependency๋ก ์ถ๊ฐํ๋ ๋ถ๋ถ์ด ์์๋ค.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
web.xml
์น ์ ํ๋ฆฌ์ผ์ด์
์ ์๋น์ค ์ฒ๋ฆฌ์ ๊ดํ ๋ด์ฉ์ด ์ ์๋ ํ๊ฒฝ ์ค์ ํ์ผ.
์น ์๋ฒ๋ web.xml์ ์ ์๋ ๋ด์ฉ๋๋ก ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ ์ค์ ์ ์ํํจ
์๋ฒ๊ฐ ๊ธฐ๋๋ ๋ ์ด ํ์ผ์ ์ฝ๋๋ค. node.js ํ๊ฒฝ์์ package.json๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค.
๋ชจ๋ Web Application์ ๋ฐ๋์ ํ๋์ web.xml ํ์ผ์ ๊ฐ์ ธ์ผํ๊ณ , ์์น๋ WEB-INFํด๋ ํ์์ ์๋ค.
web.xmlํ์ผ์ ์ค์ ๋ค์ Web Application ์์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋๋ค.
Application์ ๋ํ ์์ฒญ์ด ์์ ๋๋ฉด web.xml์ ์ฌ์ฉํ์ฌ ์์ฒญ์ url์ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํด์ผํ๋ ์ฝ๋์ ๋งคํํ๋ค.
<web-app>
<!-- alias -->
<servlet>
<servlet-name>title</servlet-name>
<servlet-class>servlets.Servlet</servlet-class>
</servlet>
<!-- mapping -->
<servlet-mapping>
<servlet-name>title</servlet-name>
<url-pattern>title</url-pattern>
</servlet-mapping>
</web-app>
WebServlet
@WebServlet(urlPatterns="/first-request-servlet")
public class FirstHttpRequestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("request" + request);
System.out.println("response" + response);
// ์์ฒญ๋ฉ์ธ์ง ์์ ๋ญ๊ฐ ๋ด๊ฒผ๋์ง ํ์ธํ๊ธฐ ์ํ ๋ฉ์๋๊ฐ ์์
request.getContextPath();
request.getRequestURI();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
// Header ๋ฉ์์ง ๋ด๊ธด ์ ๋ณด ์ถ์ถ
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Request Information Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>์์ฒญ ๋ฉ์์ง์ ๋ด๊ธด ์ ๋ณด ํ์ธ</h3>");
// Header ๋ฉ์์ง์ ๋ด๊ธด ์ ๋ณด ์ถ์ถ
out.println("Context Path : " + request.getContextPath() + "<br/>");
out.println("Request URL : " + request.getRequestURL() + "<br/>");
out.println("Request URI : " + request.getRequestURI() + "<br/>");
out.println("Server Port : " + request.getServerPort() + "<br/>");
out.println("Request Protocol : " + request.getProtocol() + "<br/>");
out.println("Request METHOD: " + request.getMethod() + "<br/>");
out.println("Query String : " + request.getQueryString() + "<br/>");// http://localhost:8080/step02servletsyntax/first-request-servlet?name=jerry&age=15
out.println("Parameter(name) : " + request.getParameter("name") + "<br/>");
out.println("Parameter(age) : " + request.getParameter("age") + "<br/>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
์์ฒญ์ ๋ด๊ธด ์ ๋ณด๋ค์ ์๋ฒ๊ฐ ์ ์ ์๊ฒ ๊บผ๋ด์ผํจ
HttpServlet ๊ฐ์ฒด๊ฐ ์ด ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์๊ณ , request์ response ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๋ค.
/*
* 2. Annotation ๊ธฐ๋ฐ ๋งตํ
*
* XML์ ํตํ ๊ด๋ จ ๋ฐฉ์์ ๋ฒ๊ฑฐ๋ก์
* ์ถ์ํ๋๊ณ ์ง๊ด์ ์ธ Annotation ํ๊ธฐ๋ฒ์ผ๋ก ๋งตํ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํ
*
* * @WebServlet
* https://github.com/javaee/servlet-spec/blob/master/src/main/java/javax/servlet/annotation/WebServlet.java
*/
@WebServlet(name = "MySecondServlet", urlPatterns = "/servlets/secondservlet")
/*
* web.xml์ ์๋ ์ค์ ๊ณผ ๋์ผํจ
* <servlet-name>SecondServlet </servlet-name>
* <url-pattern>/servlets/secondservlet</url-pattern>
*/
public class SecondeServlet extends HttpServlet {
// get์์ฒญ์ ํตํด hello second world๊ฐ ์ถ๋ ฅ๋๋๋ก ํ
์คํธ
// ์๋ฒ ์๋ต์ HTTP Header์ ์ธ์ฝ๋ฉ์ UTF-8๋ก ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํค๋ ์ฝ๋๋ ์ถ๊ฐ
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello Second World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello Second World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
Url-patterns