본문 바로가기

Development/Web

[Web]서블릿(Servlet)과 서블릿 컨테이너란?

서블릿(Servlet)이란?

웹 서버의 성능을 향상하기 위한 자바 클래스의 일종으로 기존에는 서버가 정적인 자료만 주고받았다. 하지만 웹 페이지에서 다양한 요구가 추가됨에 따라 사용자의 요구에 맞춘 동적인 페이지도 만들 필요가 생겼다. 이러한 것들을 위해 만들어진 것이 서블릿이다.

 

서블릿은 클라이언트의 요청에 맞춰 동적인 자료를 만들어주는 자바 웹 프로그래밍 기술이다.

서블릿은 JSP와 비슷하지만 JSP는 HTML 문서 안에 자바 코드를 포함하는 반면 서블릿은 자바 코드 안에 HTML을 포함한다는 차이가 있다.

 

서블릿의 특징

  • urlPattern의 URL이 호출되면 서블릿 코드가 실행
  • HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
  • HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
  • 개발자는 HTTP 스펙을 매우 편리하게 사용하게 된다.
  • 서블릿의 양식은 아래와 같다.
public class HelloServlet extends HttpServlet {
    @Override
    public void init()
    {
        ...
    }
    
    @Override
    public void destroy() 
    {
        ...
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        ...
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    {
        ...		
    }
}

 

서블릿 HTTP 요청, 응답 흐름

  • WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
  • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
  • 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
  • WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성

 

서블릿의 생명주기

서블릿도 자바 클래스이므로 초기화부터 소멸까지의 과정을 거치게 된다. 이 과정을 서블릿 생명주기라 하며, 각 단계마다 기능을 수행하는 메서드들을 서블릿 생명주기 메서드라고 한다.

 

1. 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고 없을 경우 init() 메서드를 통해서 메모리에 적재한다. init() 메서드는 처음에 한 번만 실행되기 때문에 서블릿 스레드에서 공통적으로 사용해야 되는 것이 있다면 init() 메서드를 오버라이딩 하여 구현하면 된다.

2. init()이 호출된 후 클라이언트의 요청에 따라서 service() 메서드를 통해서 요청에 대한 응답이  doGet()과 doPost()로 분기된다. 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해서 request와 response 객체가 제공된다.

3. 컨테이너가 서블릿에 종료를 요청하면 destroy() 메서드가 호출이 된다. 종료 시에 처리되어야 하는 로직들은 destroy() 메서드를 오버라이딩 하여 구현하면 된다.

 

서블릿 컨테이너란?

구현되어 있는 servlet 클래스의 규칙에 맞게 서블릿을 담고 관리해 주는 컨테이너다. 클라이언트에서 요청을 하면 컨테이너에서는 HttpServletRequest, HttpServletResponse 두 객체를 생성하여 동적인 페이지를 생성하여 응답을 보낸다.

 

또한 서블릿 컨테이너는 아래와 같은 특징을 갖는다.

 

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
  • 서블릿 객체는 싱글톤으로 관리한다.
    • 고객이 요청을 할 때마다 계속 객체를 생성하는 것은 비효율적
    • 최초 로딩 시점에 서블릿 객체를 미리 만들고 재활용
    • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
    • 공유 변수 사용 주의
    • 서블릿 컨테이너 종료 시 함께 종료
  • JSP도 서블릿으로 변환되어서 사용
  • 동시 요청을 위한 멀티 스레드 지원

 


출처 : 인프런 우아한 형제들 최연소 기술이사 김영한의 스프링 완전 정복(스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술)

'Development > Web' 카테고리의 다른 글

[Web]Redirect와 Forward의 차이와 사용법  (0) 2023.05.15
[Web]쓰레드와 멀티 쓰레드  (0) 2023.04.22
[Web]Web Server와 Web Application Server  (0) 2023.04.16