Servlet
서블릿은 요청-응답 프로그래밍 모델을 통해 액세스되는 애플리케이션을 호스트하는 서버의 기능을 확장하는 데 사용되는 Java의 클래스입니다.
일반적으로 웹 서버에서 호스팅하는 응용 프로그램을 확장하는 데 사용됩니다.
Servlet Lifecycle
서블릿의 수명 주기는 서블릿 컨테이너에 의해 제어되며 다음 단계로 구성됩니다.
아래 과정은 컨테이너가 자동으로 호출을 해주기 때문에 개발자들은 필요한 것들을 채워주기만 하면 됩니다
- 로드 및 인스턴스화
- 서블릿 컨테이너는 시작하는 동안 또는 첫 번째 요청이 있을 때 서블릿 클래스를 로드합니다.
- 서블릿 인스턴스는
Class
클래스의newInstance()
메서드를 사용하여 생성됩니다.
- 초기화
- 서블릿 컨테이너는
init()
메서드를 호출하고ServletConfig
인터페이스를 구현하는 개체를 전달합니다. - 이 메소드는 서블릿 인스턴스에 대해 한 번만 호출됩니다.
- 서블릿 컨테이너는
- 요청 처리
- 각 클라이언트 요청에 대해 서블릿 컨테이너는 새 스레드를 시작하고 서블릿의
service()
메서드를 호출하여 요청 및 응답 객체를 전달합니다.
- 각 클라이언트 요청에 대해 서블릿 컨테이너는 새 스레드를 시작하고 서블릿의
- 서비스에서 제거
- 서블릿 컨테이너가 서블릿을 언로드하기로 결정하면(예: 종료 중) 서블릿의
destroy()
메서드를 호출합니다.
- 서블릿 컨테이너가 서블릿을 언로드하기로 결정하면(예: 종료 중) 서블릿의
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 서블릿 초기화 - 서블릿이 생성 또는 리로딩 때, 단 한번만 수행됨.
// 1. 서블리의 초기화 작업 담당
System.out.println("[HelloSerlvet] init()");
}
@Override // 호출될 때마다 반복적으로 수행됨.
public void service(HttpServletRequest request, HttpServletResponse response) {
// 1. 입력
// 2. 처리
// 3. 출력
System.out.println("[HelloSerlvet] service()");
}
@Override
public void destroy() {
// 뒷정리 작업 - 서블릿이 제거(unload)될 때, 단 한번만 수행됨.
// 서블릿이 메모리에서 내려 올 때 사용을 한다.
System.out.println("[HelloSerlvet] destroy()");
}
}
서블릿은 왜 빠르냐! 생명 주기로 풀어본다
서블릿 수명 주기에서 서블릿은 처음에 한 번 로드되고 인스턴스가 생성되고 요청 대기 상태로 메모리에 남아 있습니다.
이 때문에 한 번 서블릿이 로드되면 다시 인스턴스화할 필요 없이 여러 요청을 동시에 처리할 수 있습니다.
응답 시간 측면에서 서블릿에 대한 첫 번째 요청은 서블릿을 로드하고 초기화해야 하기 때문에 약간 더 오래 걸릴 수 있습니다.
그러나 서블릿 인스턴스가 이미 메모리에 있고 요청을 처리할 준비가 되었기 때문에 후속 요청은 더 빨라지는 장점이 있습니다
하지만, 서블릿이 업데이트 되는 경우(서블릿코드 변경), 변경 사항 적용을 위해 서버를 다시 시작해야 합니다.
이는 업데이트 된 서블릿을 다시 로드하고, 인스턴스를 생성해 메모리에 있던 이전 서블릿을 교체해야 하기 때문입니다.
당연히 이 때 일반 요청을 처리하는 것보다 시간이 더 걸립니다
주의 해야 할 점은 서블릿의 업데이트가 값의 변경을 의미하지는 않습니다.
즉 서블릿이 작동하는 데이터(예: 데이터베이스의 데이터 또는 요청에서 전송된 데이터)를 의미하는 경우 이러한 값의 변경은 서블릿을 다시 인스턴스화할 필요가 없습니다.
서블릿은 처리하는 모든 요청에서 새 데이터를 처리할 수 있습니다.
데이터 처리 또는 응답 자체 생성(예: 복잡한 HTML 페이지 생성)에 상당한 시간이 걸리는 경우 렌더링 시간이 잠재적으로 증가할 수 있지만 이는 서블릿의 인스턴스와 관련이 없습니다.
Servlet이 싱글톤인 이유는 무엇입니까?
서블릿은 주로 성능상의 이유로 단일 인스턴스 내에서 여러 요청을 처리할 수 있어야 하기 때문에 싱글톤으로 설계됩니다.
들어오는 각 요청에 대해 별도의 인스턴스를 만드는 것은 특히 서버가 많은 수의 요청을 동시에 처리하는 경우 리소스를 많이 사용합니다.
서블릿 클래스에는 단일 인스턴스가 있지만 서블릿에 대한 각 요청이 별도의 스레드에서 처리되므로 서블릿 내에 여러 스레드가 있을 수 있습니다
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
Expression Language(EL) (0) | 2023.05.19 |
---|---|
Servlet의 상태 정보 저장 (0) | 2023.05.19 |
Spring MVC (1) | 2023.05.19 |
Java 런타임에 매개변수 이름 얻는 방법 (0) | 2023.05.19 |
Spring의 코드 분리 (0) | 2023.05.18 |