본문 바로가기

Servlet

[Servlet] Servlet과 Container의 개념

Applet

  • Client Side 동작방식을 갖는다.
  • 자바로 개발한 응용 프로그램을 웹 페이지와 함께 사용자측으로 보낼 수 있도록 만든 프로그램
  • 클라이언트(브라우저)에서 호출시 클래스 파일이 클라이언트 PC로 다운로드 되어 클라이언트 측에 내장되어있는 JVM에 의해 실행된다.

Servlet

  • 자바를 사용하여 동적인 웹페이지 콘텐츠를 생성하기 위한 기술
  • Applet + Server로 자바로 개발한 응용프로그램을 웹 서버에서 실행시켜 HTML 형식의 문서로 만들어 클라이언트에게 반환하는 웹 어플리케이션 컴포넌트이다.
  • 확장 CGI방식을 사용하며 하나의 완전한 자바파일의 형태를 갖는다.(확장자또한 .java 이다.)
  • 자바 언어를 이용해 클라이언트에 보여줄 동적인 부분을 잘 구분하여 적절한 위치에 HTML 태그를 자바 코드 안에 삽입하는 형태이다.
  •  HTML과 이미지 등이 Java 코드 내에 존재하므로, 디자이너가 디자인 변경시 자바 프로그래머의 도움이 필요하게 되기 때문에 많은 불편함이 따른다.
  • 많은 단점들이 존재함에도 불구하고 서버 측 프로그램의 기능이 있고 프레임워크의 기초 기술로 아직까지도 사용되고 있다.

Servlet 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 하나의 웹 어플리케이션 컴포넌트
  • 요청에 대한 응답 결과는 HTML문서이다.
  • Java Thread를 이용하여 동작하며, 하나의 요청에대해 스레드를 할당하는 다중-스레드 방식이며. 사용되는 스레드는 Thread-pool에 의해 관리된다.
  • HTTP프로토콜 서비스를 지원하는 HttpServlet 클래스를 상속받고, TCP기반 통신을 한다.
  • Servlet의 내용을 변경시, 재컴파일을 해야하는 단점이 존재한다.
  • 주로 MVC 패턴에서 Controller로 사용된다.

Servlet 동작방식

  • 일반적으로 웹 서버는 클라이언트의 요청에 해당하는 웹 페이지를 전달하는 역할을 수행한다.
  • 하지만 웹 서버는 이미 존재하는 정적인 페이지만을 제공할 수 있다.
  • 때문에 동적 페이지를 제공하기 위해서 다른 도우미 애플리케이션이 필요한데, 자바에서는 이 역할을 해 주는 것이 서블릿이다.
  • 서블릿(Servlet)은 스스로 동작할 수 없기 때문에 컨테이너의 도움을 받아 실행된다.
  • 하나의 자바 프로그램처럼 구성이 되기 때문에 브라우저에서 호출이 되면 Server side에서 Servlet을 컴파일하여 HTML파일로 응답한다.

  • 3-tier architecture 포스팅글에서 사용한 이미를 재활용 하겠다. 여기서 중요한 것은 WAS내부의 Cotainer의 동작 방식이다.
  1. 클라이언트가 URL을 통해 서버에 요청을 보내면 HTTP Request를 Servlet Container로 보낸다.
  2. Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
  3. 요청 URL을 분석하여 어느 서블릿에 대해 요청을 한것인지 찾는다.
  4. 찾은 서블릿을 스레드에 담은 뒤 service메서드를 호출한 후 HttpRequest 형식에 따라 doGet(), doPost()메서드를 호출한다.
  5. doGet(). doPost()메서드는 연결된 DB를 통해 데이터를 얻어오거나, 비지니스 로직을 처리한 뒤 동적 페이지를 생성한다.
  6. HttpServletResponse객체에 응답을 보낸 뒤, 응답을 끝마치면 HttServletRequest, HttpServletResponse 객체를 소멸시키킨다.

Servlet Container

  • 스스로 동작하지 못하는 서블릿의 실행환경 제공 및 관리를 도와준다. (서블릿을 관리해주는 컨테이너)
  • 클라이언트의 요청을 받아주고 응답할 수 있게 웹서버와 소켓으로 통신한다.
  • 비유를 하자면 서블릿은 설명서이고, 서블릿 컨테이너는 설명서를 보고 실제 행동을 하는 주체인것이다.

Servlet Container의 역할

  • 웹서버와의 통신 지원
    • 서블릿과 웹서버가 손쉽게 통신할 수 있도록 API를 제공한다.
    • API를 통해 개발자가 소켓을 만들고 관리하는 과정을 생략할 수 있게 도움으로써, 서블릿 개발에만 신경을 쏟을 수 있게 도와준다.
  • 멀티쓰레드 지원 및 관리
    • 클라이언트의 요청마다 스레드 풀에서 스레드가져와 서블릿에 할당해주며, Service() 메서드 호출 이후 자원의 반납까지 도와준다.
    • 서버가 다중 쓰레드를 관리를 해주기 때문에 스레드 안정성 및 관리를 개발자가 신경쓰지 않아도 된다.
  • 선언적인 보안 관리
    • XML 배포 서술자에 보안관리를 위임함으로써 서블릿 또는 자바 클래스에 보안에 관련된 내용을 작성하지 않아도 된다. 때문에 코드의 수정 및 재컴파일 없이 보안관리가 가능해진다.
  • 서블릿 생명주기(Life Cycle) 관리 
    • init(), service(), destroy()메서드를 통해 서블릿의 탄생, 요청, 죽음을 관리한다.
    • 서블릿의 요청에 알맞는 메서드를 실행하며, 서블릿이 생명을 다 한 경우 Garbage Collection이 적절하게 수거해감으로써 편의를 제공한다.

Servlet의 생명주기

  • Life Cycle(생명주기) : 클라이언트가 서버에 요청시 언제 객체가 만들어지고, 사용되고 종료되는가
  1. init() : 서블릿이 처음으로 요청되어 객체가 생성될 때 호출되는 메서드
  2. service() : 클라이언트가 재방문시마다 호출되는 메서드
  3. destory() : 애플리케이션 서비스의 종료 및 재시작 또는 서블릿의 코드 수정시 호출되는 메서드
  • 클라이언트 서블릿 최초 요청시
    • init(최초 한번 호출) -> service(반복 호출)
  • 서블릿 재 요청시
    • service(반복 호출)
  • 서블릿 요청 종료시
    • destroy(최후 한번 호출)
  • service() 메서드는 HTTP요청 method에 따라 doGet(), doPost()등의 메서드로 분기되어 실행되며, HttpServletReqeust, HttpServletResponse객체가 인자로 주어진다.
  • 실행 및 종료시 공통적으로 사용되어야 할 비지니스 로직은 init(), destory()메서드를 오버라이딩하여 구현할 수 있다.

'Servlet' 카테고리의 다른 글

[Servlet]Servlet의 주요 클래스와 실제 웹페이지 제작  (2) 2023.03.14