그 놈의 서블릿

햄햄·2023년 3월 16일
2

스프링 부트로 REST API만 개발해보았기 때문에 서블릿을 직접 다룰 일은 없었다. 가끔 서블릿이란 단어를 접해서 검색해보면 뜻을 보아도 무슨 소린지 이해가 안갔다. '서블릿 그게 뭔데? 알아야 해?'라는 생각이 들었다. 그런데 스프링 시큐리티 등 모르는 기술과 개념을 접할 때마다 자꾸 서블릿이라는 용어가 나왔다. 자바 이야기는 대부분 '서블릿 정도는 당연히 알겠지'라는 합의가 깔린 채 오고가는 기분이 들었다. 그래서 그 놈의 서블릿이 도대체 뭔데?!?! 알아보지 않을 수가 없었다.

서블릿(Servlet) 개념 찾아보기

서블릿에 대한 개념은 구글링을 하면 금방 나온다. 대부분 비슷한 내용이지만, 그래도 가장 공신력 있어보이는 jakarta.servlet 패키지의 설명을 읽어보자.

먼저 인텔리제이에서 Servlet을 타이핑하면 다음과 같이 자동완성된다.
캡처

첫번째 Servlet 인터페이스를 선택하고, Servlet 키워드에 마우스 커서를 올리거나 cmd + 클릭하면 정의를 읽어볼 수 있다.

캡처

안타깝게도 영어다. 도와줘 DeepL!!

서블릿 인터페이스란?

서블릿은 웹 서버 내에서 실행되는 작은 Java 프로그램이다. 서블릿은 일반적으로 HTTP를 통해 웹 클라이언트의 요청(request)을 수신하고 응답(response)한다.

서블릿 인터페이스는 서블릿을 초기화하고, 요청을 서비스하고, 서버에서 서블릿을 제거하는 메서드를 정의한다. 이러한 메서드를 생명 주기 메서드라고 하며 다음과 같은 순서로 호출된다.

  1. 서블릿이 생성된 다음 init 메서드로 초기화된다.
  2. service 메서드에 대한 클라이언트의 모든 호출이 처리된다.
  3. 서블릿이 서비스에서 제거된 다음 destroy 메서드로 소멸되고 가비지 콜렉팅되어 완료된다.

이 인터페이스를 구현하려면 jakarta.servlet.GenericServlet을 확장하는 일반 서블릿 또는 jakarta.servlet.http.HttpServlet을 확장하는 HTTP 서블릿을 작성하면 된다.

그런데 이런 단편적인 개념만 보아서는 그래서 왜 서블릿이 자주 등장하는지, 어떻게 사용되는건지 알기 어렵다. 스프링에서 서블릿이 어떻게 쓰이는지 전체적인 구조를 보자.

Spring MVC와 DispatcherServlet

Spring MVC 프레임워크는 DispatcherServlet을 중심으로 설계되어 있다. DispatcherServlet은 HttpServlet을 상속한 클래스이며, Servlet과 비슷한 방식으로 HTTP 요청과 응답을 처리하면서 스프링의 다양한 기능을 사용할 수 있도록 해준다. DispatcherServlet이 프론트 컨트롤러 패턴의 구현체라는 것을 알면 전체적인 구조를 이해하는 데 도움이 된다.

프론트 컨트롤러 패턴

먼저, DispatcherServlet은 들어오는 요청을 가로챈다. REST API의 경우, 가로챈 요청에 매핑되는 핸들러를 찾는다. 그 후 알맞은 컨트롤러에 요청을 보낸다. 그리고 추가 처리를 위해 데이터를 모델로 전송한다. 복잡해보이지만 하나만 알아야할게 있다면 HTTP 요청은 컨트롤러를 거치기 전에 Servlet을 거친다는 점이다. 위와 같은 구조 덕분에 컨트롤러에 요청이 가기 전에 가로채서 요청이 처리되기 전 혹은 후에 실행될 기능을 덧붙일 수 있다.

참고

스프링 공식 문서
Quick Guide to Spring Controllers

profile
@Ktown4u 개발자

0개의 댓글