서블릿은 Java를 사용하여 웹 애플리케이션을 개발할 때 서버에서 실행되는 프로그램이다.
클라이언트의 요청을 처리하고, 결과를 응답하는 역할을 한다.
자바기반의 웹 컴포넌트로, Java 확장자를 갖는다.
클라이언트요청에 의해 동적으로 실행되고, 다양한 클라이언트 요구를 처리할 수 있다.
서블릿은 웹 컨테이너에 의해 관리되고, 스레드로 동작되어 효율적인 요청처리가 가능하다.(Java Thread)
MVC 패턴에서 Controller로 이용된다.
서블릿 하나는 하나의 클래스로서, javax.servlet.http.HttpServlet 클래스를 상속 받아 구현한다.
웹 애플리케이션에서 HTTP 프로토콜을 통한 요청을 처리하고 응답하는 클래스
1️⃣ 클라이언트 요청 (브라우저에서 http://localhost:8080/hello URL 입력) 시 HTTP Request가 Servlet Container로 전송됨.
2️⃣ Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성.
3️⃣ Web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
3️⃣ 서블릿에서 service메소드를 호출한 뒤, 클라이언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출.
4️⃣ 동적 페이지 생성 후 ServletResponse 객체에 응답 전송. (HTML, JSON 등)
5️⃣ HttpServletRequest, HttpServletResponse 두 객체를 소멸.
출처
클라이언트가 처음 요청을 보낼 때, 서블릿 컨테이너는 해당 서블릿 클래스의 객체를 한 번만 생성한다.
이후 같은 서블릿 객체가 계속 재사용된다.
public class MyServlet extends HttpServlet {
public MyServlet() {
System.out.println("서블릿 객체 생성! (생성자 호출)");
}
}
서블릿 컨테이너는 서블릿을 실행하기 전에 한 번만 init() 메서드를 호출하여 초기화하고, DB 연결, 설정 값 로드 등의 작업을 수행한다.
서블릿 컨테이너가 최초 요청을 받을 때 한 번만 실행며, 서블릿이 다시 로드되지 않는 한, 이후에는 호출되지 않는다.
@Override
public void init() throws ServletException {
System.out.println("서블릿 초기화! (init() 호출)");
}
클라이언트가 HTTP 요청을 보낼 때마다 service() 메서드가 실행되어 요청을 처리한다.
GET, POST 등 요청 방식에 따라 doGet() 또는 doPost() 메서드를 호출하며, 모든 요청마다 실행된다.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("Hello, Servlet!");
System.out.println("GET 요청 처리 (doGet() 호출)");
}
서버가 종료되거나 서블릿이 제거될 때 destroy()가 한 번 호출된다.
자원 정리 (DB 연결 해제, 파일 닫기 등) 를 수행할 수 있고, 서블릿 객체가 메모리에서 제거된다.
@Override
public void destroy() {
System.out.println("서블릿 종료! (destroy() 호출)");
}
서블릿을 실행하고 관리하는 역할을 하며 클라이언트의 요청을 처리할 수 있도록 도와주는 환경을 제공한다.
Tomcat, Jetty, JBoss, GlassFish 등이 해당된다.
서블릿의 생성(init) -> 실행(service) -> 종료(destroy) 과정을 관리한다.
클라이언트 요청이 오면 서블릿을 생성하고, 요청을 처리한 후 필요할때 제거한다.
클라이언트로부터 HTTP 요청을 받아 해당 서블릿으로 전달하고, 서블릿의 응답을 클라이언트에게 반환한다.
서블릿 컨테이너는 서블릿과 웹서버가 쉽게 통신하게 한다.
소켓을 만들고 listen, accept 등을 직접 구현하지 않고, API로 제공하여 복잡한 과정을 생략하게 하여 개발자가 로직에 집중 할 수 있게 한다.
여러 사용자가 동시에 요청하면, 각 요청을 개별 스레드로 실행.
성능 최적화 및 동시 요청 처리 가능.
서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 스레드를 하나 생성한다.
HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 소멸하므로 스레드를 관리해야 하지만 서버가 다중 스레드를
생성 및 운영하기 때문에 스레드의 안정성이 유지된다.
서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다.
일반적으로 보안관리는 XML 배포 서술자가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다.