Java/Spring

Servlet, Dispatcher Servlet, Servlet Container

파란배개 2025. 2. 2. 16:01

서블릿(Servlet)이란?

서블릿 개요

서블릿(Servlet)은 동적인 웹 사이트를 만들기 위해 웹 서버에서 실행되는 자바 프로그램이다.


서블릿을 사용하는 이유

  • HTTP 요청 정보를 쉽게 활용하고, 응답을 편리하게 처리할 수 있음.
  • 비즈니스 로직에 집중할 수 있도록 도와줌.
  • 서블릿을 처리할 URL을 매핑하면 해당 요청이 들어올 때 자동으로 처리됨.
  • service 메소드만 재정의하여 요청 처리 방식을 지정하면 됨.

서블릿과 톰캣(Tomcat)의 관계

  • 톰캣(Tomcat)은 서블릿 컨테이너 역할을 수행하는 대표적인 웹 서버.
  • 서블릿은 웹 서버에서 실행되며, 톰캣은 서블릿을 실행하고 관리하는 환경을 제공.
  • 톰캣이 서블릿 요청을 받아 적절한 서블릿 인스턴스를 실행하고 응답을 반환.

서블릿 컨테이너(Servlet Container)

  • 서블릿의 생명주기를 관리하는 객체.
  • 서블릿을 생성하고 필요할 때 호출하며, 적절한 시점에 소멸시킴.

서블릿의 동작 과정

  1. 요청이 들어오면, 서블릿 컨테이너는 해당 요청과 매핑된 서블릿을 찾음.
  2. 서블릿 인스턴스가 존재하는지 확인
    • 존재하면 기존 인스턴스를 사용.
    • 없으면 새로 생성.
  3. 서블릿 컨테이너는 스레드를 생성
    • 미리 만든 HttpServletRequestHttpServletResponse 객체를 전달하여 service 메소드를 호출.
  4. 개발자가 정의한 요청 처리 로직이 실행됨.
  5. 처리가 끝나면, HttpServletRequestHttpServletResponse 객체가 소멸됨.
  6. 서블릿 객체는 소멸되지 않음 → 서블릿은 싱글톤으로 관리되며, 재사용됨.

싱글톤이란?

  • 싱글톤(Singleton)은 애플리케이션 내에서 특정 클래스의 인스턴스를 하나만 유지하도록 보장하는 디자인 패턴.
  • 서블릿 컨테이너는 서블릿 객체를 한 번만 생성하고, 이후 동일한 인스턴스를 재사용하여 메모리 낭비를 방지.

Dispatcher Servlet

여러 요청이 동시에 들어온다면?

  • 멀티스레드를 이용해 각 요청을 처리하지만,
    • 스레드 생성 비용이 크고, 컨텍스트 스위칭이 많아지면 오버헤드 발생.
    • 스레드가 과도하게 생성되면 서버 과부하 위험 증가.

해결책: Dispatcher Servlet

  • 공통 로직을 중앙에서 처리하고, 필요한 요청만 개별 핸들러(컨트롤러)에서 수행.
  • Dispatcher Servlet은 하나의 서블릿으로 모든 요청을 관리하도록 설계됨.

Dispatcher Servlet의 처리 과정

  1. Dispatcher Servlet이 요청을 받아 핸들러 매핑에게 검색 요청.
  2. 핸들러 매핑이 요청을 처리할 컨트롤러를 검색하여 반환.
  3. Dispatcher Servlet이 핸들러 어댑터를 통해 핸들러 실행 요청.
  4. 핸들러 어댑터가 컨트롤러의 메서드를 호출하여 비즈니스 로직 수행.
  5. 핸들러 어댑터가 실행 결과를 모델과 뷰 객체로 변환하여 Dispatcher Servlet에 반환.
  6. Dispatcher Servlet이 뷰 리졸버를 이용해 적절한 뷰(View)를 찾거나 생성.
  7. 찾은 뷰에 모델 데이터를 전달하여 최종 응답을 생성 (JSP, Thymeleaf 등).

결과적으로, 개발자는 컨트롤러(핸들러)만 신경 쓰면 됨.


서블릿 컨테이너와 Dispatcher Servlet의 관계

  • 서블릿 컨테이너는 서블릿의 생명주기를 관리하는 환경이며, 톰캣(Tomcat) 같은 웹 서버가 이 역할을 수행.
  • Dispatcher Servlet은 서블릿 컨테이너 내부에서 실행되는 특수한 서블릿으로,
    • 모든 HTTP 요청을 받아 적절한 컨트롤러로 전달하는 역할을 수행.
  • 즉, 톰캣 같은 서블릿 컨테이너가 Dispatcher Servlet을 실행하고, Dispatcher Servlet이 스프링 MVC의 핵심 역할을 수행하는 구조.

결과적으로, 스프링 부트에서는 Dispatcher Servlet이 자동으로 설정되므로, 서블릿 설정 파일을 잘 작성하면 필요한 객체가 Spring 컨테이너에서 관리되며 Dispatcher Servlet이 이를 자동으로 활용 가능.

즉, 서블릿을 이용하면 개발자는 요청 처리 로직(핸들러)만 신경 쓰면 되는 환경이 됨.