티스토리 뷰

JSP

서블릿 및 서블릿 life cycle

yoooon1212 2024. 7. 1. 16:13

서블릿

자바 언어로 작성된 서버 측 컴포넌트로, 웹 애플리케이션에서 클라이언트의 HTTP 요청을 처리하고 동적인 웹 페이지를 생성하여 응답하는 역할을 합니다.

Java EE (Enterprise Edition) 사양의 일부로, 주로 HTML 페이지를 생성하고 데이터베이스와 연동하여 데이터를 처리하는 데 사용됩니다.

 

컴포넌트

여기서 "컴포넌트"라는 개념은 독립적으로 작동할 수 있는 소프트웨어의 작은 단위입니다. 서블릿은 웹 서버에서 독립적으로 실행되며, 클라이언트의 요청을 처리하고 응답을 생성하는 역할을 합니다.
예를 들어, 데스크톱 프로그램이나 모바일 앱에 사용되는 메뉴바, 툴바, 본문 영역 등이 각각의 컴포넌트로 볼 수 있습니다.

 

 

서블릿의 역할

  1. HTTP 요청 처리
    • 서블릿은 클라이언트로부터 들어오는 HTTP 요청을 처리합니다. 이 요청은 웹 브라우저, 모바일 애플리케이션 또는 다른 서버로부터 올 수 있습니다.
  2. 동적 웹 콘텐츠 생성
    • 서블릿은 데이터를 처리하여(연산) 동적으로 생성된 HTML, XML, JSON 등의 콘텐츠를 생성합니다.
  3. 상태 유지
    • 서블릿은 세션을 통해 클라이언트와의 상태를 유지할 수 있습니다. 예를 들어, 로그인 상태 유지, 장바구니 기능 등을 구현할 수 있습니다.
  4. 비즈니스 로직 처리
    • 서블릿은 데이터베이스 연동, 파일 처리 등 다양한 서버 측 비즈니스 로직을 수행합니다.

 

서블릿의 장점

  • 플랫폼 독립성: 자바로 작성되어 다양한 운영체제에서 실행될 수 있습니다.
  • 안정성: 자바의 강력한 예외 처리와 메모리 관리 기능을 활용할 수 있습니다.
  • 재사용성: 서블릿 클래스는 여러 웹 애플리케이션에서 재사용할 수 있습니다.
  • 확장성: 서블릿은 다양한 기능을 추가할 수 있는 확장성을 제공합니다.

 

서블릿의 단점

  • 복잡성: 초기 설정과 배포 과정이 복잡할 수 있습니다.
  • 학습 곡선: 자바와 서블릿 기술을 이해하고 사용하는 데 시간이 걸릴 수 있습니다.

 

package com.tenco;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * HttpServlet 클래스를 상속받아서 내가 정의한 클래스가 선언이 된다.
 * why? HTTP 프로토콜을 통한 request, response 처리를 할 수 있기 때문  
 * 
 * URL 맵핑에 대한 개념을 알자. 
 * 클라이언트가 특정 URL을 요청했을 때 해당 URL에 대응하는 서블릿을 
 * 실행하도록 설정하는 것을 의미 합니다.
 * URL 맵핑 - 2가지 방법 알아 보자.    
 */
//@WebServlet("/hello-servlet2")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	
	// 생성자 
    public HelloServlet() {
        super();
    }

    // 해당 서블릿 클래스가 인스턴스화 될 때 단 한번 실행 하는 메서드이다. 
	public void init(ServletConfig config) throws ServletException {
	}
	
	// 메모리에서 내려가기 직전에 호출 되는 메서드이다. 
	public void destroy() {
		
	}
	
	// GET 요청으로 들어 올 때 동작 됨
	// 주소 설계 - http://localhost:8080/hello/hello-servlet 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// MIME TYPE - 인터넷 세상에서 데이터의 유형을 나타내는 표준 방식 
		
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		response.getWriter().write("<html><body><h1>HELLO</h1><body></html>");
	}

	
	// POST 요청으로 들어 올 때 동작 됨 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}
}

 

 

MIME(Multipurpose Internet Mail Extensions) TYPE 

인터넷에서 데이터의 유형을 나타내는 표준 방식입니다. MIME TYPE은 주로 웹 브라우저와 웹 서버 간의 통신에서 사용됩니다.

MIME TYPE은 다음과 같은 형식 - "type/subtype"


주요 형식 확인
text/plain: 일반 텍스트 파일
text/html: html 형식
image/jpeg: JPEG 이미지 파일
application/pdf: PDF 문서
audio/mpeg: MP3 오디오 파일
video/mp4: MP4 동영상 파일

MIME TYPE은 웹 서버와 클라이언트 간의 통신에서 중요한 역할을 합니다.
웹 서버는 요청받은 파일의 MIME TYPE을 알려주고, 클라이언트는 이 정보를 사용하여 파일을 올바르게 처리할 수 있습니다.

 

 

서블릿 life cycle

서블릿이 생성되고 초기화된 후 요청을 처리하고 종료되기까지의 생명 주기를 의미합니다. 

 

 

WAS에는 웹컨테이너와 JSP 컨테이너가 있다.

WAS
--------웹컨테이너 
-----------------------서블릿 컨테이너 
----------------------------- 서블릿 클래스 로딩 
----------------------------- 서블릿 인스턴스 생성(생성자 호출) 
----------------------------- 서블릿 초기화(init 호출) 
----------------------------- 요청 처리( service, doGet, doPost)
----------------------------- 서블릿 소멸(destroy) 


----------------------- JSP 컨테이너

 

 

서블릿 라이프사이클 단계

서블릿 라이프사이클은 서블릿이 생성되고, 요청을 처리하며, 소멸되는 전체 과정입니다.
서블릿의 생명 주기는 세 가지 주요 메서드인 init(), service(), destroy() 로 구성됩니다.
  1. 클래스 로딩 (Class Loading)
  2. 인스턴스 생성 (Instantiation)
  3. 초기화 (Initialization)
  4. 요청 처리 (Request Processing)
  5. 종료 (destroy)

 

1. 클래스 로딩 (Class Loading)

  • 설명: 서블릿 컨테이너는 서블릿 클래스를 메모리에 로드합니다. 이 단계는 서블릿이 처음 요청되었을 때 또는 애플리케이션 시작 시 load-on-startup 설정에 따라 수행됩니다.
  • 역할: 서블릿 클래스의 바이트코드를 JVM으로 로드하여 서블릿을 실행할 준비를 합니다.

 

2. 인스턴스 생성 (Instantiation)

  • 설명: 서블릿 컨테이너는 로드된 서블릿 클래스로부터 인스턴스를 생성합니다.
  • 역할: 서블릿 객체를 메모리에 할당하여 이후 단계에서 사용할 수 있도록 준비합니다.

 

3. 초기화 (Initialization)

  • 설명: 서블릿 컨테이너는 init() 메서드를 호출하여 서블릿을 초기화합니다. 이 단계에서 서블릿은 초기화 작업을 수행합니다.
  • 역할: 서블릿이 요청을 처리하기 전에 필요한 초기 설정을 수행합니다.
@Override
public void init() throws ServletException {
    // 초기화 작업 수행
    System.out.println("필요한 객체 또는 데이터가 있다면 여기서 초기화 할 수 있습니다.");
    System.out.println("init() 메서드는 생애주기에서 단 한번만 호출이 됩니다.");
}

 

4. 요청 처리 (Request Processing)

  • 설명: 클라이언트의 요청이 들어올 때마다 서블릿 컨테이너는 service() 메서드를 호출합니다. service() 메서드는 HTTP 요청 메서드(GET, POST 등)에 따라 doGet(), doPost() 등의 메서드를 호출합니다.
  • 역할: 클라이언트의 요청을 처리하고 적절한 응답(연산)을 생성합니다.
service() 메서드는 여러 클라이언트 요청을 처리할 때 다중 스레드를 사용하여 
각 요청을 병렬로 처리합니다. 
service() 메서드는 한 번 호출되면 즉시 요청을 처리하고, 
처리 후에는 응답을 클라이언트로 반환하고 종료됩니다.(비동기 처리)

 

5. 종료 (destroy)

  • 설명: 서블릿이 더 이상 필요하지 않게 되면 서블릿 컨테이너는 destroy() 메서드를 호출하여 서블릿을 종료하고 자원을 해제합니다.
  • 역할: 서블릿이 사용하던 자원을 정리하고 종료 작업을 수행합니다.
@Override
public void destroy() {
    // 종료 직전에 해야될 작업이 있다면 수행 
    System.out.println("Servlet is being destroyed");
}

 

 

메서드 호출 순서

생성자() → init() → service() → doGet()/doPost() → destroy()

 

 

클래스 로딩 시점(서블릿 로딩)

서블릿이 메모리에 로드되고 초기화되는 시점은 다음 두 가지 경우 중 하나입니다.

첫 번째 요청 시 (On First Request)

- 서블릿 컨테이너는 서블릿에 대한 첫 번째 요청이 들어올 때 서블릿 클래스를 로드하고 인스턴스를 생성하며, init() 메서드를 호출하여 초기화합니다.
- 이 방식은 기본 동작 방식으로, 애플리케이션이 시작될 때 불필요한 서블릿 로드를 피할 수 있습니다.


애플리케이션 시작 시 (At Application Startup)

- 서블릿을 애플리케이션이 시작될 때 미리 로드하고 초기화하도록 설정할 수 있습니다. 이를 통해 초기화 지연을 방지하고, 애플리케이션 시작 시 필요한 작업을 미리 수행할 수 있습니다.
- 이 설정은 web.xml 파일의 <load-on-startup> 태그나 @WebServlet 애노테이션의 loadOnStartup 속성을 사용하여 지정할 수 있습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함