서블릿

랏 뜨·2025년 2월 19일

🔎 Overview

 스프링으로 프로그래밍을 하다보면, 디버깅할 때나 실행할 때나 지긋지긋하게 보이는 것이 있다. 바로 DispatcherServlet 이다.

  이토록 지겹게 마주치는 서블릿이지만, 이 서블릿이 하는 일을 설명해보라 했을 때 자세하게 설명할 수 있는 자신은 없다.
물론 대강 어떤 역할을 하는지는 어렴풋이 눈치채고 있지만, 눈치껏 아는 것과 확실히 개념을 알고 이해하고 있는 것은 하늘과 땅 차이이다.

  서블릿은 사실상, 웹 개발에서 떼려야 뗄 수 없는 관계이다. 그렇기 때문에 더더욱, 서블릿의 역할과 하는 일들은 확실하게 이해하고 있어야 한다.
그런 이유로, 금일은 서블릿에 대해서 학습하고 이를 정리하는 시간을 가져보고자 한다.


📑 서블릿 (Servlet)

  • 자바 기반웹 애플리케이션을 개발할 때 사용되는 서버 측 기술
  • 클라이언트로부터 HTTP 요청을 받아 이를 처리한 후, 응답을 반환하는 역할을 하는 자바 기반의 웹 컴포넌트
  • 웹 서버에서 실행되는 Java 프로그램이며, Java EE (= Jakatra EE)의 표준 기술


🗒️ 서블릿의 특징

  1. Java 기반
    • Java 로 작성되므로, 플랫폼 독립성이 뛰어남

  2. HTTP 요청 및 응답 처리
    • HttpServlet 을 상속 받아 GET 이나 POST 같은 HTTP 요청을 처리

  3. 멀티스레드 환경
    • 서블릿 컨테이너1개의 서블릿 인스턴스를 여러 요청에 대해 재사용
    • 각 요청마다 스레드 풀 내에서 해당 서블릿의 스레드를 생성
    • Tomcat 의 경우, 기본값으로 200개의 작업 스레드가 존재

  4. MVC 패턴의 컨트롤러 역할
    • JSP템플릿 엔진과 결합해 View 를 렌더링 후 응답으로 반환


➡️ 서블릿의 동작 방식 및 생명주기

  1. 서블릿 클래스 로드
    • 서블릿 컨테이너웹 애플리케이션이 시작될 때나 서블릿요청이 처음 들어왔을 때, 서블릿 클래스를 메모리에 로드
    • 서블릿 클래스web.xml 혹은 @WebServlet 을 통해 URL 과 매핑되며, 클라이언트의 요청이 해당 서블릿에 전달될 수 있도록 설정됨

  2. 서블릿 인스턴스화
    • 서블릿 클래스가 로드되면, 서블릿 컨테이너는 해당 클래스로부터 서블릿 인스턴스 생성
    • 서블릿 생성자단 한 번만 호출되며, 이 때 객체가 초기화됨

  3. 초기화 메서드 호출 - init()
    • 서블릿 인스턴스 생성 후, 서블릿 컨테이너는 init() 를 호출하여 서블릿 초기화
    • 서블릿 초기화 시 설정 정보를 불러오거나, 자원을 할당하는 작업 등을 수행 가능
    • 마찬가지로 init() 메서드 또한 단 한 번만 호출되며, 이 서블릿은 종료될 때까지 유지됨

  4. 요청 처리 메서드 호출 - service()
    • 클라이언트가 요청을 보내면, 서블릿 컨테이너는 해당 요청을 서블릿에 전달한 후 service() 메서드 호출
    • service() 메서드는 클라이언트의 요청을 처리하며, HTTP 요청 방식에 따라 doGet() , doPost() 등 적절한 메서드 호출
    • 각 메서드는 클라이언트의 요청을 처리한 후 응답을 생성

  5. 응답 반환
    • 서블릿HttpServletResponse (응답 객체) 를 사용하여 클라이언트에게 응답을 반환

  6. 서블릿 종료 메서드 호출 - distroy()
    • 웹 애플리케이션 또는 서블릿 컨테이너종료되거나 서블릿을 제거하려 할 때 distroy() 메서드 호출
    • 서블릿이 종료되기 전정리 작업 진행
    • ex) 열린 자원 닫기, 데이터 정리 ...

📖 서블릿 컨테이너 와 서블릿 컨텍스트

1️⃣ 서블릿 컨테이너 (Servlet Container)

  • 서블릿을 실행하고 관리하는 환경
  • Apache Tomcat , Jetty , WildFly , GlassFish 등의 웹 애플리케이션 서버(WAS) 안에 포함되어 있음
    • WAS서블릿 컨테이너의 역할 뿐만 아니라, JSP 실행, 트랜잭션 관리, 데이터 소스 관리 등의 기능 또한 제공
    • 즉, 서블릿 컨테이너 + α
    • Spring MVC 같은 프레임워크도 실행할 수 있도록 지원
  • 위와 같은 WAS 내에서 서블릿을 실행할 수 있도록 도와주는 역할
  • 단독으로 실행될 수도 있음

🦾 서블릿 컨테이너의 역할

  • 서블릿의 생명주기 관리
  • HTTP 요청 및 응답 처리
  • 멀티스레드 지원
  • 세션 및 쿠키 관리
  • JSP 컴파일 및 실행
  • 서블릿 컨텍스트 제공


2️⃣ 서블릿 컨텍스트 (Servlet Context)

  • 웹 애플리케이션 전체에서 공유되는 정보와 리소스를 관리하는 객체
  • 애플리케이션 전역에서 사용되는 설정 정보공유 자원을 제공하는 역할
  • getServletContext() 로 접근 가능

🦾 서블릿 컨텍스트의 역할

  • 애플리케이션 전역에서 공유할 데이터 저장
    • setAttribute() , getAttribute() ...
  • 초기화 파라미터 관리
    • web.xml 에서 설정한 파라미터
  • 웹 애플리케이션 내의 리소스 접근
    • getResourceAsStream()
  • 로깅 지원
    • log()
  • 다른 서블릿과의 통신
    • getRequestDispatcher()

⭐ DispatcherServlet

  • Spring MVC , 즉 Spring 프레임워크에서 사용되는 서블릿
  • Spring Boot 와 함께 가장 많이 사용됨
  • 서블릿 컨테이너는 모든 HTTP 요청을 DispatcherServlet 으로 전달
  • 하나의 DispatcherServlet여러 컨트롤러액션 메서드라우팅하여 실행
@RestController
@RequireMapping("/api/hotels")
public class HotelController {
	@GetMapping
    public List<Hotel> getHotels() {
    	// ...
    }
}
  • /api/hotels 경로로 요청이 오면 DispatcherServletHandlerMapping 을 통해 해당 컨트롤러의 getHotels() 메서드 호출


➡️ Spring MVC 에서의 서블릿 실행 흐름

  1. 클라이언트가 HTTP 요청 보냄

  2. 서블릿 컨테이너가 요청을 받음
    • web.xml 또는 Spring Boot 설정을 통해 DispatcherServlet 이 요청을 받도록 설정
    • Spring Boot 는 별도의 설정없이 자동으로 DispatcherServlet 을 등록
    • 서블릿 컨테이너는 요청을 DispatcherServlet 으로 전달

  3. DispatcherServlet 이 요청을 분석하고 핸들러(Controller)를 찾음
    • HandlerMapping 을 사용하여, 어떤 컨트롤러 및 메서드요청을 처리할지 결정

  4. 액션 메서드를 실행하고 결과를 반환
    • HandlerAdapterHandlerMapping 이 찾아낸 컨트롤러의 액션 메서드를 실행한 후 결과를 반환

  5. DispatcherServletView 를 선택하거나 JSON 응답을 반환
    • ViewResolver 를 사용해 적절한 JSP , Thymeleaf 같은 View 를 선택
    • 또는, JSON 응답 반환

💡 HandlerMappingHandlerAdapter

- Spring MVC에서 요청을 적절한 컨트롤러로 연결하고 실행하는 핵심 컴포넌트
- DispatcherServlet이 서블릿 컨테이너 내에서 요청을 처리할 때 사용하는 핵심 인터페이스

1️⃣ HandlerMapping

  • 요청 URL을 보고, 해당 요청을 처리할 컨트롤러(핸들러)를 찾아서 라우팅해주는 역할

2️⃣ HandlerAdapter

  • HandlerMapping 이 찾아낸 컨트롤러의 액션 메서드를 실제로 실행하는 역할
  • 컨트롤러의 타입 ( @RequestMapping , @RestController , @Controller )를 확인하고, 적절한 방식으로 호출

🤔 HandlerMappingHandlerAdapter 가 없으면?

  • DispatcherServlet 은 컨트롤러로 연결할 방법을 알 수 없음
    • HTTP 요청이 오더라도, 이를 어떤 컨트롤러가 처리해야 할지 판단 불가
  • 만약 컨트롤러를 찾더라도, 이를 실행할 방법을 알지못함

- 즉, HandlerMapping 과 HandlerAdapter 는 DispatcherServlet 이 요청을 적절한 컨트롤러의 메서드로 연결하고 실행하는 핵심 역할을 함

참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기록

0개의 댓글