servlet

[servlet] 1. 서블릿의 개념, 동작원리 및 생명주기(Lifecycle) 관리

jeri 2024. 5. 22. 23:05
반응형

1) 서블릿(Servlet)의 개념

  • Java Web Server Program
  • Server + let 합성어웹서버에서 실행되는 간단한 프로그램
  • (Web Application를 만들어 주는 Java 프로그램)
  • 웹프로그램은 클라이언트 요청에 의해 WAS(Web Application Server)로 실행되며 ,
  • 실행결과를 동적으로 생성하여 웹문서로 응답하거나 일반적인 text data로 응답함
  • Servlet 프로그램WAS에 의해 관리됨 ( 생성 - WAS에 의해 메모리에 로드됨 , 사용 , 소멸 )
  • WAS(Web Application Server)

: Web Server( 요청과 응답 ) + Web Container( 서블릿 관리 )

2. 웹프로그램 동작 원리

step1

  • 이제부터 클라이언트는 html문서 요청이 아닌, 웹프로그램을 요청할 것임
  • 클라어인트가 요청한 웹프로그램 = 자바로 만든 프로그램 (Servlet)
  • 클라이언트의 요청이 없다면 웹프로그램 실행이 안됨!!!

step2

  • 클라이언트가 웹프로그램을 WAS에게 요청할 때 필요한 정보들을 request메세지에 담아 보낼 것임
  • request 메세지의 head : 클라이언트의 일반적인 정보들 저장(클라이언트가 가진 쿠키, 브라우저 정보, ..)
  • request 메세지의 body : 기본적으로 사용하지 않음, post방식의 웹프로그램 요청 시 이용(form태그)

step3

  • WAS(서버)는 클라이언트의 요청에 의해
    1. 등록된 웹프로그램에 대한 클래스를 찾아서 해당 프로그램을 객체로 만들고,
    2. 객체의 메소드를 호출
    3. 결과(html문서)를 response메세지로 클라이언트에게 응답함
  • 만약 똑같은 웹프로그램을 요청한다면? 다시 객체로 만들지 않고, 필요한 메소드만 호출함
  • WAS가 start 하면 web.xml을 읽어들임
  • web.xml (어떤 Servlet이 어떤 URL 주소로 매핑되었다는 정보) : 이 URL 주소로 요청하면 Servlet이 실행될 거에요~~

3. 서블릿 객체의 LifeCycle(생명주기) 관리

1) 서블릿 객체의 생성

  • 서블릿(웹프로그램)은 클라이언트 요청에 의해 WAS에 등록된 서블릿 클래스를 읽어 메모리에 저장하고
  • 서블릿 객체로 생성하여 요청 처리 메소드를 호출
  • 클라이언트 요청에 의한 서블릿 객체가 이미 생성되어 있는 경우 새로운 서블릿 객체를 생성하지 않고 기존 서블릿 객체를 사용하여 요청 처리 메소드 호출
  • 웹은 프로그래머가 직접 객체를 만드는 것이 아닌, 웹컨테이너(WAS)가 객체를 만들어줌

2) 서블릿 객체의 소멸

  • WAS 프로그램이 종료되면 WAS 프로그램에 의해 관리되는 모든 서블릿 객체 소멸
    • WAS 프로그램의 주요 기능 중 하나는 서블릿 객체를 관리하는 웹컨테이너(Web Container) 기능 제공
    • 컨테이너(Container) : 프로그램 관련 객체(Component)의 생명주기(LifeCycle)관리(생성,사용,소멸)하는 프로그램

3) 서블릿 객체의 생명주기 관리(생성,사용,소멸) 예시

  • "[servlet] 2. 서블릿 클래스 작성하는 법" 참고
LifeCycleServlet.java
package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//💝6.
@WebServlet("/life.itwill")

//💝1.
public class LifeCycleServlet extends HttpServlet {

	//1.객체 직렬화 클래스의 serialVersionUID 필드 선언
	private static final long serialVersionUID = 1L;

	//2.필드 선언
	private String name;

	//🐱생성자
	//3.생성자(Constructor)선언 : 클래스 자료형으로 객체를 생성하기 위한 특별한 메소드
	// => 초기화 작업 관련 명령 작성 - 객체 생성시 필드에 필요한 초기값 저장
	// => 클라이언트 요청에 의해 WAS 프로그램이 서블릿 클래스로 서블릿 객체를 생성하기 위해 딱 한번만 호출됨
	public LifeCycleServlet() {
		System.out.println("### LifeCycleServlet 클래스의 생성자 호출 - 서블릿 객체 생성 ###");
		//name="홍길동";
	}

	//🐱init() 메소드 - 초기화 작업 메소드
  	//=> 서블릿 객체 생성 시 호출 (1번만 호출)
	//=> 서블릿에 대한 초기화 작업을 위한 메소드, 서블릿 클래스의 생성자는 서블릿 관련 초기화 작업에 부적절
	//💝2.
  	//init()메소드
	//WAS 프로그램에 의해 서블릿 객체가 생성되자 마자 "가장 먼저 한번만" 자동 호출되는 메소드
	// => 초기화 작업 관련 명령 작성
	// => 서블릿은 생성자 대신 "init() 메소드"를 이용하여 "초기화 작업 명령"을 작성하는 것을 권장

	//생성자 대신 init() 메소드로 초기화 작업 명령을 작성하는 이유?
	//=> init() 메소드의 매개변수로 [ServletConfig 객체]를 전달받아 메소드에서 사용 가능
	//=> [ServletConfig 객체] : 웹자원(WebContext)을 생성하기 위한 환경설정 관련 정보를 저장한 객체
	//=> [web.xml] 파일에서 제공되는 값을 얻어와 서블릿 클래스에서 사용 가능 - 유지보수의 효율성 증가

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("### LifeCycleServlet 클래스의 init() 메소드 호출 ###");
		//name="홍길동";

		//ServletConfig.getServletContext() : ServletContext 객체를 반환하는 메소드
		//=>ServletContext 객체 : 웹자원 관련 정보를 저장한 객체
		//ServletContext.getInitParameter(String name) : [web.xml] 파일에서 context-param
		//엘리먼트로 제공되는 값을 얻어와 반환하는 메소드
		name=config.getServletContext().getInitParameter("name");
	}

	//🐱destroy() 메소드 - 마무리 작업 메소드
  	//=> 서블릿 객체 소멸 시 호출 (1번만 호출)
	//=> 서블릿에 대한 마무리 작업을 위한 메소드
	//💝2.
  	//destroy()메소드
	//WAS 프로그램에 의해 서블릿 객체가 "소멸되기 전 마지막으로 한번만" 자동 호출되는 메소드
	// => 마무리 작업 관련 명령 작성
	// => WAS 프로그램이 종료될 경우 WAS 프로그램에 의해 관리된 모든 서블릿 객체 소멸
	@Override
	public void destroy() {
		System.out.println("### LifeCycleServlet 클래스의 destroy() 메소드 호출 ###");
	}

	//🐱service() 메소드[ (doGet() 또는 doPost() ]
  	//=> 서블릿 객체를 이용(클라이언트 요청)시 호출되는 메소드 (요청할때마다 호출)
  	//=> 요청에 대한 응답처리를 하기 위한 메소드
	//💝2.
  	//service()메소드
	//클라이언트 요청에 대한 처리와 처리 결과를 파일로 응답하기 위한 명령을 작성하는 메소드
	// => 클라이언트 요청마다 WAS 프로그램에 의해 서블릿 객체로 반복 호출되는 메소드
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("### LifeCycleServlet 클래스의 service() 메소드 호출 ###");

		//💝3.
		//🍋HTML파일로 응답
		response.setContentType("text/html;charset=utf-8");
  		//💝4.
		PrintWriter out = response.getWriter();

		//💝5.
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿의 생성 주기(LifeCycle)</h1>");
		out.println("<hr>");
		//out.println("<p>홍길동님, 안녕하세요.</p>");
		out.println("<p>"+name+"님, 안녕하세요.</p>");
		out.println("</body>");
		out.println("</html>");
	}

}

web.xml 수정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xmlns="<http://xmlns.jcp.org/xml/ns/javaee>" xsi:schemaLocation="<http://xmlns.jcp.org/xml/ns/javaee> <http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd>" id="WebApp_ID" version="4.0">
  <display-name>servlet</display-name>

  <!-- 🐱context-param : 현재 프로젝트에 작성된 모든 웹프로그램에게 필요한 값을 제공하기 위한 엘리먼트 -->
  <!-- 아래의 context-param은 모든 클래스에서 사용 가능 -->
  <context-param>
  	<!-- 🐱param-name : 제공값을 구분하기 위한 이름(식별자)을 설정하는 엘리먼트 -->
  	<param-name>name</param-name>
  	<!-- 🐱param-value : 제공될 값을 설정하는 엘리먼트 -->
  	<param-value>홍길동</param-value>
  </context-param>

  <servlet>
  	<servlet-name>hello</servlet-name>
  	<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
  
  	<!-- 🐱init-param : 현재 서블릿(웹프로그램)에게 필요한 값을 제공하기 위한 엘리먼트 -->
    <!-- 아래의 init-param은 HelloServlet 클래스에서만 사용 가능 -->
  	<init-param>
  		<param-name>title</param-name>
  		<param-value>서블릿</param-value>
  	</init-param>
  </servlet>

  <servlet-mapping>
  	<servlet-name>hello</servlet-name>
  	<url-pattern>/hello.itwill</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  </web-app>

4. 웹프로그램(서버)만이 접근해서 사용할 수 있는 파일들 - 은닉화된 폴더

  • 클라이언트가 사용할 수 없음
  • META-INF , WEB-INF

5. 클라이언트에게 주고 싶은 MimeType 설정 보는 법

6. 이클립스 경로 VS 웹디렉토리 경로

  • (좌) : 워크스페이스 경로 - 이클립스에서 작업하면 저장되는 경로
    • 단순히 프로젝트에 있는 파일일 뿐이지 웹자원이 되지는 못함. 아파치 톰캣이 start 하면서 파일들이 전부 웹자원으로 바뀌는 것
  • (우) : 웹디렉토리 경로 - 아파치 톰캣이 가진 웹자원의 경로

반응형