[Spring/MVC] Servlet : 서블릿

서블릿에 대하여 알아보자.


위의 그림은 웹 애플리케이션 서버를 직접 구현할 때 해야 하는 것들이다. 사실 위에서 초록색으로 표시되어 있는 부분만이 제일 의미 있는 로직이다. 비즈니스 로직은 회원 데이터를 받고 데이터베이스에 저장 요청을 하는 것이 전부이다. 하지만, 그 전과 후 단계가 너무 많고 복잡하다. 그렇다면 모든 개발자가 이를 항상 매번 구현해야 할까? 그래서 나온 것이 "서블릿"이다. 

 

 서블릿은 위의 초록색 부분을 제외한 모든 기능을 지원해준다. 더 정확하게 말하면, 서블릿을 지원하는 WAS가 이 기능들을 지원해주는 것이다. 간단하게 보면 서블릿은 아래와 같이 생겼다.

@WebServlet(name = "HelloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response){
    	//애플리케이션 로직
    }
}

위 코드에서, urlPatterns 부분은 이 부분(/hello)의 URL이 호출되면 아래 서블릿 코드(service)가 실행된다. 애플리케이션 로직에서 파라미터 두 개를 받는데, HTTP에 대한 요청, 응답 정보를 편하게 사용하기 위한 것이다. 


전체적인 그림은 아래와 같다.

웹 브라우저에서 먼저 localhost:8080/hello를 요청하면 WAS에서 요청 메시지를 기반으로 request, response 객체를 새로 생성한다. 이 객체를 사용하여 helloServlet을 실행하고 리턴받은 것을 이용해 HTTP 응답 메시지를 생성해 넘겨준다. 

 

즉, HTTP 요청이 오면,

  1. WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다. 
  2. 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용한다. 
  3. 또한, Response 객체에 HTTP 응답 정보를 편리하게 입력한다. 
  4. WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 메시지를 생성하고 웹 브라우저에 넘겨준다.

서블릿 컨테이너

 서블릿 객체는 직접 생성하는 것이 아니다. 그저 위에서 본 것과 같은 코드를 만들면 된다. 그렇게되면 서블릿 컨테이너서블릿 객체를 생성, 호출, 관리해준다. 

 톰켓과 같이 서블릿을 지원하는 WAS를 서블릿 컨테이너라 한다. 서블릿 컨테이너는 서블릿 객체를 생성하고 초기화, 호출, 종료하는 생명주기를 관리한다. 

서블릿 객체는 싱글톤으로 관리한다. 

객체를 딱 하나만 생성해놓고 이것을 공유하여 사용하는 것이다. WAS의 request, response 객체는 클라이언트마다 정보가 다르기 때문에 요청이 들어올 때마다 새로 생성하는 것이 맞다. 하지만, 서블릿은 요청이 올 때마다 계속 객체를 생성하는 것은 비효율적이다. 그래서 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용하는 것이다. 그렇게되면 같은 서버라면 모든 클라이언트의 요청은 동일한 서블릿 객체 인스턴스에 접근하게 된다. 이때 주의할 점이 공유 변수를 사용할 때이다. 

서블릿 컨테이너가 종료될 때 서블릿 또한 같이 종료된다. JSP도 서블릿으로 변환되어 사용된다.  

 

 가장 중요한 특징은 동시 요청을 위한 멀티 쓰레드 처리를 지원한다는 것이다.


다음 포스팅에서 이 멀티 쓰레드 처리 지원에 대해 자세히 알아보자.