서블릿은 자바를 기반으로 하는 웹페이지를 동적으로 만들어줄 수 있는 일종의 프로그램을 의미
(CGI를 기반으로 제작된 프로그램이다.)
(정확하게는 위와 같은 기능을 하는 자바의 클래스를 의미한다.)GCI란?
CGI : 동적인 데이터를 제공하기 위한 규약
클라이언트로부터 요청을 받은 웹서버는 CGI를 구현한 구현체()에게 동적인 데이터를 제공해달라고 요청한다.
문제점 :
1. 모든 요청에 대해 프로세스를 사용하여 요청을 처리했다.
2. 동일한 요청에도 매번 구현체를 구현해 비용이 많이 드는 구조적인 문제가 있었다.
해결 : 서블릿 -> 프로세스 대신 쓰레드를 사용하여 구현체를 생성(생성시 싱글톤 패턴을 적용)서블릿의 생명주기
클라이언트가 요청을 하면 요청에 해당하는 서블릿을 찾고 서비스를 호출하게 되는데 서비스를 바로 호출하지 못한다. 왜냐하면 서블릿도 생명주기가 있기 때문이다.
생명주기 과정
1. 클라이언트 요청이 들어오면 서블릿 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고,
2_1. 없을 경우init()함수를
호출해 해당 서블릿을 메모리에 적재한다. 실행 중 서블릿이 변경될 경우, 기존 서블릿을 destroy()하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다.
2_2. 있을 경우service()함수를 실행한다. 이때, service함수는 사용자의 요청이 get인지 post인지 구분하여 doGet함수와
doPost함수로 분기된다. 또한 이때, HttpServletRequest, HttpServleResponse에 의해 요청과 응답 객체가 제공한다.
3. 종료시에는destroy()를 호출한다.서블릿의 생명주기 함수
서블릿의 생명주기는 생명주기 메서드가 존재하여, 각 주기마다 호출을 하게 된다.
생명주기 메서드는 다음과 같다.
- 초기화 : init()
서블릿 요청 시 맨 처음 한 번만 호출된다.
서블릿 생성 시 초기화 작업을 주로 수행한다.- 작업 수행 : doGet(), doPost()
서블릿 요청 시 매번 호출된다.
실제로 클라이언트가 요청하는 작업을 수행한다.- 종료 : destroy()
서블릿이 기능을 수행하고 메모리에서 소멸 될 때 호출된다.
서블릿의 마무리 작업을 주로 수행한다.서블릿의 동작과정
만약, 웹서버와 WAS가 각각 존재한다면, 클라이언트 요청이 들어올 경우 웹서버는 해당 요청을 WAS에게 보낸다(위임한다)
이후 WAS는 각 요청에 해당하는 서블릿을 실행한다.
그리고 각 서블릿은 요청에 대한 기능을 수행 후 결과를 반환하여 클라이언트에 전송한다.
1. 클라이언트 요청
2. HttpServletRequest, HttpServletResponse 객체 생성
3. web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
4. 해당하는 서블릿에서 service() 메소드 호출
5. doGet() 또는 doPost() 호출
6. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
7. HttpServletRequest, HttpServletResponse 객체 소멸HttpServletRequest, HttpServletResponse란?
HttpServletRequest: HTTP 요청 메시지를 편리하게 조회할 수 있게 하는 객체
HttpServletResponse: Content Type, 응답코드, 응답 메시지등을 담아서 전송하는 객체
WAS가 요청을 받으면 HttpServletRequest객체를 생성해 해당 정보를 저장한다.
해당 요청을 서블릿이 처리하면 그 결과를 HttpServletResponse를 이용해 전송한다.그렇다면 서블릿은 왜 쓰는 것일까?
클라이언트로부터 요청을 받으면 해당 요청을 분석해야 한다. 해당 요청의 메서드는 무엇이고, 헤더는 어떤것이며, 등등 많은 정보들을 담고 있는 요청을 분석해야 한다. 이때, 이러한 요청 정보를 직접 파싱을 해서 텍스트 분석을 해야 한다면 개발자들은 요청이 들어올 때마다 힘들것이다.
그래서 서블릿이 제공하는 메서드들을 이용해 간편하게 http정보를 사용할 수 있게된다. 그렇게 되면, 개발자는 비즈니스로직에 더 시간을 투자할 수 있게 된다.
이때, 각각의 메서드들은 서비스에 맞게 재정의(오버라이드)를 해주어야 한다.서블릿 컨테이너
- 서블릿 컨테이너란 구현되어 있는 servlet 클래스의 규칙에 맞게 서블릿을 담고 관리해주는 컨테이너다.
- 서블릿 컨테이너의 역활은 웹서버와의 통신을 지원한다.
(소켓을 만들고,listen,accept등의 작업을 생략하게 도와줌)- 생명주기를 관리하고 멀티쓰레드 지원 및 관리
(서블릿 컨테이너는 요청이 들어올 때마다 새로운 자바 쓰레드를 하나 생성한다. 하지만 이를 생성,운영,관리를 해준다.)