스프링 부트로 REST API만 개발해보았기 때문에 서블릿을 직접 다룰 일은 없었다. 가끔 서블릿이란 단어를 접해서 검색해보면 뜻을 보아도 무슨 소린지 이해가 안갔다. '서블릿 그게 뭔데? 알아야 해?'라는 생각이 들었다. 그런데 스프링 시큐리티 등 모르는 기술과 개념을 접할 때마다 자꾸 서블릿이라는 용어가 나왔다. 자바 이야기는 대부분 '서블릿 정도는 당연히 알겠지'라는 합의가 깔린 채 오고가는 기분이 들었다. 그래서 그 놈의 서블릿이 도대체 뭔데?!?! 알아보지 않을 수가 없었다.
서블릿에 대한 개념은 구글링을 하면 금방 나온다. 대부분 비슷한 내용이지만, 그래도 가장 공신력 있어보이는 jakarta.servlet
패키지의 설명을 읽어보자.
먼저 인텔리제이에서 Servlet
을 타이핑하면 다음과 같이 자동완성된다.
첫번째 Servlet 인터페이스를 선택하고, Servlet 키워드에 마우스 커서를 올리거나 cmd + 클릭하면 정의를 읽어볼 수 있다.
안타깝게도 영어다. 도와줘 DeepL!!
서블릿은 웹 서버 내에서 실행되는 작은 Java 프로그램이다. 서블릿은 일반적으로 HTTP를 통해 웹 클라이언트의 요청(request)을 수신하고 응답(response)한다.
서블릿 인터페이스는 서블릿을 초기화하고, 요청을 서비스하고, 서버에서 서블릿을 제거하는 메서드를 정의한다. 이러한 메서드를 생명 주기 메서드라고 하며 다음과 같은 순서로 호출된다.
init
메서드로 초기화된다.service
메서드에 대한 클라이언트의 모든 호출이 처리된다.destroy
메서드로 소멸되고 가비지 콜렉팅되어 완료된다.이 인터페이스를 구현하려면 jakarta.servlet.GenericServlet
을 확장하는 일반 서블릿 또는 jakarta.servlet.http.HttpServlet
을 확장하는 HTTP 서블릿을 작성하면 된다.
그런데 이런 단편적인 개념만 보아서는 그래서 왜 서블릿이 자주 등장하는지, 어떻게 사용되는건지 알기 어렵다. 스프링에서 서블릿이 어떻게 쓰이는지 전체적인 구조를 보자.
Spring MVC 프레임워크는 DispatcherServlet
을 중심으로 설계되어 있다. DispatcherServlet
은 HttpServlet을 상속한 클래스이며, Servlet과 비슷한 방식으로 HTTP 요청과 응답을 처리하면서 스프링의 다양한 기능을 사용할 수 있도록 해준다. DispatcherServlet이 프론트 컨트롤러 패턴의 구현체라는 것을 알면 전체적인 구조를 이해하는 데 도움이 된다.
먼저, DispatcherServlet은 들어오는 요청을 가로챈다. REST API의 경우, 가로챈 요청에 매핑되는 핸들러를 찾는다. 그 후 알맞은 컨트롤러에 요청을 보낸다. 그리고 추가 처리를 위해 데이터를 모델로 전송한다. 복잡해보이지만 하나만 알아야할게 있다면 HTTP 요청은 컨트롤러를 거치기 전에 Servlet을 거친다는 점이다. 위와 같은 구조 덕분에 컨트롤러에 요청이 가기 전에 가로채서 요청이 처리되기 전 혹은 후에 실행될 기능을 덧붙일 수 있다.