목차
- Servlet이란
- Servlet 동작과정
- Servlet 생명주기
- 순수 Servlet
[1] Servlet이란
클라이언트의 요청을 처리하고 동적으로 그 결과를 처리하는 자바 기반의 웹 프로그래밍 기술 또는 클래스
HTML, CSS 를 사용해서 클라이언트에게 고정된 화면을 보여주는 사이트 정적사이트
JSP를 사용해서 상황에 따라 클라이언트에게 다른 결과 화면을 보여주는 사이트 동적사이트
Servlet은 동적사이트 즉, 웹서버가 동적인 페이지를 제공할 수 있도록 웹브라우저와 WAS(Web Application Server)간의 소통을 할때 소통의 중간 역할을 해줍니다.
우리가 웹 브라우저에서 어떤 URL을 호출하면 그 요청은 WAS를 통해 Servlet으로 전달되고 Servlet이 그 요청을 처리한 후, 응답을 만들어 브라우저로 보냅니다.
브라우저 → 톰캣(WAS) → Servlet Container → HttpServlet → doGet/doPost
Servlet의 동작과정
- 웹 브라우저에서 클라이언트의 요청이 들어온다.
- HttpServletRequest, HttpServletResponse 객체가 생성된다.
- 생성된 객체를 실행할 Servlet을 찾는다.
- Http Method에 따라 doGet(), doPost() 함수가 실행된다.
- Servlet에 의해 Controller가 호출되고 결과를 반환한다.
- HttpServletResponse에 Servlet에서의 결과를 담는다.
- 클라이언트에게 응답을 보낸다.
Servlet 생명주기
Servlet 동작과정에서 HttpServletRequest에 담겨있는 요청을 처리할 Servlet을 Servlet Container에서 찾아서 호출합니다.
이때 Servlet을 조회하는 과정에서 현재 메모리에 사용가능한 Servlet의 존재여부를 확인하고 존재하지 않는 경우 init()함수를 통해 Servlet 객체를 생성하여 web.xml이나 WebServlet에 등록합니다. 그리고 요청에 따라 doGet(), doPost() 함수를 호출하여 클라이언트에게 응답할 결과를 가져옵니다.
[참고]
[Servlet이 메모리에 존재한다]
'Servlet이 메모리에 존재한다'라는 것은 Servlet Container 수준에서 관리되는 인스턴스가 존재한다는 의미입니다.
Bean으로 등록되어 관리된다는 의미와 다릅니다. Bean은 Spring IoC에서 관리되는 인스턴스 입니다.
주요 함수
@Slf4j
@WebServlet(name="customHttpServlet", urlPatterns = "/custom")
public class CustomHttpServlet extends HttpServlet {
private CustomController customController;
@Override
public void init(ServletConfig config) throws ServletException {
log.info("CustomHttpServlet init");
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("CustomHttpServlet doGet");
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("CustomHttpServlet doPost");
super.doPost(req, resp);
}
@Override
public void destroy() {
log.info("CustomHttpServlet destroy");
super.destroy();
}
}
init()
Servlet의 생성을 담당하는 메서드입니다.
Servlet Container에서 HttpServletRequest를 처리할 수 있는 Serlvet을 조회했을때 해당 Servlet이 메모리에 등록되어있지 않는 경우에 호출됩니다.
Serlvet의 생명주기에서 단 한번만 호출됩니다.
doGet(), doPost()
Http요청의 메서드(get, post, put, delete ..)를 분기하여 호출되는 메서드입니다.
HttpServletRequest의 HttpMethod를 확인하여 각 메서드 호출마다 호출됩니다.
destroy()
Servlet이 종료될때 호출되는 메서드입니다.
처음 Get메서드로 호출했을 경우, CustomHttpServlet은 등록이 되어있지 않기 때문에 init함수가 호출되고 doGet() 함수가 호출됩니다.
이후에 한번더 Get메서드로 호출한 경우 init() 함수는 호출되지 않고 doGet() 함수만 호출됩니다.
순수 서블릿
Request URL:
http://localhost:8080/hello
Request Method:
GET
웹 브라우저에서 위와 같은 Http 요청을 보낸다고 가정하겠습니다.
이 경우에 WAS는 해당 HTTP요청을 처리해 줄 클래스가 필요합니다. 그 역할을 하는 것이 Servlet입니다.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.getWriter().write("Hello, Servlet!");
}
}
위 HelloServlet이 /hello 라는 URL로 Get이라는 Method로 요청이 들어왔을때 그 결과를 받아서 동적인 결과를 다시 웹 브라우저에게 전달하는 역할을 합니다.
여기서는 "Hello, Servlet!" 이라는 텍스트를 반환할겁니다.
순수 서블릿이라 얘기한 이유는, Spring boot에서는 @RequestMapping, @Controller와 같은 어노테이션을 통해 자동으로 서블릿을 처리할 수 있도록 합니다. 이 처럼 어노테이션만으로 각 요청을 매핑하고 처리할 수 있도록 해주는 것은 Spring의 DispatcherServlet의 역할입니다.
참고
서블릿(Servlet)과 서블릿 컨테이너(Servlet Container)
클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측
velog.io
'cs > spring' 카테고리의 다른 글
[Spring] DispatcherServlet (0) | 2025.05.29 |
---|---|
[Spring] Spring MVC란? - MVC 구조 (0) | 2025.05.25 |