[Servlet] Servlet이란?

지니·2025년 6월 8일

JAVA

목록 보기
9/9
post-thumbnail

1. Servlet이란?


클라이언트의 요청(request)을 받고 이를 처리해 응답(response)을 보내주는 서블릿 클래스를 구현한 자바 웹 프로그래밍 기술이다.

1-1. Servlet이 되기 위해서는?

servlet에는 몇 가지 설계 규약이 존재한다.

  • 모든 Servlet은 javax.servlet.Servlet interface를 상속 받아 구현한다.
  • Servlet 구현 시 Servlet interface와 ServletConfig interface를 javax.servlet.GenericServlet에 구현한다.
  • HTTP 프로토콜을 사용하는 Servlet은 HttpServlet Class를 상속 받는다. (javax.servlet.http.HttpServlet Class는 javax.servlet.GenericServlet를 상속받은 Class이다.)
  • Servlet의 Exception을 처리하기 위해서는 javax.servlet.ServletException을 상속 받아야 한다.

1-2. 서블릿 mapping 방법

클라이언트가 서블릿의 url로 요청을 보내면 톰캣이 이를 해석해 매핑된 서블릿으로 연결하는 구조

1-2-1. xml에 서블릿 등록하기

web.xml로 등록하면 mapping 정보를 한눈에 확인하고 관리할 수 있다. 하지만, 새로운 서블릿을 추가할 때마다 파일을 이동해서 mapping 정보를 등록하고 일일이 확인해야 한다.

<!-- Servlet 등록 -->
<servlet>
	<!-- xmlmapping 라는 이름을 가지는, 실제 클래스의 경로 -->
    <servlet-name>xmlmapping</servlet-name>
    <servlet-class>com.section01.xml.LifeCycleTestServlet</servlet-class>
	  <!-- 초기화 되는 순서 지정지정 -->
    <load-on-startup>100</load-on-startup>
</servlet>

<!-- 어떤 요청이 들어오면 어떻게 해야 하는가? -->
<servlet-mapping>
	<!-- /xml-lifecycle이라는 url 요청이 들어오면, xmlmapping을 실행해주세요!-->
    <servlet-name>xmlmapping</servlet-name>
    <url-pattern>/xml-lifecycle</url-pattern>
</servlet-mapping>

1-2-2. annotation 사용하기

@annotation으로 등록하는 것이 xml을 이용해 등록하는 것보다 더 간결하기 때문에 이 방법을 선호한다. 다만, @annotation으로 관리하는 경우 통합 관리가 안된다는 단점이 있다.

@WebServlet(value = "/annotation-lifecycle", loadOnStartup = 1)
public class LifeCycleTestServlet extends HttpServlet {
	(Servlet code)
}

2. Servlet의 동작

2-1. Servlet의 동작 과정

🔎 동작 흐름 살펴보기

  1. 클라이언트 : http://localhost:8080/hello-servlet 라는 요청을 보냄
  2. 서블릿 컨테이너를 호출
  3. 서블릿 컨테이너가 요청을 바탕으로 이에 연결되는 서블릿 객체를 가져옴

🤔 Servlet Container란?

  • 웹 서버에서 온 요청을 받아 Servlet를 관리하는 역할(= 생명 주기 관리)
  • Servlet에 대한 설명은 Deployment Descriptor(web.xml) 파일을 이용한다.

2-2. Servlet의 생명주기

(1) 첫 요청이면 인스턴스 생성 & init() 호출

init() : 서블릿 컨테이너에 의해서 호출되는 메소드로 최초 요청 시에만 실행하고 2번째 요청부터는 호출되지 않는다.

(2) 이후 작업이 실행 될 때마다 service() 메소드가 요청한 HTTP Type에 따라 doGet(), doPost() 메소드를 호출

service() : 서블릿 컨테이너에 의해서 호출되며, 최초 요청 시에는 init()이후에 작동하고 그 이후부터는 init() 호출 없이 작동한다.

(3) 서블릿이 서비스 되지 않으면 destory()

destory() : 컨테이너가 종료 될 때나 서블릿의 내용이 변경되어 재컴파일 될 때 호출되는 메소드로, 주로 자원을 반납하는 용도로 사용한다.

초기화 : init()
작업 수행 : doGet(), doPost()
종료 : destory()

0개의 댓글