Domain/Spring

[Spring] Servlet과 Servlet Container

by Donghwan 2021. 9. 18.

Servlet이란?

  • 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램입니다.
  • 클라이언트의 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • HTML을 사용하여 Response 한다.
  • JAVA의 스레드를 이용하여 동작한다.
  • MVC 패턴에서의 컨트롤러로 이용된다.
  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
  • Servlet Container 내부에서 Singleton 형태로 존재합니다.
  • UDP보다 속도가 느리다.
  • HTML 변경 시 Servlet을 재차 컴파일해야 하는 단점이 있다.
  • 서블릿은 자바로 구현 된 CGI라고 흔히 말합니다.
CGI(Common Gateway Interface)
인터페이스로서, 웹 서버 상에서 프로그램을 동작시키기 위한 방법을 정의한 방법입니다. 웹 서버와 외부 프로그램 사이에서 정보를 주고 받는 방법이나 규약으로 두 개 이상의 컴퓨터 간의 자료들을 주고 받는 프로그램 또는 주고 받는 것 자체를 의미합니다. PHP, Perl, Python등의 언어는 Apache를 통해 CGI를 적용시키는 것이 가능합니다.

 

Servlet 생명주기

  1. 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고, 없을 경우 init() 메소드를 호출하여 메모리에 적재합니다. init()은 처음 한번만 실행되기 때문에, Servlet의 스레드에서 공통적으로 사용해야 하는 것이 있다면 오버라이딩 하여 구현하면 됩니다. 실행 중 서블렛이 변경될 경우, 기존 서블렛을 destroy()하고 init()을 통해 새로운 내용을 다시 메모리에 적재합니다.
  2. init()이 호출된 후 클라이언트의 요청에 따라서 service() 메서드를 통해 요청에 대한 응답이 do 함수로 분기됩니다. 이 때 서블렛 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServleResponse에 의해 request와 response 객체가 제공됩니다.
  3. 컨테이너가 서블렛에 종료 요청을 하면 destroy() 메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야 하는 작업들은 destroy() 메소드를 오버라이딩하여 구현하면 됩니다.

 

Servlet 동작 과정

  1. Servlet Requeset와 Servlet Response 객체를 생성
  2. 설정 파일(web.xml)을 참고하여 Mapping할 Servlet을 확인
  3. 해당 서블릿 인스턴스 존재 유무를 확인하여 없으면 생성(Init)하고 있다면 존재하는 인스턴스를 사용
  4. Servlet Container에 스레드를 생성하고 HttpServletRequest, HttpServletResponse 인자로 service를 실행
  5. 응답을 처리한 뒤 HttpServletRequest, HttpServletResponse 객체를 제거

 

Servlet Container

서블릿을 담고 관리하는 역할을 합니다. 사용자의 요청이 들어오면 해당 요청과 Mapping된 서블릿을 찾게 됩니다. 컨테이너는 구현되어 있는 Servlet 클래스의 규칙에 맞게 서블릿을 관리하는 역할을 하면서, 클라이언트의 요청에 따라 HttpServletRequest, HttpServletResponse 두 객체를 생성하며 post, get여부에 따라 동적인 페이지를 생성하여 응답을 보내는 역할을 합니다.

 

Servlet Container 역할

1. 웹서버와의 통신 지원

Servlet Container는 Servlet과 Web Server가 손쉽게 통신할 수 있게 해줍니다. 일반적으로 소켓을 만들고 listen, accept 등을 해야하지만 서블릿 컨테이너는 이러한 기능을 API로 제공하여 복잡한 과정을 생략할 수 있게 해줍니다. 덕분에 개발자가 서블릿에 구현해야 할 비지니스 로직에 대해서만 초점을 두게끔 도와줍니다.

2. 서블릿 생명주기 관리

Servlet Container는 Servlet 클래스를 로딩하여 인스턴스화하고, 초기화(init) 메소드를 호출하고, 요청이 들어오면 적절한 서블릿 메소드를 호출합니다. 또한 수명이 끝난 Servlet을 적절하게 소멸 시킵니다.

3. 멀티쓰레드 지원 및 관리

서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 하나 생성하는데 HTTP 서비스 메서드를 실행하고 나면 스레드는 자동으로 제거 됩니다. 원래는 스레드를 관리해야 하지만 서버가 다중 스레드를 생성 및 운영해주니 스레드의 안정성에 대해서 걱정하지 않아도 됩니다.

4. 선언적인 보안 관리

Servlet Container를 사용하면 개발자는 보안에 관련된 내용을 Servlet 또는 Java 클래스에 구현해 놓지 않아도 됩니다. 일반적으로 보안관리는 XML 배포 서술자(web.xml)에 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능합니다.

 

ServletContainer와 SpringContainer

 


참고자료

728x90
반응형

댓글