Servlet

Wookyung Moon·2023년 2월 5일

Java

목록 보기
5/5

Servlet

웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 Java 프로그래밍 기술

Servlet의 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • HTML을 사용하여 요청에 응답한다.
  • Java Thread를 이용하여 동작한다.
  • MVC 패턴에서 Controller로 이용된다.
  • 기존의 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 가지 기능을 제공
  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.

Servlet 동작과정

  1. 클라이언트가 요청한다.
  2. WAS를 거쳐서 HttpServletRequest, HttpServletResponse 객체가 생성된다.
  3. Web.xml이 어느 Servlet에 대해 요청한 것인지 탐색한다.
  4. 해당되는 Servlet에서 service() 메서드를 호출한다.
  5. doGet() 또는 doPost()를 호출한다.
  6. 동적 페이지 생성 후 ServletResponse 객체에 응답을 전송한다.
  7. HttpServletRequest, HttpServletResponse 객체가 소멸된다.

Servlet Container

Servlet을 관리해주는 Container이다.
Servlet을 만들었다고 해서 스스로 동작하는 것이 아니라 Servlet을 관리해주는 것이 필요한데 그러한 역할을 하는 것이 Servlet Container이다.
예를 들어, Servlet(API)이 정의서라면 Servlet Container는 정의서를 보고 수행한다. Servlet Container는 클라이언트의 Request를 받아주고 Response 할 수 있게, Web-Server(Apache)와 소켓을 만들어 통신하며 대표적으로 Tomcat이 있다.

Servlet Container의 역할

  • Web-Server와의 통신 지원
    Servlet Container는 Servlet과 Wev-Server가 통신할 수 있게 해준다. 그렇기 때문에 개발자는 Servlet에 구현해야 할 비지니스 로직에만 초점을 두면된다.

  • Servlet 생명주기(Life Cycle) 관리
    Servlet Container는 Servlet의 생성과 소멸을 관리한다. Servlet을 로드하여 인스턴스화하고, 초기화 메서드를 호출하고, Request가 들어오면 적절한 Servlet 메서드를 호출한다.
    또한, Servlet의 생명이 다 한 순간 Garbage Collection을 진행한다.

  • 멀티쓰레드 지원 및 관리
    Servlet Container는 Request를 받을 때마다 새로운 Thread를 생성한다. WAS가 멀티쓰레드를 생성 및 운영해주니 안정성에 대해서는 걱정할 필요가 없다.

  • 선언적인 보안 관리
    Servlet Container를 사용하면 개발자는 보안에 관련되 내용을 Java 소스로 구현해 놓지 않아도 된다. 일반적으로 보안관리는 XML에 기록하므로, 보안에 문제가 생기더라도 Java 소스에 수정하여 재컴파일 하지 않아도 된다.

Servlet 생명주기

  1. 클라이언트의 요청이 들어오면 Container는 해당 Servlet이 메모리에 있는지 확인 후 없을 경우 init() 메서드를 호출하여 적재한다. 최초 한번만 실행된다.

  2. init()이 호출된 후 클라이언트의 요청에 따라 service() 메서드가 실행되며 Request에 따라서 doGet() 또는 doPost()로 분기처리 한다. 이때 Servlet Container가 클라이언트에게 Request를 받았을 때 가장 먼저 생성했던 HttpServletRequest, HttpServletResponse에 의해 request와 response 객체가 제공된다.

  3. Container가 Servlet에 종료 요청을 하면 destroy() 메서드가 호출되는데 종료시에 처리해야 하는 작업들을 destroy() 메서드를 오버라이딩 하여서 구현하면 된다.

0개의 댓글