서블릿 컨테이너 (Servlet Container)
서블릿 컨테이너(Servlet Container)는 Servlet 클래스의 규칙에 맞게 Servlet 객체를 생성, 호출, 종료하는 생명주기(LifeCycle)를 관리한다. Tomcat 처럼 Servlet을 지원하는 WAS를 Servlet 컨테이너라고 한다.
만약 브라우저가 요청한 리소스가 이미지 같은 정적 콘텐츠라면 웹 서버에서 해당 리소스를 검색한 후 바로 응답하기 때문에 응답속도가 매우 빠르다. 서블릿 같은 동적 콘텐츠의 처리는 서블릿 컨테이너로 넘기며 상대적으로 시간이 필요하다.
Tomcat서버가 생성하는 서블릿 컨테이너는 서블릿 클래스의 객체를 생성하고 관리하는 역할을 담당한다. 서블릿 컨테이너는 자신이 생성하고 관리할 클래스들에 대한 정보를 web.xml 파일을 통해 획득한다.
구체적으로, 특정 URL이 호출되면 Servlet 코드가 실행되면서 HTTP요청(request) 메시지를 기반으로HttServletRequest
를 생성한다. 그 후 여러가지 비즈니스 로직을 거친 뒤 Servlet이 제공하는HttpServletResponse
를 활용하여 HTTP 응답(response)을 생성할 수 있다.
서블릿 계층 구조
Servlet의 상속 구조는 최상위 Servlet
인터페이스를 상속하는 GenericServlet
와 GenericServlet을 상속하는 HttpServlet
이 있다. HTTP 프로토콜상에서 사용자의 요청을 처리하는 Servlet 클래스를 작성하려면 HttpServlet을 반드시 상속해야 한다.
Servlet : init()
service()
destory()
ServletConfig : getServletContext()
getInitParameter()
|
GenericServlet :getInitParameter()
getInitParameterNames()
|
HttpServlet : doGet()
doPost()
💡 HttpServletRequest
웹 브라우저가 Servlet을 요청 시 사용할 수 있는 다양한 메서드 제공
getContextPath()
: URL에서 context명 추출getCookies()
: Cookie 정보 제공getHeader(String name)
getHeaderNames()
: 요청 헤더 정보 제공getSession()
: HttpSession 정보 제공getAttribute()
setAttribute()
removeAttribute()
setCharacterEncoding("utf-8")
: 한글 처리getRequestDispatcher()
: forward 용도
💡 HttpServletResponse
응답 시 사용할 수 있는 다양한 메서드 제공
addCookie()
: Cookie 생성getHeader()
getHeaderNames()
: 응답 헤더 정보 제공sendRedirect()
: 리다이렉트 용도setContentType()
: MIME 타입 지정getWriter()
: html를 브라우저에 출력하기 위해 I/O 를 얻는 용도
Servlet 라이프사이클 (Lifecycle)
Servlet 컨테이너가 자동으로 호출해주는 메서드를 콜백 메서드라고 한다. Servlet 컨테이너는 Servlet 객체의 생성과 운용, 소멸 과정에서 Servlet이 가진 다양한 콜백 메서드를 호출한다. Tomcat 컨테이너는 Servlet의 객체를 init
service
destory
의 3가지 메서드를 사용하여 관리한다.
init
: Servlet 인스턴스가 처음 생성될 때 호출되고 단 한번만 생성된다. 단 하나만 생성된 Servlet을 사용하여 다수의 클라이언트 요청을 처리하게 된다.service
(doGet, doPost): 클라이언트가 원하는 동적 처리 작업을 담당하는 메서드로서 요청할 때마다 실행된다. 메서드의 파라미터로는 요청을 처리하는 HttpServletRequest 객체와 응답을 처리하는 HttpServletResponse 객체를 사용한다.destory
: Servlet 인스턴스가 웹 컨테이너에서 제거될 때 호출된다.
Servlet 클래스에서 인스턴스 변수는 단 한 번만 생성되며 여러 사용자가 공유할 수 있다 ➡️ thread-unsafe
만약 공유하고 싶지 않으면 반드시 로컬 변수로 생성해야 한다. ➡️ thread-safe
'WebServer > JSP&Servlet' 카테고리의 다른 글
[Servlet] Servlet 핵심 객체 - ServletConfig , ServletContext (0) | 2023.08.10 |
---|---|
[Servlet] Servlet 요청 및 응답 처리 (0) | 2023.08.09 |
[Servlet] Servlet 작성 규칙과 서블릿 매핑 (0) | 2023.08.09 |
[Servlet&JSP] 이클립스 Dynamic Web Project 만들기 (0) | 2023.08.09 |
[Servlet&JSP] Servlet과 JSP의 개념 (0) | 2023.08.09 |