์, WAS(Web Application Server)์ ์ ์ฒด๋ฅผ ์์๋ณด์.
Web Server ์ค๊ฐ์ Application์ด ๋ค์ด๊ฐ ๊ฒ์ด WAS์ด๋ค. ์ค๊ฐ์ Application์ด ๋ค์ด๊ฐ ์ด์ ๋, ์น ์๋ฒ์ ์ญํ ์ ํ๋ฉด์ ์ถ๊ฐ๋ก ์ ํ๋ฆฌ์ผ์ด์ , ๊ทธ๋ฌ๋๊น ํ๋ก๊ทธ๋จ ์ฝ๋๋ ์ํ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ฆฌํ๋ฉด ์น(HTTP)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ ์๋ฒ์ธ๋ฐ, ์ด ์๋ฒ๋ฅผ ํตํด์ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ ๊ฐ์ด ์คํํ ์ ์๋ ์๋ฒ๋ผ๋ ๋ป์ด๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ ๋ฐ๋ก ์์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์๋ธ๋ฆฟ ๊ตฌํ์ฒด๋ค์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฑํ ์๋ฒ๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ, ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ฅผ ์คํํด์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ(WAS)์ด๋ค
๊ทธ๋ฆฌ๊ณ WAS๋ web server + ์ปจํ
์ด๋
๋ผ๊ณ ๋ณผ ์ ์๋ค.
์? ์ปจํ ์ด๋? ์ด๊ฒ ๋ญ๊น?
was์ ์ ์ฒด๋ฅผ ์๋ ค๋ฉด, ์๋ธ๋ฆฟ ์ฆ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ผ๋ ๊ฐ๋ ์ ์ ์์์ผ ํ๋ค!
(์ ํํ๊ฒ๋, ์๋ธ๋ฆฟ ์ปจํ
์ด๋ = Servlet + JSP + EJB ์ปจํ
์ด๋
)
์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ๊ฐ๋ฐ์๊ฐ ์น์๋ฒ์ ํต์ ํ๊ธฐ ์ํ์ฌ ์์ผ์ ์์ฑํ๊ณ , ํน์ ํฌํธ์ ๋ฆฌ์ค๋ํ๊ณ , ์คํธ๋ฆผ์ ์์ฑํ๋ ๋ฑ์ ๋ณต์กํ ์ผ๋ค์ ํ ํ์๊ฐ ์๊ฒ ํด์ฃผ๋, ์๋ฐ ์น ์ดํ๋ฆฌ์ผ์ด์
๋์ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ธฐ์
์ด๋ค.(์๋ ์์ผ, ์คํธ๋ฆผ ๋ฑ, TCP/IP ๊ธฐ์ ๋ก ํต์ ํ๋ ๊ฒ์ด์์..)
๐ก Spring๊ณผ ๊ฐ์ด ๋๊ฒ ๋ณด์!
WAS์ ๋ํ์ ์ธ ์์๊ฐ Tomcat ์ด๋ค.
์ด Tomcat์ Java๋ก ์ฝ๋๋ก ๊ตฌํ๋์ด ์๋๋ฐ, Servlet์ด๋ผ๋ ์ต์์ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ณ , Tomcat์๊ฒ Reqeust๊ฐ ์ค๋ฉด, Tomcat์ด ์ถ๊ฐ์ ์ผ๋ก ๋ด์ฅํ๊ณ ์๋ WS(์น์๋ฒ)์๊ฒ ์ ์ ์ธ ํ์ด์ง๋ฅผ ์์ฒญํ๊ณ , ์ถ๊ฐ์ ์ผ๋ก ๋์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ, Servlet์๊ฒ ์ฑ ์์ ๋ ๋๊ธด๋ค!(ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์คํ-WAS์ ์ญํ !)
๊ทธ๋ผ Spring ์ดํ๋ฆฌ์ผ์ด์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ณด์, Spring ๋ด๋ถ์๋ Dispatcher Servlet์ด๋ ๊ฒ์ด ์๋ค. ์ด Dispatcher Servlet์ ์์์ ๋งํ Servelt์ ๊ตฌํํ๋ ํด๋์ค๋ก, ์๋flow๋ ๋ค์๊ณผ ๊ฐ๋ค.
WS์๊ฒ ์ ์ ์ธ ํ์ด์ง ์์ฒญ OR ๋์ ์ธ ํ์ด์ง ํ์ํ ๊ฒฝ์ฐ WAS์๊ฒ ์์ฒญ
1) WAS(tomcat)๋ ์์ฒญ์ ์ฒ๋ฆฌ ์ฑ ์์ Servelt์๊ฒ ์์
2) Spring์ Dispatcher Servelt์ด ์๋
3) FrontController์ธ Dispatcher Servelt์ด ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ Controller๋ค์ ํ์, ์ฒ๋ฆฌ ์ฑ ์ ์์(์ปค๋ฉํธํจํด)
@WebServlet(name = "helloServelt", urlPatterns = "/hello")
public class HelloServelt extends HttpServelt {
@Overrride
protected void service(HttpServeltRequest request, HttpServeltResponse response){
// ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง
}
}
/hello
)์ URL์ด ํธ์ถ๋๋ฉด ์๋ธ๋ฆฟ ์ฝ๋๊ฐ ์คํ๋๋ค.Servelt์ด๋ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ์ํ JAVA ํด๋์ค ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์๋ฐ ์๋ฒ ํ๋ก๊ทธ๋์
์ด๋ค. ์ด๊ฒ์ด ์ ํ์ํ๋๋ฉด ์นํ์ด์ง๋ฅผ ์๋ฒ์์ ๋์ (ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ์คํ)์ผ๋ก ์์ฑํ๊ธฐ ์ํจ์ด๋ค.
์ปจํ ์ด๋์ ์ํด ์คํ๋๋ฉด, ๊ฐ๋ฐ์๊ฐ ์์๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๊ฒ์ด ์๋, ํน์ ํด๋์ค๋ฅผ ์์๋ฐ์ ๊ตฌํ์ ์๋์ผ๋ก ์์ฑํด ์ฃผ๋ ๊ตฌ์กฐ์ด๋ค. ๊ทธ๋์ ๊ฐ๋ฐ์๊ฐ ํธํ๊ฒ ์น๊ตฌ๋์ ์ํ ๊ฐ๋ฐ์ ํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก Request ์์ฒญ(HttpServletRequest)
์ด๋, Response ์๋ต(HttpServletResponse)
์ ์ํ Servelt ๊ฐ์ฒด๋ค์ javax.servlet.http.HttpServelt ํด๋์ค
๋ฅผ ์์๋ฐ์ ๊ตฌํํ๋ค.
์ปจํ ์ด๋๋ ์๋ธ๋ฆฟ ๊ฐ์ฒด์ ์์ฑ, ์ด๊ธฐํ, ํธ์ถ, ์๋ฉธ๊น์ง์ ์ธ์์ฃผ๊ธฐ(Life Cycle)๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
โญ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๊ฐ์ฅ ํต์ฌ์ ์ธ flow๋ ๋ค์๊ณผ ๊ฐ๋ค!
1)
์์ฒญ(Request)์ด ๋ค์ด์ฌ ๋๋ง๋ค
2) ์๋ก์ด ์๋ฐ ์ค๋ ๋๋ฅผ ๋ง๋ ๋ค!
3) ๊ทธ๋ฆฌ๊ณ ์ด ์ค๋ ๋๊ฐ servlet์ ํธ์ถํ๋ค. (-> ํฅํ ์ค๋ ๋ Pool์ ๋ง๋ค์ด์ ์ค๋ ๋ ์์ฑ ๋น์ฉ์ ์ค์ธ๋ค.
)
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๊ธฐ๋ณธ 5๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
1) ๋คํธ์ํฌ ํต์
2) ์๋ธ๋ฆฟ ๊ฐ์ฒด ์ธ์์ฃผ๊ธฐ ๊ด๋ฆฌ
3) ์๋ธ๋ฆฟ ๊ฐ์ฒด ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ
4) JSP๋ ์๋ธ๋ฆฟ์ผ๋ก ๋ณํ ๋์ด์ ์ฌ์ฉ
5) ๋์ ์์ฒญ์ ์ํ ๋ฉํฐ ์ฐ๋ ๋ ์ฒ๋ฆฌ ์ง์
์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๋ํ์ ์ธ Servlet Container๊ฐ ์๋ค. ๋ฐ๋ก WAS์ ๋ํ์ฃผ์, Tomcat์ด๋ค~
์ง๊ธ๊น์ง ์ฌ์ฉ ๋ง์ด ํ ํฐ์บฃ์
warํ์ผ์ javaํ์ผ์์ Class๋ก ๋ง๋ค๊ณ ์ปดํ์ผํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค servlet๊ฐ์ฒด๋ฅผ ๋ง๋ค์๋ ๊ฒ
์ด๋ค.
์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ์ฌ์ฉ์๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ ๋ ๋ง๋ค ์์ฒญ์ ์ฒ๋ฆฌํ ์ค๋ ๋๋ฅผ ์์ฑํ๋ค.(์์ฒญ request : 1 Thread
)
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค๋ ๋์์ ํ์ํ ์๋ธ๋ฆฟ ๋ฉ์๋๋ฅผ ํธ์ถ
ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๊ณ ํด์ ์ค๋ ๋๋ฅผ ๋ฌด์ ํ์ผ๋ก ์์ฑํ๊ธฐ๋ง ํ๋ ๊ฒ์ ์๋๊ณ (๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ๋ง์ด ๋ค๊ธฐ๋๋ฌธ์
) ์ปจํ
์ด๋ ๋ด๋ถ์ Thread Pool(์ค๋ ๋ํ)์ ์ค๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ํ ๋นํ๊ณ , ์์ฒญํ ๋ ๊บผ๋ด ์ฌ์ฌ์ฉ
ํ๋ ๊ฒ์ด๋ค.
โณ๏ธ ์ฐธ๊ณ ๋ก, Tomcat์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ๋ฐ๊ธฐ ์ํด 200๊ฐ์ Thread๋ฅผ Thread Pool(์ค๋ ๋ํ)์ ์์ํด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ค.
์ด๊ฒ๋ ์์ฒญ์ด ์ฌ๋๋ง๋ค ๊ณ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๊ฒ์ ๋นํจ์จ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
โ
์๋ธ๋ฆฟ ๋ฉ๋ชจ๋ฆฌ ๋นํจ์จ์ ๋ง๊ธฐ ์ํ ์ฅ์น
1) ์ค๋ ๋ํ
2) ์ฑ๊ธํค
์ฆ, ์ต์ด ๋ก๋ฉ ์์ ์ ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ์ฌํ์ฉ(์ค๋ ๋ํ)ํ๋ฉฐ ๋ชจ๋ ์์ฒญ์ ๋์ผํ ์๋ธ๋ฆฟ ๊ฐ์ฒด ์ธ์คํด์ค(์ฑ๊ธํค)์ ์ ๊ทผํ๊ฒ ๋ฉ๋๋ค.
<๊น์ํ ์๋ธ๋ฆฟ ์ปจํ
์ด๋ was ๊ตฌ์กฐ>
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;
// ์๋ธ๋ฆฟ์ ๋งคํํ URL ํจํด ์ง์
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// GET ์์ฒญ ์ฒ๋ฆฌ
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ์์ฒญ์์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ธ์ค๊ธฐ
String name = request.getParameter("name");
if (name == null) {
name = "Guest"; // ๊ธฐ๋ณธ๊ฐ ์ค์
}
// ์๋ต์ ์ฝํ
์ธ ํ์
์ค์
response.setContentType("text/html");
// ํด๋ผ์ด์ธํธ์๊ฒ HTML ์๋ต ์์ฑ
response.getWriter().write("<html><body>");
response.getWriter().write("<h1>Hello, " + name + "!</h1>");
response.getWriter().write("</body></html>");
}
// POST ์์ฒญ ์ฒ๋ฆฌ
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ์์ฒญ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (์: ํผ ๋ฐ์ดํฐ)
String data = request.getParameter("data");
// ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์ถ๊ฐํ ์ ์์
System.out.println("Received data: " + data);
// ํด๋ผ์ด์ธํธ์ ์๋ต ๋ณด๋ด๊ธฐ
response.setContentType("text/plain");
response.getWriter().write("Data received successfully: " + data);
}
}
1) ํด๋ผ์ด์ธํธ ์์ฒญ ์์ :
์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ HTTP ์์ฒญ์ ๋ฐ์ HttpServletRequest ๊ฐ์ฒด์ HttpServletResponse ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
2) ์ค๋ ๋ ์ฒ๋ฆฌ:
์๋ธ๋ฆฟ ์ปจํ
์ด๋๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ค๋ ๋๋ฅผ ์์ฑํด ์๋ธ๋ฆฟ์ doGet ๋๋ doPost ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
3) ์๋น์ค ๋ก์ง ์ํ:
request ๊ฐ์ฒด์์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ฒ๋ฆฌํ๊ณ , response ๊ฐ์ฒด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์๋ต์ ์ ์กํฉ๋๋ค.
๋ค์ ์ ๋ฆฌํ์๋ฉด,
1) ์ฌ์ฉ์๊ฐ URL์ ํด๋ฆญํ๋ฉด HTTP Request๋ฅผ Servlet Container์ ๋ณด๋ธ๋ค.
2) Servlet Container๋ HttpServletRequest
, HttpServletResponse
๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
3) ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ถ์ํ์ฌ ์ด๋ ์๋ธ๋ฆฟ์ ๋ํ ์์ฒญ์ธ์ง ์ฐพ๋๋ค.
4) ์ปจํ
์ด๋๋ ์๋ธ๋ฆฟ service()๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉฐ, POST/GET ์ฌ๋ถ์ ๋ฐ๋ผ doGet() ๋๋ doPost()๊ฐ ํธ์ถ๋๋ค.
5) doGet()์ด๋ doPost() ๋ฉ์๋๋ ๋์ ์ธ ํ์ด์ง๋ฅผ ์์ฑํ ํ HttpServletResponse ๊ฐ์ฒด์ ์๋ต์ ๋ณด๋ธ๋ค.
6) ์๋ต์ด ์๋ฃ๋๋ฉด HttpServletRequest, HttpServletResponse ๋ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์ํจ๋ค.
์๋ธ๋ฆฟ ๋ด๋ถ์ ์ค๋ ๋ ์ฒ๋ฆฌ ์ฝ๋๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋(์: Tomcat, Jetty)๊ฐ ์ด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ปจํ ์ด๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๋ ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ค๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ค๋ ๋ ์ฒ๋ฆฌ ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ง์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ค๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ๋น์ทํ ๋์์ ๊ตฌํํ๋ ์๋ฐ ์ฝ๋๋ ์ ์ถ๋ฅผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadHandlingExample {
private static final int THREAD_POOL_SIZE = 10;
private ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
public void handleRequest(String request) {
threadPool.submit(() -> {
// ์์ฒญ ์ฒ๋ฆฌ ๋ก์ง
System.out.println("Handling request: " + request + " by thread " + Thread.currentThread().getName());
try {
// ์ฒ๋ฆฌ ์๋ฎฌ๋ ์ด์
(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
๋๋ ํ์ผ ์ฒ๋ฆฌ)
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Finished processing request: " + request);
});
}
public static void main(String[] args) {
ThreadHandlingExample example = new ThreadHandlingExample();
// ์ฌ๋ฌ ์์ฒญ ์ฒ๋ฆฌ ์๋ฎฌ๋ ์ด์
for (int i = 1; i <= 20; i++) {
example.handleRequest("Request " + i);
}
example.threadPool.shutdown(); // ๋ชจ๋ ์์
์๋ฃ ํ ์ค๋ ๋ ํ ์ข
๋ฃ
}
}
์ค๋ช )
์ค๋ ๋ ํ
: Executors.newFixedThreadPool์ ์ฌ์ฉํด ์ ํด์ง ์์ ์ค๋ ๋(์: 10๊ฐ)๋ฅผ ์์ฑํฉ๋๋ค.
๋น๋๊ธฐ ์์ ์ ์ถ
: ๊ฐ ์์ฒญ์ threadPool.submit()์ ํตํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ
: ๊ฐ ์ค๋ ๋๋ ์์ฒญ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ์๋ก ๊ฐ์ญํ์ง ์์ต๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ด๋ถ์ ์ธ ๊ตฌํ์ ์ด์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ํ์ง๋ง, ํจ์ฌ ๋ ๋ณต์กํ๊ณ ์ต์ ํ๋ ์ค๋ ๋ ๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
init(): ์๋ฒ๊ฐ ์ผ์ง ๋ ํ๋ฒ๋ง ์คํ
service(): ๋ชจ๋ ์ ์ ๋ค์ ์์ฒญ๋ค์ ๋ฐ๋๋ค.
destroy(): ์๋ฒ๊ฐ ๊บผ์ง ๋ ํ๋ฒ๋ง ์คํ
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ฒ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํ์ฌ ์คํํ ์๋ธ๋ฆฟ์ด ์ต์ด์ ์์ฒญ์ธ์ง ํ๋จํ๊ณ ์์ผ๋ฉด ํด๋น ์๋ธ๋ฆฟ์ ์๋ก ์์ฑํ๋ค. ์ด ์์ ์ ์ต์ด 1ํ๋ง ์ผ์ด๋๋ค.
init() ํด๋น ์ฌ์ฉ์ ์๋ธ๋ฆฟ์ด ์ต์ด ์์ฑ๋๊ณ ๋ฐ๋ก ํธ์ถ๋๋ ๋ฉ์๋์ด๋ค.
service() ์ต์ด์ ์์ฒญ์ด๋ 2๋ฒ์งธ ์์ฒญ์ด๋ ๊ณ์ ํธ์ถ๋๋ ๋ฉ์๋์ด๋ค.
์ฌ๊ธฐ์์ ์๋ธ๋ฆฟ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๋ค๋ฉด ์ฌ์ฉ์ ์ ์ HttpServlet์ destroy()๊ฐ ํธ์ถ๋ ๊ฒ์ด๋ค.
์๋ธ๋ฆฟ์ ์คํ ์์๋ ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌํ๋๊ฒ ์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌ๋ฅผ ํ๋ค. ์ฆ ์๋ธ๋ฆฟ์ ์ํด ์ฌ์ฉ์๊ฐ ์ ์ํ ์๋ธ๋ฆฟ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ํธ์ถ๋๊ณ ์ฌ๋ผ์ง๋ค.
์ด๋ ๊ฒ ๊ฐ๋ฐ์๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ ์ํด ๊ฐ์ฒด๋ค์ด ๊ด๋ฆฌ๋๋ ๊ฒ์ IoC(Inversion of Control)์ด๋ผ๊ณ ํ๋ค.
Servlet์ ์๋ธ๋ฆฟ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ๊ณ ์๋ ์ธํฐํ์ด์ค์ด๋ค. ์ด ํ์ค์ ๊ตฌํํด์ผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํด๋น ์๋ธ๋ฆฟ์ ์คํํ ์ ์๋ค.
GenericServlet์ Servlet์ธํฐํ์ด์ค๋ฅผ ์์ํ์ฌ ํด๋ผ์ด์ธํธ-์๋ฒ ํ๊ฒฝ์์ ์๋ฒ๋จ์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก์ ํ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ถ์ ํด๋์ค์ด๋ค. service()๋ฉ์๋๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ ์ ํ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํํ๋ค. GenericServletํด๋์ค๋ฅผ ์์ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ ์ฝ์ ๋ฐ๋ผ ๋ฉ์๋ ์ฌ์ ์ ๊ตฌ๋ฌธ์ ์ ์ฉํด์ผ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋ธ๋ฆฟ์ด๋ผํ๋ฉด ๊ฑฐ์ ๋๋ถ๋ถ HttpServlet์ ์์๋ฐ๋ ์๋ธ๋ฆฟ์ ์๋ฏธํ๋ค. HttpServlet์ GenericServlet์ ์์๋ฐ์์ผ๋ฉฐ, GenericServlet์ ์ ์ผํ ์ถ์ ๋ฉ์๋์ธ service๋ฅผ HTTP ํ๋กํ ์ฝ ์์ฒญ ๋ฉ์๋์ ์ ํฉํ๊ฒ ์ฌ๊ตฌํํด๋จ๋ค.
์ด๋ฏธ DELETE, GET, HEAD, OPTIONS, POST, TRACE๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๊ฐ ๋ชจ๋ ์ ์๋์ด ์๋ค.