๋ชฉ์ฐจ
- WAS ๋์ ๊ณผ์
- ์๋ธ๋ฆฟ(Servlet)
- Servlet ๊ตฌํ ๋ฐฉ๋ฒ
- ์๋ธ๋ฆฟ ์๋ช ์ฃผ๊ธฐ(Servlet LifeCycle)
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)
WAS ๋์ ๊ณผ์
- ์น ์๋ฒ๋ก๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ปจํ ์ด๋๊ฐ web.xml์ ์ฐธ์กฐํ์ฌ Servlet์ ๋ํ Thread๋ฅผ ์์ฑํ๊ณ ์์ฒญ(httpServletRequest) ๋ฐ ์๋ต(httpServletResponse) ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ ๋ฌํ๋ค.
- ํธ์ถ๋ ์๋ธ๋ฆฟ์ ์์ ์ ๋ด๋นํ๊ฒ ๋ ์ค๋ ๋๋ ๊ทธ์ ๋ง๋ doGet() ๋๋ doPost() ๋ฉ์๋๋ฅผ ํธ์ถํด ์์ฑ๋ ๋์ ํ์ด์ง๋ฅผ Response ๊ฐ์ฒด์ ๋ด์ ์ปจํ ์ด๋์ ์ ๋ฌํ๋ค.
- ์ปจํ ์ด๋๋ ์ ๋ฌ ๋ฐ์ Response ๊ฐ์ฒด๋ฅผ HttpResponse ํํ๋ก ๋ฐ๊พธ์ด Web Server์ ์ ๋ฌํ๊ณ ์์ฑ๋ ์ค๋ ๋๋ฅผ ์ข ๋ฃํ๊ณ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์ํจ๋ค.
[ Web Server ์ WAS์ ์ฐจ์ด ]
๐ Web Server (์น ์๋ฒ)
Static; ๋ฐ๋์ง ์๋ Page
ํ์ผ ๊ฒฝ๋ก ์ด๋ฆ์ ๋ฐ์ ๊ฒฝ๋ก์ ์ผ์นํ๋ ํ์ผ ๋ฐํ
image, html, css, javascript ํ์ผ๊ณผ ๊ฐ์ด ์ปดํจํฐ์ ์ ์ฅ๋์ด ์๋ ํ์ผ์ ๋ฐํ
๋คํธ์ํฌ ๋ง์ ์ข ์๋์ง ์์
ex) IIS, apache, tMax, WebtoB
๐ WAS = ์น ์๋ฒ + ์น ์ปจํ ์ด๋
Dynamic; ์ธ์์ ๋ฐ๋ผ ๋ฐ๋๋ Page
์น ์๋ฒ๊ฐ ๋จ๋ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ ๋ค์ํ ๋ก์ง ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋์ ์ปจํ ์ธ ์ ๊ณต
Servlet, JSP, ASP, PHP ๋ฑ์ ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ์ฉ๋จ
ex) tomcat, JBOSS, tMax jeus, BEA Web Logic, IBM Webspere
์น ์๋ฒ์ WAS๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๊ณ , ์น ์๋ฒ ์์ด WAS๋ง ์กด์ฌํ ์๋ ์๋ค.
WAS ์์ฒด๋ก ์น ์๋ฒ์ ์ญํ ๊น์ง ์ํํ ์ ์๋ค.
์๋ธ๋ฆฟ (Servlet)
๋์ ์ธ ์น ํ์ด์ง ์์ฑ์ ์ํ ์๋ฐ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ผ๋ก ์๋ฐ ํด๋์ค์ ์ผ์ข ์ด๋ค.
- ์๋ฐ ํ๋ซํผ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํต์ฌ ์์
- MVC ํจํด์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๊ณ ์ปจํ ์ด๋์ ๋ฐ์ ํ ์๋ฒ ํ๋ก๊ทธ๋จ ๊ตฌํ ๊ฐ๋ฅ
- Html์ ์ฌ์ฉํ์ฌ Response ํจ
- Java Thread๋ก ๋์ํจ
- ์ด์์ฒด์ ๋ ํ๋์จ์ด์ ์ํฅ์ ๋ฐ์ง ์์ ๋ค์ํ ์๋ฒ ํ๊ฒฝ์ ์ด์ ๊ฐ๋ฅ
- Jsp๋ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ์น ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ๋ก ๋ด๋ถ์ ์ผ๋ก ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ๋์ด ์คํ๋จ
Servlet ๊ตฌํ
Jsp์ Servlet ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Jsp์์ GET์ด๋ POST ๋ฐฉ์์ผ๋ก Requestํ๋ฉด Servlet์์ ๋ด์ฉ์ ๋ฐ์ ์ฒ๋ฆฌํ ํ Response ํ๋ ๊ณผ์ ๋ง ๊ฐ๋จํ ์ถ๋ ธ๋ค.
โ ์น ์ดํ๋ฆฌ์ผ์ด์ ํ๋ก์ ํธ ์์ฑ
ํ๋ก์ ํธ ์ต์คํ๋ก๋ฌ ํญ์์ ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํด [New] > [Other] > web ๊ฒ์ > Dynamic Web Project ์ ํํ์ฌ ์น ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
โก Servlet ํ์ผ ์์ฑ
ํ๋ก์ ํธ๋ช > src ์๋์ Servlet ํ์ผ์ ์์ฑํ๋ค.
HttpServlet์ ์์๋ฐ๊ณ doGet(), doPost() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค.
์์ฑ๋ Test.java ํ์ผ์ ์๋์ ๊ฐ๋ค.
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Test
*/
@WebServlet("/Test")
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Test() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
โข Jsp ํ์ผ ์์ฑ
WebContent ์๋์ [New] > [Others] > jsp ํ์ผ์ ์์ฑํ๋ค.
Jsp ํ์ผ์๋ ๊ฐ๋จํ๊ฒ ์ ๋ ฅ ๊ฐ์ post ํ์์ผ๋ก ๋๊ธฐ๋๋ก ์์ฑํ๋ค.
action ๊ฐ์ "/ํ๋ก์ ํธ๋ช /์ค์ ํ๊ฒฝ๋ก"์ ๊ฐ์ด ์ ๋ ฅํด์ผ ํ๋ค. (tomcat ๊ธฐ๋ ์ path ๋ณ๊ฒฝ ์ ํ์ ๋ ๊ธฐ์ค)
์ค์ ํ ๊ฒฝ๋ก๋ ์๋ web.xml ํ์ผ์์ ์ค๋ช ํ ๊ฒ์ด๋ค.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Servlet Test Page</title>
</head>
<body>
<div>
<form method="post" action="/servletTest/test">
name: <input type="text" name="name"><br />
age: <input type="text" name="age">
<input type="submit" value="์ ์ก">
</form>
</div>
</body>
</html>
๐ WEB-INF ํด๋
WebContent/WEB-INF ํด๋๋ ์น ์๋ฒ๊ฐ ์ฌ์ฉํ๋ ํ์ผ์ด ๋ค์ด์๋ ์ค์ํ ๋๋ ํฐ๋ฆฌ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์๋ค.
/WEB-INF ๋ด ํ์ผ์ ์๋น์คํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
โ web.xml ์ค์ ์ ํตํด์ ์ ๊ทผํ๋ค.
โก @WebServlet ์ด๋ ธํ ์ด์ ์ ํตํด์ ์ ๊ทผ ์ ์ฌ์ฉํ๋ URI๋ฅผ ์ง์ ํ๋ค.
ex) ์์ฑํ ์๋ธ๋ฆฟ ํ์ผ์์ @WebServlet("/Test")์ ๊ฐ์ด ์ฌ์ฉ
โฃ web.xml ํ์ผ ์์ฑ
Jsp ์ Servlet ํด๋์ค๋ฅผ ๋งคํํ๊ธฐ ์ํ xml๋ก <Servlet-mapping> ๋ด <url-pattern>์ ์ง์ ํ๋ค.
WEB-INF ์์ ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค ํด๋ฆญ ํ xml ํ์ผ์ ์์ฑํ์ฌ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
- <welcome-file>
test.jsp ํ์ผ์ ๋ํดํธ ๊ฒฝ๋ก๋ก ์ค์ ํด์ค๋ค.
๊ฒฝ๋ก ์์ด localhost:8080/servletTest์ ๊ฐ์ ์์ฒญ์ด ์ค๋ฉด test.jsp ํ์ด์ง๋ก ์ด๋์ํจ๋ค.
- <Servlet-mapping>
<url-pattern>์ด /test๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ServletTest์ด๋ฆ์ ๊ฐ์ง ๊ฒฝ๋ก์ธ servletTest.Test๋ก ์ด๋ํ๋ค.
์๋ฅผ ๋ค์ด localhost:8080/servletTest/test์ ๊ฐ์ ์์ฒญ์ด ์ค๋ฉด ์๋ธ๋ฆฟ ํ์ผ์ Test ๊ฒฝ๋ก๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
์ฌ๊ธฐ์ Test๋ ์๋ธ๋ฆฟ ํ์ผ์ @WebServlet ์ด๋ ธํ ์ด์ ๊ฒฝ๋ก์ด๋ค.
<?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>test</display-name>
<welcome-file-list>
<welcome-file>test.html</welcome-file>
<welcome-file>test.htm</welcome-file>
<welcome-file>test.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>ServletTest</servlet-name>
<servlet-class>servletTest.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
โค POST๋ก ์์ฒญ์ด ์ฌ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ ๋ด์ฉ ์์ฑ
Jsp์์ POST ๋ฐฉ์์ผ๋ก name, age ๊ฐ์ ๋ณด๋ด๋ฉด ์๋ธ๋ฆฟ์์ ๋ฐ์ ์ด๋ฅผ html๋ก ์ถ๋ ฅํ๋ค.
- request.setCharacterEncoding("euc-kr");
jsp ํ์ผ์์ ๋ฐ์ดํฐ ๋๊ฒจ์ค ๋ euc-kr๋ก ๋๊ฒจ์ฃผ๋๋ก ์ธํ ์ด ๋์ด์์ผ๋ฏ๋ก ์ธ์ฝ๋ฉ ํ์ ์ ๋ง์ถฐ์ค๋ค.
- request.getParameter("name");
jsp ํ์ผ input ๋ด name ๊ฐ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
package servlet_test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Test")
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
public Test() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("euc-kr");
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println("name: " + name + ", age: " + age);
response.setContentType("text/html;charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>FORM</TITLE></HEAD>");
out.println("<BODY>");
out.println("์ด๋ฆ์ " + name + " ์
๋๋ค.");
out.println("๋์ด๋ " + age + " ์
๋๋ค.");
out.println("</BODY>");
out.println("<HTML>");
out.close();
// doGet(request, response);
}
}
โฅ ํฐ์บฃ ๊ธฐ๋ ํ ๊ฒฐ๊ณผ ํ์ธ
default ํ์ผ์ด test.jsp์๊ธฐ ๋๋ฌธ์ path ์ ๋ ฅ ์์ด ์์ฒญ ์ test.jsp ํ๋ฉด์ผ๋ก ์ด๋ํ๋ค.
๊ฐ ์ ๋ ฅ ํ ์ ์ก์ ๋๋ฅด๋ฉด action์ ์ ๋ ฅ๋ path๋ฅผ web.xml์์ ์ฐพ์ ์๋ธ๋ฆฟ์ ๋งคํ์ํจ๋ค.
POST ๋ฐฉ์์ผ๋ก ์์ฒญ์ด ์์ผ๋ฏ๋ก doPost() ๋ฉ์๋์ ์ ์๋ ๋๋ก ๋ด์ฉ์ ์ถ๋ ฅํ๋ค.
์๋ธ๋ฆฟ ์๋ช ์ฃผ๊ธฐ (Servlet LifeCycle)
Java EE(Java Enterprise Edition) ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ ํ๋ฆ์ ์ปจํ ์ด๋๊ฐ ์ ์ดํ๋ค. ๊ทธ๋ฆฌ๊ณ Servlet, JSP๋ Java EE์ ํฌํจ๋ ํ์ ๊ธฐ์ ์ด๋ค.
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ปจํ ์ด๋๋ ํด๋น ์๋ธ๋ฆฟ์ด ๋ฉ๋ชจ๋ฆฌ์ ์๋์ง ํ์ธํ๊ณ , ์์ ๊ฒฝ์ฐ init() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ค.
- init()์ด ํธ์ถ๋ ํ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๋ผ์ service() ๋ฉ์๋๋ฅผ ํตํด ์์ฒญ์ ๋ํ ์๋ต์ด doGet()๊ณผ doPost()๋ก ๋ถ๊ธฐ๋๋ค.
- ์ปจํ ์ด๋๊ฐ ์๋ธ๋ ์ ์ข ๋ฃ ์์ฒญ์ ํ๋ฉด destroy() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
๋ฉ์๋ ๋ช | ์คํ ์์ | ์คํ ํ์ | ์์ |
init() | ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ต์ด์ ์๋ธ๋ฆฟ ์์ฒญ์ด ์์ ๋ ์คํ | 1 | ์๋ธ๋ฆฟ ์ธ์คํด์ค ์ด๊ธฐํ |
service() | ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์์ ๋๋ง๋ค ์คํ | n | ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ |
destroy() | ์๋ธ๋ฆฟ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ๋ ๋ ์คํ | 1 | ์๋ธ๋ฆฟ ์๋ฉธ |
๐ IoC(์ ์ด์ ์ญํ, Inversion of Control)
์คํ์ ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ์ง ์๊ณ ์ 3์๊ฐ ์ ์ดํ๋ ๊ฒ์ IoC๋ผ๊ณ ํ๋ค. Servlet๋ IoC์ ์ํ๋ค.
๊ธฐ์กด ์๋ฐ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ์ฒด ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ์์ค๋ก ํํํ๋ค.
์ด๋ฐ ์์ ๋ค์ ์ปจํ ์ด๋๋ก ์ฒ๋ฆฌํ๋ฉด ์์ค์์ ๊ฐ์ฒด ์์ฑ๊ณผ ์์กด๊ด๊ณ์ ๋ํ ์ฝ๋ ์์ด ๋ฎ์ ๊ฒฐํฉ๋์ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ ์ ์๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋ (Servlet Container)
Servlet ํด๋์ค์ ๊ท์น์ ๋ง๊ฒ(์๋ฒ์ ๋งคํ๋ URL ์ ๋ณด์ ๋ฐ๋ผ) ์๋ธ๋ฆฟ์ ๋ด๊ณ ๊ด๋ฆฌํด์ฃผ๋ ์ปจํ ์ด๋์ด๋ค.
- HTTP ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ธฐ์ด ์ญํ
- ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ URL๊ณผ ํน์ ์๋ธ๋ฆฟ์ ๋งคํ
- ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ด๋ฆฌ
- Java EE ๋ช ์ธ ์ค Servlet API๋ง ๊ตฌํํ ๊ฒ
- Java EE ์ ๋ค๋ฅธ ๊ธฐ์ ์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์ ์ฌ์ฉํ๋ ค๋ฉด classpath์ jar ํ์ผ์ ์ถ๊ฐํด์ผ ํจ
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://coding-factory.tistory.com/742
https://sallykim5087.tistory.com/121
https://lalwr.blogspot.com/2018/03/blog-post_20.html
https://ejolie.dev/posts/web-server-and-others
'๊ฐ๋ฐ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Boot ํ๋ก์ ํธ git ์ฐ๋ (0) | 2022.03.09 |
---|---|
Spring Boot์ MySQL / Mybatis ์ฐ๊ฒฐํ๊ธฐ (0) | 2022.03.09 |
Spring Boot ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2022.03.08 |
JPA, Hibernate (0) | 2022.03.08 |
Spring Security (0) | 2022.03.07 |
๋๊ธ