#16 Servlet μ΄ν΄
# μΉ κ°λ°μ κ³Όμ
μ무κ²λ μλ μνμμ μΉ μλ²λ₯Ό ꡬμ±νλ€λ 건, μλμ κ³Όμ λ€μ μ½λλ‘ μμ±ν¨μ μλ―Ένλ€. μ΄λ μ΄λ ν λ€νΈμν¬ νλ‘κ·Έλλ°μ νλ 곡ν΅μ μΌλ‘ λ°λ³΅λλ κ³Όμ μ΄μλ€.
# Javaμ Servlet μΈν°νμ΄μ€ λ±μ₯.
'λ€νΈμν¬ μ½λμμ λΉμ¦λμ€ λ‘μ§μ μ μΈν λλ¨Έμ§λ₯Ό μΈν°νμ΄μ€ν μν€λ©΄ μλ κΉ?'μμ λμ¨ κ²μ΄ Servlet ν΄λμ€μ΄λ€.
Server + let, μλ²μμ μ€ννλ μμ μ€νλ¨μλΌλ μλ―Έλ‘ TCP/IP ν΅μ μ Servlet ν΄λμ€κ° λ΄λΉνκ³ , λλ¨Έμ§ λΉμ¦λμ€ λ‘μ§ λΆλΆλ§ μ§μ ꡬνλλ‘ μΈν°νμ΄μ€ν μν¨ κ²μ΄λ€. (* Servletμ μ€νν μ μλ μΉ μλ²λ₯Ό WASλΌκ³ νλ€.)
- htmlμ μ¬μ©νμ¬ μμ²μ μλ΅νλ€.
- Java Threadλ₯Ό μ΄μ©νμ¬ λμνλ€.
- MVC ν¨ν΄μμ Controllerλ‘ μ΄μ©λλ€.
- HTTP νλ‘ν μ½ μλΉμ€λ₯Ό μ§μνλ javax.servlet.http.HttpServlet ν΄λμ€λ₯Ό μμλ°λλ€.
- UDPλ³΄λ€ μ²λ¦¬ μλκ° λ리λ€.
- HTML λ³κ²½ μ Servletμ μ¬μ»΄νμΌν΄μΌ νλ λ¨μ μ΄ μλ€.
HttpServletμ μμλ°μ μλΈλ¦Ώ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν μ μμΌλ©° HTTP μλ΅/μ μ‘μ νκΈ°μν΄ μλΈλ¦Ώ μΈν°νμ΄μ€μμ μ 곡νλ Requestμ Response κ°μ²΄λ₯Ό μ¬μ©νλ€.
μ°Έκ³ λ‘ μλΈλ¦Ώμ μ΄λ Έν μ΄μ (@WebServlet)μΌλ‘ λ±λ‘νλ κΈ°λ₯μ Servlet 3 λ²μ (Tomcat 7 μ΄ν)μ λμ¨ κ²μΌλ‘, μ΄μ μλ web.xml νμΌμ μλΈλ¦Ώμ μ§μ λ±λ‘ν΄μ£Όμ΄μΌ νλ€. <servlet>μΌλ‘ μλΈλ¦Ώ ν΄λμ€λ₯Ό λ±λ‘νκ³ , <servlet-mapping>μΌλ‘ μμ² URLμ λ΄λΉ μλΈλ¦Ώμ μ§μ 맀νν΄μ£Όλ λ°©μμ΄λ€.
// web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>JSP_1031</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Hello</servlet-name> //servlet μ΄λ¦ λͺ
μ
<servlet-class>servlet.HelloServlet</servlet-class> //ν¨ν€μ§.ν΄λμ€ μ΄λ¦μ λ±λ‘ ν΄μ€
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name> //servletμ nameμ 맀ν
<url-pattern>/hello</url-pattern> / κ° λ°λμ νμ!! (μ£Όμ λ€μ κ°μ΄λΌμ)
</servlet-mapping>
</web-app>
# Servletμ λμ
μλΈλ¦Ώμ WAS (μΉ μ»¨ν μ΄λ, μλΈλ¦Ώ 컨ν μ΄λ)μμ λμνλ€. WASμ μλ μΉ μ»¨ν μ΄λλ μλΈλ¦Ώμ μμ±, νΈμΆ, κ΄λ¦¬λ₯Ό λ΄λΉνλ€.
- Servlet μ½λλ₯Ό μμ±ν΄μ WASμ λ±λ‘ν΄λλ©΄, μΉ μλ²λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈμ μμ²μ Servlet μΌλ‘ λ°μ μ μλ€.
* Servletμ μ±κΈν€μ ꡬννλ€. μ¦ .init() λ©μλλ‘ νλ² λ§λ€μ΄μ§ μλΈλ¦Ώ κ°μ²΄λ 곡μ ν΄μ μ¬λ¬ κ³³μμ μ°μΈλ€. .init()λ μ²μ νλ²λ§ μ€νλ ν μλΈλ¦Ώμ΄ μ¬μ¬μ©λλ€. λ§μ½ μλΈλ¦Ώ μ½λκ° λ³κ²½λλ€λ©΄, μλ©Έμν€κ³ λ€μ init()νμ¬ λ§λ λ€. - . 컨ν μ΄λλ Servlet μμ²μ΄ λ€μ΄μ€λ©΄ HTTP μλ΅ κ°μ²΄(Request,Response)λ₯Ό λ§λ€κ³ μ€λ λλ₯Ό ν λΉλ°μ Servlet ν΄λμ€μ .service() λ©μλλ₯Ό μ€ννλ€.
- μ΄λ κ² μ€λ λλ₯Ό ν λΉλ°κ³ μ€νλ Servletμ λΉμ¦λμ€ λ‘μ§μ μ€ννκ³ doGet()μ΄λ doPost() λ₯Ό νΈμΆνλ€. ν΄λΉ λ©μλλ λμ νμ΄μ§λ₯Ό μμ±νκ³ Response κ°μ²΄μ μ€μ΄ 컨ν μ΄λμ λ°ννλ€.
- 컨ν μ΄λλ μ λ¬λ°μ Responseλ₯Ό λ€μ HTTP Responseλ‘ λ³ννμ¬ μΉμλ²λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈμκ² λ³΄λΈλ€. μ΄ν μ€λ λλ₯Ό νμνκ³ νμμμ΄μ§ μλ΅ κ°μ²΄λ₯Ό μλ©Έμν¨λ€. μλΈλ¦Ώμ μλ©Έμν€μ§ μκ³ μ¬μ¬μ©νλ€κ° WAS μλ²κ° μ’ λ£λ λ .destory() λ©μλλ₯Ό μ΄μ©ν΄ μλ©Έμν¨λ€.
@WebServlet("/myServlet/*")
public class MyServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
String msg = "default";
// The servlet is initialized by calling the init() method.
public void init() throws ServletException {
msg = "init λ©μλ Call";
}
// The servlet calls service() method to process a client's request.
// service () λ©μλλ HTTP μμ² μ ν (GET, POST, PUT, DELETE λ±)μ νμΈνκ³
// μ μ νκ² doGet, doPost, doPut, doDelete λ±μ λ©μλλ₯Ό νΈμΆ
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
String text = "Service λ©μλ Call";
if(!"default".equals(msg)){
text = msg +"<br>"+text;
msg = "default";
}
// response κ°μ²΄μ ν€λκ°μ κΈ°λ‘νλ€.
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
// response κ°μ²΄μ λ°λμ λ£μ λ°μ΄ν°λ₯Ό κΈ°λ‘νλ€.
response.getWriter().write(text);
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String text = "doGet λ©μλ Call";
commonMethod(text, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String text = "doPost λ©μλ Call";
commonMethod(text, response);
}
// The servlet is terminated by calling the destroy() method.
@Override
public void destroy() {
// Finalization code...
System.out.println("destroy method call");
}
}
# WASμ λ©ν°μ€λ λ
κΈ°λ³Έμ μΌλ‘ Servletμ λ§λ€ λ μλΈλ¦Ώ κ°μ²΄κ° μ±κΈν€ κ°μ²΄λΌλκ±°λ§ μ μνλ©΄ μ±κΈμ°λ λ νλ‘κ·Έλλ°μ νλ―μ΄ νΈνκ² μ½λλ₯Ό μμ±νλ©΄ λλ€. κ·Έ μ΄μ λ WASμμ λ©ν° μ°λ λμ²λ¦¬λ₯Ό λμ ν΄μ£ΌκΈ° λλ¬Έμ΄λ€.
μΉ μλΉμ€μμλ μ¬λ¬κ°μ§ μμ²μ΄ λμμ λ€μ΄ μ¬ μ μλ€. μ΄λ λ¨ νλμ μ€λ λλ₯Ό μ¬μ©νλ€λ©΄ μΉ μλ²μ μ±λ₯μ λ§€μ° κ΅¬μ§ κ²μ΄κ³ , λ§μ½ νλμ μμ²μ μ€λ₯κ° μκΈ΄λ€λ©΄ λ€λ₯Έ μμ μΌλ‘ λμ΄κ°μ§ λͺ»ν΄ μλ²κ° μ£½μ΄λ²λ¦΄ κ²μ΄λ€. κ·Έλμ WASμλ κΈ°λ³Έμ μΌλ‘ λ©ν°μ°λ λλ₯Ό μ¬μ©νλ€.
μ°λ λλ₯Ό μμ±νκ³ ν λΉλ°λ μμ μ μ΄μ체μ μμ λ°λ‘ λ°λ, μλ°μ½λλ‘ κ΅¬ννλ μκ°μ΄ μ€λ걸리λ λΉμΌ μμ μ΄λ€. κ·Έλμ WAS μλ²μλ μ°λ λ ν(pool)μ λ§λ€μ΄ μ¬μ©ν μ°λ λλ₯Ό μ°λ λ νμ 미리 μμ±μμΌ λλ€κ°, νμν λ μλΈλ¦Ώμ μ°λ λλ₯Ό ν λΉμμΌμ€λ€.
μ°Έκ³ λ‘ WAS μλ²μ μ£Όμ μ±λ₯ νλ ν¬μΈνΈλ μ΅λ μ°λ λμ κ°μμ μλ€. λ§μ½ μμ±κ°λ₯ν μ°λ λμ μ΅λ κ°μκ° λ무 μ λ€λ©΄ μλ²μ CPUμ λ©λͺ¨λ¦¬μμμ μ¬μ λ‘μ΄λ° μ°λ λκ° λΆμ‘±ν΄ μμ²λ€μ μ²λ¦¬νλλ° λ²λ² μΌ κ²μ΄λ€. λ°λλ‘ μ΅λ μ°λ λμ κ°μλ₯Ό 무μμ λκ² μ€μ νλ©΄ CPU, λ©λͺ¨λ¦¬μ μ²λ¦¬ νκ³μ μ μ΄κ³Όνκ² λκ³ μμ²μ΄ κ³μ λ°λ¦¬λ€κ° μλ²κ° μ£½μ΄λ²λ¦΄ μ μλ€.