[Spring]Servlet과 Servlet Container

강은서·2022년 8월 17일
0

Java

목록 보기
9/9
post-thumbnail

스프링을 공부하면서, servlet에 관한 언급이 많아 헷갈려하던 중 한번에 정리하고자 이글을 작성하였다.

Servlet

사용자의 요청을 처리하여 동적인 컨텐츠를 응답으로 주기 위한 프로그램

예를 들어, "Hello xx!"와 같은 메시지를 브라우저에 띄울 때 사용자의 요청마다 다른 이름을 출력하는 컨텐츠를 만드는 프로그램이다.

Servlet의 주요 특징

  1. 클라이언트의 request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트이다.
  2. HTML을 사용하여 response한다.
  3. JAVA의 스레드를 이용하여 동작한다.
  4. MVC 패턴에서의 컨트롤러로 이용된다.

Servlet Container

구현되어 있는 Servlet 클래스의 규칙에 맞게 Servlet 객체를 생성, 초기화, 호출 종료하는 생명 주기를 관리하는 컨테이너

예를 들어,Servlet을 지원하는 WAS인 Tomcat(톰캣)이 있다.

Servlet lifecycle in Servlet Container

서블릿 생명주기의 주요 메서드로는 Servlet interface의 init(), service(), destroy()가 있다.

  1. client가 HttpRequest를 보내면, Servlet Container가 가지고 있는 Connector가 client의 request를 전달받는다.

  2. servlet container는 httpservletrequest, httpservletresponse 두객체를 생성한다.

  3. 사용자가 요청한 url을 분석하여, 적절한 Engine을 거쳐 적절한 Servlet에 매핑한다.

  4. Servlet 객체가 존재하는지 확인한다.
    3-1. 없다면,JVM에 의해 서블릿이 실행될 수 있게 서블릿 인스턴스를 생성한다.

  5. Servlet Container는 init 메소드를 호출하여 Servlet 객체를 초기화한다.

  6. Servlet Container는 Servlet의 service 메소드를 호출하며, POST/GET 여부에 따라 doGet()/ doPOST()를 호출한다. 이는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.

  7. 마지막으로 Servlet Container는 Servlet을 제거하기위해 Servlet의 destory 메소드를 호출하며, httpServletRequest/Reponse 객체 둘다 소멸된다.

    • destory 메소드 호출되는 이유
      1. Servlet의 상태 변화
      2. application을 undeploy하기 위해 Servlet Container에 전달된 외부 명령
      3. server shutdown

Servlet Container 의 주요 기능

  1. 생명주기 관리
    Servlet Container가 기동 되는 순간 서블릿 클래스를 로딩해서 인스턴스화 하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 찾아서 동작한다. 그리고 서블릿 생명이 다하는 순간 가비지 컬렉션을 통해 메모리에서 제거한다.

  2. 통신 지원
    클라이언트의 request를 받아주고, response를 보낼 수 있게 웹 서버와 소켓을 만들어서 통신을 해준다. 이러한 특징으로 servlet이 다양한 환경에서 재사용할 수 있고, 다른 개발 설정과의 의존 관계를 분리시켜준다.

  3. 멀티스레딩 관리
    해당 servlet의 요청이 들어오면 스레드를 생성해서 작업을 수행한다. 동시에 여러 요청이 들어와도 멀티스레딩 환경으로 동시다발적인 작업을 관리할 수 있다.

Servlet이 필요한 이유

서블릿 컨테이너는 개발자가 웹서버와 통신하기 위해서 소켓을 생성하고, 특정 포트에 리스닝하고, 스트림을 생성하는 등의 복잡한 일들을 할 필요가 없게 해준다.servelet의 생성부터 소멸까지의 일련의 과정(life cycle)을 관리한다. 서블릿컨테이너는 요청이 들어올때마다 새로운 자바 스레드를 만든다.

Servlet을 사용하지 않는다면, Socket connection관리, data parsing, cookie 관리, 요청에 관련된 thread 관리를 직접해줘야한다.

이러한 번거로움을 해결하기 위해 JAVA EE Platform의 표준으로 javax.servlet, javax.servlet.http와 같은 패키지가 나오게 되고, 개발자는 각 벤더에서 만든 servlet 컨테이너에 동일한 인터페이스를 가진 Servlet 개발에만 집중을 할 수 있게 되었다.


다음 블로그를 참고하여 작성하였습니다.

0개의 댓글