스프링으로 웹 개발을 하다 보면 서블릿이라는 단어를 자주 접하게 된다.
그만큼 중요한 개념이므로 웹 개발을 하기 위해 필수적으로 이해해야한다.
서블릿과 서블릿 컨테이너가 무엇인지 알아보자.
서블릿(Servlet)이란?
서블릿은 웹 프로그래밍에서 클라이언트 요청을 처리하고, 처리 결과를 클라이언트에 전송하는 기술이다.
쉽게 말해 자바를 사용하여 웹을 만들기 위해 필요한 기술이다.
이전 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 정적인 페이지를 넘겨주었지만, 현재는 동적인 페이지를 가공하기 위해 웹 서버가 다른 곳에 도움을 요청한 후 가공된 페이지를 넘겨주게 된다. 이때 서블릿을 사용하게 되면 웹 페이지를 동적으로 생성하여 클라이언트에게 반환해 줄 수 있다.
서블릿의 특징
서블릿을 사용하게 되면,
1. 소켓 연결
2. HTTP 요청 메시지 파싱(HttpServletRequest)
3. HTTP 응답 메시지 생성(HttpServletResponse)
4. 소켓 종료
위의 역할을 서블릿이 대신 처리해준다. 따라서 개발자는 핵심 비지니스 로직에 집중할 수 있게 된다.
서블릿 사용 예시 코드
- urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
서블릿의 동작 흐름
- 웹 브라우저에서 HTTP 요청이 들어오면
- WAS(웹 어플리케이션 서버)는 Request, Response 객체를 새로 생성하여 서블릿 객체를 호출한다
- Request 객체에서 HTTP 요청 정보를 꺼내 사용하고
- Response 객체에서 HTTP 응답 정보를 입력한다
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성하여 반환한다
서블릿 컨테이너(Servlet Container)
서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
(이전에 포스팅 했던 빈을 관리하는 스프링 컨테이너와 메커니즘이 비슷하다)
톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
서블릿 컨테이너는 서블릿 객체를 싱글톤으로 관리한다.
(따라서 stateless해야 하고, 공유 변수를 사용 시 주의 해야한다)
최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용하고,
모든 클라이언트의 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
서블릿 컨테이너 종료시 함께 종료된다.
또한 싱글톤으로 처리되는 서블릿 객체는 동시 요청을 위한 멀티 쓰레드를 지원하는 데, 이는 다음 포스팅을 참고하자!