서블릿
작성일
서블릿
서블릿
이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다. 웹을 만들때는 다양한 요청(request)과 응답(response)이 있고 규칙이 존재하는데 이러한 요청과 응답을 일일이 처리하기 힘들다. 서블릿은 이러한 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이다.
서블릿을 사용하지 않으면 아래의 리스트를 모두 구현해야 한다. 하지만, 서블릿을 지원하는 WAS를 사용하면 초록색 박스안의 내용만 구현하면 된다.
서블릿 사용예제
@WebServlet(name = "helloServelt", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
}
}
- @WebServlet
- name: 서블릿 이름
- urlPatterns: URL 매핑
- protected void service(HttpServletRequest request, HttpServletResponse response)
- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service() 메서드를 실행한다.
서블릿 특징
- urlPatterns의 URL이 호출되면 서블릿 코드가 실행된다.
- HTTP 요청, 응답 정보를 편리하게 사용할 수 있는 HttpServletRequest와 HttpServletResponse를 제공한다.
- 개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있다.
서블릿 HTTP 요청, 응답 흐름
클라이언트에서 URL 요청이 들어오면 WAS는 Request, Response 객체
를 생성하고 서블릿 객체
를 호출한다. 개발자는 Reqeust 객체에서 HTTP 요청 정보를 꺼내서 사용하고 Response 객체에서 HTTP 응답 정보를 편리하게 입력한다. WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성하여 클라이언트에 전달한다.
참고 서블릿 객체의 생성 시점
서버 설정에 따라 다르다. 로딩 시점에 생성할 수도 있고 최초 요청 시점에 생성할 수도 있다.
서블릿 컨테이너
서블릿 컨테이너
란 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리하는데 이때 싱글톤으로 관리한다.
고객의 요청이 올 때 마다 객체를 생성하는 것은 비효율적이므로 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다. 모든 고객의 요청은 동일한 서블릿 객체 인스턴스에 접근하며 서블릿 컨테이너 종료 시 함께 종료한다. 이때, 공유 변수 사용에 주의해야한다.
JSP도 서블릿으로 변환되어서 사용하며 동시 요청을 위한 멀티 쓰레드
처리를 지원한다.
참고 싱글톤 패턴
싱글톤 패턴은객체를 딱 하나만 생성
하여 생성된 객체를 프로그램 어디에서나 접근하여 사용할 수 있도록 하는 패턴을 말한다. 개발을 하다보면 전역적으로 하나의 객체만을 사용해야 하는 경우가 있는데 이때 싱글톤 패턴을 사용하면 객체 생성을 단 한번으로 제한하여 객체들이 복제되는 경우를 방지할 수 있고 클래스를 사용하는 여러 곳에서 인스턴스를 계속 생성하여 불필요하게 메모리 낭비를 유발할 수 있다고 판단되는 경우에도 싱글톤 패턴을 사용한다.
참고 서블릿과 싱글톤
/hello 를 처리하는 HelloServlet, /spring을 처리하는 SpringServlet이 각각 존재한다면 HelloServlet, SpringServlet를 매번 요청이 올 때마다 새롭게 만들어줄 필요 없이 한 번만 생성한 뒤 이미 생성된 것을 사용하면 된다. 여기서 언급된 싱글톤은 HelloServlet, SpringServlet을 각각 하나만 존재하도록 하는 것이다.
참고 스프링 컨테이너와 서블릿 컨테이너의 관계
서로가 어디에 포함된다고 보기보단 스프링 빈을 관리하는 스프링 컨테이너와 서블릿을 관리하는 서블릿 컨테이너가 각자의 목적에 맞게 별도의 컨테이너로 존재한다.
참고
request 객체를 만들어서 서블릿에 넘겨주는 것이 서블릿 컨테이너의 역할이며 response도 마찬가지로 서블릿 컨테이너가 한다. 서블릿 컨테이너가 서블릿을 호출해준다. 서블릿은 service() 로직을 수행하는 싱글톤 객체라고 이해해도 된다.
참고 서블릿 컨테이너 흐름
- 서블릿 컨테이너가 서블릿 객체를 생성 (서블릿의 생성시점은 서버 설정에 따라 다름)
- 클라이언트가 해당 서블릿을 사용하는 HTTP 요청을 하면, 서블릿 컨테이너에서 request, response 객체를 생성
- 이때, 쓰레드가 서블릿 객체를 호출하고 request, response 객체를 서블릿 객체에 넘겨줌
- request 객체를 활용해 서블릿의 비즈니스 로직 실행
- 응답 결과를 response 객체에 담은 후, 서블릿 컨테이너에 전달
- 서블릿 컨테이너가 HTTP 응답 메시지 생성 후 클라이언트에게 전달