서블릿(Servlet)
서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스
독자적으로 실행되지 못하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다.
스레드 방식으로 실행되고, 컨테이너 종류에 상관없이 실행되므로 플랫폼 독립적이다.
멀티 스레드 방식이기 때문에 여러 사용자에 의해 호출될 수 있다.
서블릿의 인스턴스는 재활용 가능하므로 한 번만 생성되면 된다.
서블릿 동작 과정
클라이언트가 웹 서버에 요청을 한다. 웹 서버는 클라이언트로부터 받은 요청을 웹 애플리케이션 서버(WAS)에 위임하고, 웹 애플리케이션 서버는 요청에 해당하는 서블릿을 실행한다.
서블릿은 요청에 대한 기능을 수행한 후 결과를 반환(서블릿 → 웹 애플리케이션 서버 → 웹 서버)하여 클라이언트에게 전송한다.
서블릿 구성 요소
Servlet 인터페이스
init(), service(), destory(), getServletInfo(), getServletConfig()등 Servlet 관련 추상 메서드를 선언한다.
ServeltConfig 인터페이스
getInitParameter(), getInitParameterNames(), getServletContext(), getServletName() 등 Servlet 기능 관련 추상 메서드가 선언되어 있다.
GenericServlet 클래스
Servlet 인터페이스와 ServletConfig 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스로, 해당 클래스를 상속받아 구현한 서블릿은 사용되는 프로토콜에 따라 service()를 오버라이딩하여 구현한다.
HttpServlet 클래스
GenericServlet 클래스를 상속받아 HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행한다.
요청 시 service()가 호출되며 요청 방식에 따라 doGet() 또는 doPost()가 차례대로 호출된다.
HttpServlet의 주요 메서드는 doGet(), doPost(), doDelete(), doHead(), service() 등이 있다. do로 시작하는 메서드들은 모두 접근 지정자가 protected이다.
service() 메서드는 접근 지정자가 public이냐 protected이냐에 따라 기능이 조금 다른데, public인 경우 클라이언트의 request를 protected service()에 전달하고 protected인 겨우 request를 public service()에서 전달받아 do로 시작하는 메서드를 호출한다.
HttpServletRequest
사용자의 정보를 서블릿 엔진에 전달하는 객체이다.
파라미터의 이름과 값, 사용자 컴퓨터 이름, 요청받는 서버의 이름, input type의 데이터 등이 들어갈 수 있다.
관련 메서드 : getParameterValues(), getParameter(), getTemoteHost(), getServerName()
HttpServletResponse
서버에서 만든 응답을 암호화해서 사용자에게 전달하는 객체이다.
응답으로 사용되는 content의 길이, 응답으로 사용되는 content의 타입, 화면에 출력해야 할 모든 값이 들어간다.
관련 메서드 : setContentType(String type), setContentLength(int length), getWriter()
서블릿 생명주기 메서드
앞서 말했듯이 서블릿 또한 자바 클래스이므로 서블릿이 실행되면 초기화와 메모리에 인스턴스를 생성하여 서비스 수행 뒤 소멸하는 과정을 거치게 된다. 각 과정을 거치게 되며 기능을 수행하는 메서드들을 서블릿 생명주기 메서드라 부른다.
초기화 단계에서는 init() 메서드를 사용한다. 서블릿 요청 시 맨 처음 한 번만 호출된다.
작업 수행 단계에서는 doGet() 또는 doPost() 메서드가 호출되는데 서블릿 요청 시 매번 호출되고, 해당 메서드 내에서 클라이언트가 요청하는 작업을 수행한다.
doGet은 html의 <form> 태그에서 method=get 일 때 호출되고, doPost는 method=post 일 때 호출된다. 단순 url만 입력하면 doGet()이 호출된다.
종료 단계에서는 destory() 메서드가 호출된다. 서블릿이 기능을 모두 수행한 뒤 메모리에서 소멸될 때 호출되므로 마무리 작업 시 수행된다.
init() 메서드와 destory() 메서드는 생략해도 괜찮지만 do로 시작하는 메서드는 서블릿의 핵심 기능을 처리하는 것이기 때문에 반드시 구현해야하는 메서드이다.