Chat 상우

java Servlet 이란? 본문

web server/servlet

java Servlet 이란?

chat-rilla 2023. 11. 28. 11:12

안녕하세요 it강사 chat상우 입니다.

java servlet의 개요의 대한 내용을 다루고자 하며 오류 내용은 피드백 주시면 감사하겠습니다.

javaServlet

java servlet이란?

최초 웹 서버는 클라이언트의 요청에 맞는 정적인 페이지를 응답할 수 있었지만 웹 페이지에 존재하는 콘텐츠를 데이터베이스에서 관리를 하기 시작하게 되면서 java에서 정적인 페이지가 아닌 동적인 페이지의 지원을 위해 WEB server에 Servlet이라는 프로그램을 추가하여 동적인 페이지를 지원하게 되었다.

Was Server

public class LifeCycleTestServlet extends HttpServlet {
    private static final long serialVersionUID  =1L;

    private int initCount = 1;
    private int serviceCount = 1;
    private int destroyCount = 1;

    public LifeCycleTestServlet() {
        System.out.println("static 값 : " + serialVersionUID);
    }

    @Override
    public void init() throws ServletException {
        System.out.println("init "+initCount++);
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("serviceCount "+serviceCount++);
    }

    @Override
    public void destroy() {
        System.out.println("destory " + destroyCount++);
    }


}

 

  1. init() : 가장 초기 단계 호출되는 메서드로 웹 애플리케이션의 초기화 매개변수에 액세스가 가능할 수 있도록 하는 javax.servlet.ServletConfig 인터페이스를 구현하는 객체가 전달된다.
  2. Service() : 메서드는 초기화 후 각 요청마다 호출되며 각 요청은 별도의 자체 스레드에서 처리가 되며 웹 컨테이너는 모든 요청에 대하여 서블릿의 service() 메서드를 호출하게 된다. Service는 메서드의 요청의 종류를 결정하고 이를 적절한 메서드에 전달하여 처리한다.

  3. Destroy() : 서블릿 객체가 삭제되어야 할 때 호출되며 보유하고 있는 리소스를 해제한다.

서블릿 객체의 라이프사이클에서 서블릿 클래스가 클래스 로더에 의해 동적으로 컨테이너에 로드되며 각 요청에는 자체 스레드를 갖고 있으며 서블릿 개체는 동시에 여러 스레드에서 동작된다. 서블릿 또한 JVM 내에서 실행된다.

 

Servlet

서블릿(Servlet)은 일반적으로 웹 애플리케이션 개발 시 서버 컨테이너(Web Container) 내에서 실행됩니다. 서블릿은 웹 애플리케이션의 일부로서, 컨테이너에 등록되어야 하고, 서버가 시작될 때 미리 로드되어야 한다.

일반적으로 서블릿은 웹 애플리케이션의 배포 서술자(DD, Deployment Descriptor)인 web.xml 파일에 등록된다. 이렇게 등록된 서블릿은 웹 애플리케이션이 시작될 때 컨테이너에 의해 로드되고 인스턴스화된다.

서블릿 컨테이너는 웹 애플리케이션을 실행하기 위한 환경을 제공하며, 서블릿의 생명 주기 관리, 요청 처리, 스레드 관리, 보안 등을 담당하며, 서블릿 컨테이너는 서블릿 클래스를 로드하고, 요청이 들어올 때마다 해당 서블릿의 인스턴스를 생성하거나 풀에서 관리하여 요청을 처리한다.

일반적으로 서블릿은 개발자가 직접 로드되거나 컨테이너의 주소 공간에 동적으로 검색되는 것이 아니며, 웹 애플리케이션의 배포 설정에 따라 컨테이너에 등록되어야 하며, 서블릿 컨테이너는 이러한 서블릿들을 관리하고 실행하는 역할을 수행한다.

 

  1. FrameworkServlet
    스프링 프레임워크의 일부로서, 웹 애플리케이션의 메인 서블릿으로 사용된다.
    DispatcherServlet은 FrameworkServlet의 구현체이며 가장 앞단에서 요청을 핸들링한다.
    public class DispatcherServlet extends FrameworkServlet {
    
    }
    ​
  2. HttpServletBean
    HttpServletBean은 HttpServlet을 확장하고 Spring의 InitializingBean 인터페이스를 구현한다. 해당 클래스는 HttpServlet의 특성을 그대로 갖지만 Spring에 의해서 관리되는 메커니즘을 갖는다.
    import org.springframework.web.servlet.HttpServletBean;
    
    public class CustomServlet extends HttpServletBean {
    
        @Override
        protected void initServletBean() {
            // 서블릿 초기화 로직
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            // 빈 초기화 로직
        }
    }
    
  3. HttpServletJava에서 HTTP 프로토콜을 통해 클라이언트의 요청을 처리하기 위한 서블릿(Servlet)의 하위 클래스이다. Java EE(Enterprise Edition)에서 제공되며, 웹 애플리케이션에서 HTTP 요청을 처리하고 동적인 웹 콘텐츠를 생성하는 데 사용된다.
  4. import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { // get 요청시 처리할 메서드 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 클라이언트로부터 받은 요청을 처리하는 부분 response.setContentType("text/plain"); // 응답의 컨텐츠 타입 설정 // 응답을 보낼 PrintWriter 객체 생성 PrintWriter out = response.getWriter(); // 클라이언트에게 보낼 응답 내용 작성 out.println("Hello, World!"); // 클라이언트에게 전달할 메시지 out.close(); // 출력 스트림 닫기 } }

 

서블릿 컨테이너와 웹 서버의 요청 처리

서블릿의 요청 처리 과정을 보면 Servlet instance는 http 요청이 들어오면 하나씩 생성하는 방식이 아닌 Servlet 컨테이너에서 instance를 찾고 없으면 생성하고 있으면 생성된 개체를 이용하여 요청을 처리하게 되는데 이러한 기능을 제공하기 위해서 servlet은 멀티 스레드를 지원하게 되며 이로 인해 Thread-Safe 하지 않는다. 그렇기 때문에 이러한 문제를 해결하기 위해 Servlet은 전역 변수가 아닌 지역변수를 이용하는 것이 좋다.

  1. 웹 서버에서 HTTP 요청을 수신
  2. 웹 서버는 해당 요청을 서블릿 컨테이너로 전달
  3. 컨테이너는 초기화를 위해 서블릿의 init() 메서드를 호출하고 Servlet Container에서 관리한다. (서블릿이 처음 로드될 때 한 번 호출됨)
  4. 컨테이너는 서블릿의 service() 클라이언트의 HTTP 요청의 데이터를 읽고 service() 메소드를 호출하여 응답한다.

Tomcat project

Servlet Container

생성된 서블릿을 관리해 주는 컨테이너로 서블릿을 생성하여도 클라이언트의 요청에 응답을 할 수 있어야 하는데 이러한 응답을 위해서는 사용자의 요청을 분석하여 매칭되는 서블릿을 찾아주는 작업이 필요하다 이러한 것을 제공하는 것이 Servelt Container의 역할로 볼 수 있으며 클라이언트의 요청을 받고 응답을 할 수 있도록 웹 서버와 소켓 통신을 하는 것으로 java에서 가장 대표적으로 사용하는 것이 tomcat이다.

  1. 웹 서버와 통신을 지원
    서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 한다. Tomcat이 없다면 java 프로그램에서 소켓 프로그램을 통해 웹 서버의 응답을 받을 수 있는 프로그램을 구성해야 하지만 서블릿의 경우 이러한 기능을 api로 제공하여 복잡한 과정을 생략할 수 있도록 해주고 있다.
  2. 서블릿 관리
    서블릿 컨테이너는 서블릿의 생성과 응답 소멸을 관리하며 서블릿 개체를 생성하여 관리하다가 사용자의 요청이 들어오면 적합한 서블릿을 호출한다. 이후 서블릿을 더 이상 사용하지 않으면 destroy() 메서드를 호출하게 되는데 이때 GC가 해당 서블릿을 소멸한다.
  3. 멀티 스레드 지원
    서블릿은 요청마다 개체를 생성하는 방식이 아닌 스레드를 생성하여 요청을 처리하게 되면 HTTP 메서드를 실행하고 나면 스레드는 자동으로 소멸된다.
  4. 선언적 보안 관리
    서블릿의 경우 web.xml의 배포 서술자를 이용하여 메타정보를 관리하게 되는데 일반적인 보안관리는 xml 배포 서술자에 기록하기 때문에 개발자는 보안에 여유를 갖게 된다.