delpho

Servlet (등장 배경, 생명 주기, 동작 방식, Servlet Container) 본문

CS/Spring

Servlet (등장 배경, 생명 주기, 동작 방식, Servlet Container)

delpho 2024. 4. 3. 15:01

[ 0. 들어가기 전 ]

바로 이전 포스팅에서는 스프링 프레임워크가 어떻게 등장하게 됐는지를 www의 탄생부터 지금까지 시간 순서대로 알아보았습니다. CGI의 한계로 Servlet이 등장하게 되었는데, 이 Servlet은 서버에서의 핵심 기술이기에 여러 출처를 기반으로 정리해보았습니다.

 

 

[ 1. Servlet의 등장 배경 ]


초창기 웹 서비스의 서버는 정적 데이터만 전달해주는 기능을 가지고 있었습니다. 하지만, 사용자의 요청에 따른 동적인 처리가 불가능했고, 이를 해결하기위해 등장한 것이 CGl입니다.

 

 

CGl (Common Gateway Interface)는 동적 데이터를 처리하는 Web Server와 프로그램 사이의 인터페이스(규약)입니다. CGI는 Web Server의 요청을 받으면, 동적 컨텐츠를 전달합니다. 하지만, CGI는 멀티프로세스 방식이라, Request마다 프로세스를 생성하기 때문에 메모리 사용량이 높았습니다.

 

따라서, 프로세스가 아닌 스레드를 생성하는 방식의 Servet이 등장하였습니다.

 

 

 

[ 2. Servlet ]


Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술

 

 

웹에서는 다양한 요청(Request)과 응답(Response)이 있으며, 이 요청과 응답에는 규칙이 존재합니다. 이러한 요청과 응답을 일일이 파싱해서 처리하려면 굉장히 힘들것입니다. Servlet은 이러한 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이라고 생각하시면 될것 같습니다. 즉, 웹과 통신하면서 발생하는 반복 작업(HTTP 요청 및 응답)들을 표준화? 일반화? 시켜서 개발하기 편하게 만든 것이라고 생각!

 

서블렛을 사용하면 어떤 편리함이 있는지 알아봅시다. 아래는 실제 HTTP 요청과 응답입니다.

 

 

이것들을 개발자가 직접 일일히 파싱하고 해석하고 처리한다면 개발자들은 해야 할 일이 엄청나게 많을 것입니다. 서블렛은 요청 메세지를 읽고 응답을 만들어주는 역할을 하며 개발자는 비즈니스 로직에만 집중하면 되도록 해줍니다.

 

 

 

[ 3. Servlet의 생명 주기 ]


  • init()
    • 클라이언트 요청이 들어오면 컨테이너는 서블릿이 메모리에 있는지 확인한다. 메모리에 없다면 init() 메서드를 호출하여 초기화 작업을 수행합니다.
    • 이 단계는 서블렛이 처음 요청을 받았을때 한번만 실행됩니다.
  • service()
    • 클라이언트로부터 요청을 받을 때마다 service 메소드가 호출되고, 이 메소드는 HTTP 요청 유형(GET, POST 등)에 따라 doGet, doPost와 같은 메소드를 호출하여 요청을 처리합니다.
    • 이때 HttpServletRequest, HttpServletResponse 에 의해 request, response 객체가 제공됩니다.
  • destroy()
    • 컨테이너가 서블릿에 종료 요청을 하면 destroy() 메서드가 호출됩니다. 종료시 처리해야하는 작업은 destroy() 메서드를 오버라이딩하여 구현하면 된다.

 

 

[ 4. Servlet의 동작 방식 ]


 

  1. 클라이언트 요청: HTTP 요청을 웹 서버에 보냅니다.
  2. 요청 분석 및 서블릿 매핑 참조: 웹 서버(또는 서블릿 컨테이너)는 요청을 받고, 요청의 URL을 분석합니다. 이때, 서블릿 매핑 정보를 참조하여 해당 URL이 어떤 서블릿 클래스에 매핑되어 있는지를 확인합니다. 이 매핑 정보는 web.xml 파일이나 서블릿 클래스 내의 어노테이션을 통해 정의됩니다.
  3. 서블릿 로드 및 인스턴스 생성: 매핑을 통해 식별된 서블릿이 메모리에 로드되지 않았다면, 서블릿 클래스를 로드하고 인스턴스를 생성합니다.
  4. 서블릿 초기화: 서블릿 인스턴스가 처음 생성될 때, 서블릿 컨테이너는 init() 메서드를 호출하여 서블릿을 초기화합니다. 이 단계는 서블릿의 생명주기에서 한 번만 발생합니다.
  5. 요청 처리:  초기화된 서블릿 인스턴스에 대해, 서블릿 컨테이너는 HttpServletRequest와 HttpServletResponse 객체를 생성하고 service() 메서드를 호출합니다. 이 메서드는 요청의 HTTP 메소드 유형(GET, POST 등)을 확인하고, 해당하는 doGet(), doPost() 등의 메서드를 호출하여 실제 요청을 처리합니다.
  6. 응답 생성 및 반환: 서블릿은 요청 처리를 완료한 후, 응답 데이터를 생성합니다. 이 응답은 클라이언트에게 HTTP 응답 형태로 전송됩니다.
  7. 서블릿 종료: 서블릿 인스턴스가 더 이상 필요하지 않을 때, 예를 들어 웹 애플리케이션이 종료될 때, destroy() 메서드가 호출되어 서블릿이 종료됩니다. HttpServletRequest, HttpServletResponse 객체를 소멸합니다. 이 메서드는 서블릿의 자원을 정리하는 데 사용됩니다.

 

 

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_3_1.xsd"
     version="3.1">
 
     <servlet> //서블릿 클래스를 서블릿으로 등록
           <servlet-name>myServlet</servlet-name> //해당 서블릿을 참조할 때 사용할 이름
           <servlet-class>com.example.controller.MyServlet</servlet-class> //서블릿으로 사용할 서블릿 클래스의 FullName
     </servlet>
 
     <servlet-mapping>
           <servlet-name>myServlet</servlet-name> //매핑할 서블릿의 이름
           <url-pattern>/myServlet</url-pattern> //매핑할 URL 패턴
     </servlet-mapping>
 
</web-app>​
web.xml 말고 어노테이션으로도 서블릿 매핑 가능 (단, 서블릿 3.0 이상부터 가능)

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
    // 클래스 구현
}​
Servlet 작성 예시

public class myServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init method 호출!");
    }
    
    @Override
    public void destroy() {
        System.out.println("destroy method 호출!");
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        System.out.println("doGet service method 호출!");		
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        System.out.println("doPost service method 호출!");		
    }
	
}​

HttpServletRequest

http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용하며 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 Stream을 읽어 들이는 메서드를 가지고 있습니다.

HttpServletResponse

WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달하고 이 객체를 활용하여 content type, 응답 코드, 응답 메시지 등을 전송합니다.

 

 

 

 

 

 

[ 5. 서블릿 컨테이너 Servlet Container ]


스스로 동작하지 않는 서블릿의 생명 주기를 관리하고, 서블릿이 클라이언트의 요청에 대응하여 동적으로 컨텐츠를 생성할 수 있도록 하는 WAS의 일부

 

서블릿 컨테이너는 자바 웹 애플리케이션의 핵심적인 부분으로, HTTP 요청과 응답을 처리하는 서블릿 클래스의 인스턴스를 관리합니다. Apache Tomcat은 가장 널리 사용되는 오픈 소스 서블릿 컨테이너 중 하나입니다. 가벼운 웹 서버와 서블릿 컨테이너 기능을 제공합니다.

 

 

[ 6. 서블릿 컨테이너의 주요 기능 ]


  1. 통신 지원: 클라이언트로부터 HTTP 요청을 받고, 응답을 클라이언트에게 보낼 수 있도록 웹서버와 소켓을 만들어서 서블릿과 웹서버가 통신할 수 있도록 해줍니다. 우리가 통신을 한다고 생각할 때 소켓을 만들고, 특정 포트를 리스닝하고, 연결 요청이 들어오면 스트림을 생성해서 요청을 받는다고 알고 있는데 이 과정을 서블릿 컨테이너가 대신 해 주고 있는것입니다. 서블릿 컨테이너는 이렇게 소켓을 만들고 listen, accept 등의 기능을 API로 제공하여 웹 서버와 통신하는 과정을 생략할 수 있도록 해주기 때문에 개발자는 비즈니스 로직에만 집중하면 됩니다. 서블릿 컨테이너는 이러한 네트워크 통신을 캡슐화하고, 서블릿 개발자가 직접 소켓 프로그래밍을 하지 않아도 되게 합니다.
  2. 서블릿 생명주기 관리: 서블릿 컨테이너는 서블릿의 생성, 초기화, 호출, 종료 등 생명 주기 전반을 관리합니다. init(), service(), destroy() 메서드의 호출을 적절한 시점에 자동으로 수행합니다.
  3. 멀티스레딩 관리: 서블릿 컨테이너는 해당 서블릿의 요청이 들어오면 스레드를 생성해서 작업을 수행합니다. 각 HTTP 요청은 별도의 스레드에서 처리됩니다. 그렇기에 동시에 여러 요청이 들어와도 멀티스레딩 환경으로 동시다발적인 작업을 관리할 수 있습니다. 또한 이렇게 한번 메모리에 올라간 스레드는 다시 생성할 필요가 없기에 메모리 관리에 효율적입니다. 서블릿 컨테이너는 이러한 스레드를 생성하고 관리하며, 동시에 여러 요청을 효율적으로 처리할 수 있도록 합니다. 
  4. 보안 관리: 보안 도메인을 정의하고, 사용자 인증, 데이터 암호화 등의 보안 관련 작업을 관리합니다.
  5. JSP 지원: 많은 서블릿 컨테이너는 JSP(JavaServer Pages) 파일을 서블릿으로 변환하는 기능을 내장하고 있어, 동적 웹 컨텐츠를 더 쉽게 생성할 수 있게 합니다.
  6. 세션 관리: 서블릿 컨테이너는 HTTP 세션을 관리하여 사용자별 상태 정보를 유지할 수 있습니다. 이를 통해 개발자는 사용자별 세션 데이터를 쉽게 처리할 수 있습니다.

 

 

 

 

[ 7. 서블릿의 한계 ]

서블릿은, 동적 컨텐츠를 제공하기 위해 사용했던 기술인 CGI 프로그래밍의 단점인 성능문제 (요청당 프로세스 생성)와 확장성 제한을 해결해지만, 다른 단점도 존재했습니다. 동적 컨텐츠를 생성 후 응답으로 반환해주어야하는데, 프레젠테이션 로직(ex. HTML 코드)과 비즈니스 로직이 혼합되어 코드관리가 어려웠습니다. 이를 해결하기 위해 다음 기술인 JSP가 등장하게 됩니다.

 

 

 

 

 

 

 

출처

https://charliecharlie.tistory.com/248

 

Servlet은 무엇일까(등장배경 및 동작과정)

Servlet의 등장배경 초창기 web은 정적 데이터만 전달하는 Web Server였음. 사용자의 요청에 따른 다양한 처리(동적인)가 불가능했다. 예를 들면 로그인 시 맞춤 팝업이 뜨거나 UI가 변경되거나. 그래

charliecharlie.tistory.com

https://velog.io/@adam2/Servelt은-어쩌다-탄생되었을까

 

Servelt은 어쩌다 탄생되었을까

매번 아리쏭한 너 Servlet... CGI와 WAS까지

velog.io

https://tecoble.techcourse.co.kr/post/2021-05-23-servlet-servletcontainer/

 

Servlet 과 ServletContainer

Servlet 서블릿(Servlet…

tecoble.techcourse.co.kr

https://velog.io/@blueskyi/서블릿Servlet이란-동작방식feat.-Dispatcher-Servlet

 

서블릿(Servlet)이란? 동작방식(feat. Dispatcher Servlet)

자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일

velog.io

Chatgpt