Programming/Java

[Servlet / JSP] 서블릿

seandoesdev 2023. 8. 17. 00:05

서블릿

서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.

자바의 모든 특징을 가지지만, 차이점은 독자적으로 실행되지 못하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다는 것이다.

서블릿이 있는 웹의 동작 방식

클라이언트가 웹 서버에 요청하면 웹 서버는 그 요청을 톰캣과 같은 웹 애플리케이션 서버(WAS)에 위임한다. 그러면 WAS는 각 요청에 해당하는 서블릿을 실행한다. 그리고 서블릿은 요청에 대한 기능을 수행한 후 결과를 반환하여 클라이언트에 전송한다.

특징

  • 서버 쪽에서 실행되면서 기능을 수행한다.
  • 기존의 정적인 웹 프로그램의 문제점을 보완하여 동적인 여러 가지 기능을 제공한다.
  • 스레드 방식으로 실행된다.
  • 객체 지향적이다.
  • 컨테이너에서 실행된다.
  • 컨테이너 종류에 상관없이 실행된다.(플랫폼 독립적)
  • 보안 기능을 적용하기 쉽다
  • 웹 브라우저에서 요청 시 기능을 수행한다.

서블릿 API 계층 구조와 기능

서블릿 API는 Servlet과 ServletConfig 인터페이스를 구현해 제공하며 GenericServlet 추상 클래스가 이 두 인터페이스의 추상 메서드를 구현한다. 그리고 이 GenericServlet을 다시 HttpServlet이 상속받는다.

서블릿 구성 요소 기능

서블릿 구성 요소 기능
Servlet 인터페이스 - javax.servlet 패키지에 선언되어 있다. - Servlet 관련 추상 메서드를 선언한다. - init(), service(), destory(), getServletInfo(), getServletConfig()를 선언한다.
ServletConfig 인터페이스 - javax.servlet 패키지에 선언되어 있다. - Servlet 기능 관련 추상 메서드가 선언되어 있다. - getInitParameter(), getInitParameterName(), getServletContext(), getServletName()선언 되어 있다.
GenericServlet 클래스 - javax.servlet 패키지에 선언되어 있다. - 상위 두 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스이다. - GenericServlet을 상속받아 구현한 사용자 서블릿은 사용되는 프로토콜에 따라 각각 service()를 오버라이딩해서 구현한다.
HttpServlet 클래스 - javax.servlet.http 패키지에 선언되어 있다. - GenericServlet을 상속받아 HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행한다. - 웹 브라우저 기반 서비스를 제공하는 서블릿을 만들 때 상속받아 사용한다. - 요청 시 service()가 호출되면서 요청 방식에 따라 doGet()이나 doPost()가 차례대로 호출된다.

GenericServlet 클래스는 일반적인 여러 통신 프로토콜에 대한 클라이언트/서버 프로그램에서 서블릿 기능을 구현하는 클래스이다.

HttpServlet 클래스는 HTTP 프로토콜을 사용하는 서블릿 기능을 구현한다. 이 클래스를 상속받아 HTTP 프로토콜로 동작하는 웹 브라우저의 요청을 처리하는 서블릿을 구현한다.

HttpServlet의 여러 메서드

메서드 기능
protected doDelete(HttpServletRequest req, HttpServletResponse resp) 서블릿이 DELETE request를 수행하기 위해 service()를 통해서 호출된다.
protected doGet(HttpServletRequest req, HttpServletResponse resp) 서블릿 GET request를 수행하기 위해 service()를 통해서 호출된다.
protected doHead(HttpServletRequest req, HttpServletResponse resp) 서블릿이 HEAD request를 수행하기 위해 service()를 통해서 호출된다.
protected doPost(HttpServletRequest req, HttpServletResponse resp) 서블릿이 POST request를 수행하기 위해 service()를 통해서 호출된다.
protected service(HttpServletRequest req, HttpServletResponse resp) 표준 HTTP request를 public service()에서 전달받아 doXXX() 메서드를 호출한다.
public serivce(HttpServletRequest req, HttpServletResponse resp) 클라이언트의 request를 protected service()에게 전달한다.

서블릿의 생명주기 메서드

서블릿의 생명주기 메서드란 서블릿 실행 단계마다 호출되어 기능을 수행하는 콜백 메서드를 말한다.

생명주기 단계 호출 메서드 특징
초기화 init() - 서블릿 요청 시 맨 처음 한 번만 호출된다. - 서블릿생성 시 초기화 작업을 주로 실행한다.
작업 수행 doGet() doPost() - 서블릿 요청 시 매번 호출된다. - 실제로 클라이언트가 요청하는 작업을 수행한다.
종료 destroy() - 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출된다. - 서블릿의 마무리 작업을 주로 수행한다.

초기화와 종료는 필요 없는 경우 생략해도 무방하다. 하지만 작업 수행으로 doGet()이나 doPost()는 서블릿의 핵심 기능을 처리하므로 반드시 구현해야 한다.

실습

사용자 정의 서블릿 만들기

서블릿 생명주기 메서드 구현

서블릿 매핑 작업

클래스의 이름이 길거나, 어느 기능인지 짐작하기 어렵거나 보안상 등의 문제로 서블릿 클래스 이름에 대응되는 서블릿 매핑 이을므올 실제 서블릿을 요청한다. 서블릿 매핑은 중복해서는 안 된다.

서블릿 매핑 과정

  1. 각 프로젝트에 있는 web.xml에서 설정한다.
  2. <servlet> 태그와 <servlet-mapping> 태그를 이용한다.
  3. 여러 개의 서블릿 매핑 시에는 <servlet> 태그를 먼저 정의하고 <servlet-mapping> 태그를 정의한다.
<servlet> <!--브라우저에서 요청하는 패밍 이름에 대해 실제로 실행하는 서블릿 클래스를 설정하는 태그 -->
	<servlet-name>aaa</servlet-name>
	<servlet-class>com.servlet.exam01</servlet-class> <!-- 브라우저에서 요청하는 매핑 이름에 대해 실제로 기능을 수행하는 서블릿 클래스를 설정 -->
</servlet>

<servlet-mapping>
	<servlet-name>aaa</servlet-name> <!-- 매핑 이름으로 요청 시 값이 같은 <servlet> 태그 안의 <servelt-name> 태그와 연결 -->
	<url-pattern>first</url-pattern> <!-- 브라우저에서 com.servlet.exam01을 요청하는 논리적인 서블릿 이름 -->
</servlet-mapping>

애너테이션을 이용한 서블릿 매핑

@WebServlet("/third")
public class ThirdServlet extends HttpServlet{
	...
}

웹 브라우저에서 서블릿 매핑 이름으로 요청하기

서블릿 동작 과정

  1. url을 통해 톰캣 컨테이너로 요청을 보낸다.
  2. 요청을 확인하고 url에 명시된 servlet이 메모리에 존재하는지 확인한다.
  3. servlet이 없는 경우 메모리에 로드하고 최초의 요청이므로 init() 호출하여 servlet 인스턴스를 메모리에 로드→ doGet() 또는 doPost() 호출하여 서비스한다.
  4. servlet이 메모리에 있는 경우 바로 doGet() 또는 doPost()를 호출하여 서비스한다.

브라우저를 통해 처음 요청과 응답이 끝나면 그 다음 생성된 탭에서는 Servlet이 메모리에 상주하고 있으므로 재사용된다. 이 방식이 스레드 방식이다.