Java/Spring
Servlet, Dispatcher Servlet, Servlet Container
파란배개
2025. 2. 2. 16:01
서블릿(Servlet)이란?
서블릿 개요
서블릿(Servlet)은 동적인 웹 사이트를 만들기 위해 웹 서버에서 실행되는 자바 프로그램이다.
서블릿을 사용하는 이유
- HTTP 요청 정보를 쉽게 활용하고, 응답을 편리하게 처리할 수 있음.
- 비즈니스 로직에 집중할 수 있도록 도와줌.
- 서블릿을 처리할 URL을 매핑하면 해당 요청이 들어올 때 자동으로 처리됨.
- service 메소드만 재정의하여 요청 처리 방식을 지정하면 됨.
서블릿과 톰캣(Tomcat)의 관계
- 톰캣(Tomcat)은 서블릿 컨테이너 역할을 수행하는 대표적인 웹 서버.
- 서블릿은 웹 서버에서 실행되며, 톰캣은 서블릿을 실행하고 관리하는 환경을 제공.
- 톰캣이 서블릿 요청을 받아 적절한 서블릿 인스턴스를 실행하고 응답을 반환.
서블릿 컨테이너(Servlet Container)
- 서블릿의 생명주기를 관리하는 객체.
- 서블릿을 생성하고 필요할 때 호출하며, 적절한 시점에 소멸시킴.
서블릿의 동작 과정
- 요청이 들어오면, 서블릿 컨테이너는 해당 요청과 매핑된 서블릿을 찾음.
- 서블릿 인스턴스가 존재하는지 확인
- 존재하면 기존 인스턴스를 사용.
- 없으면 새로 생성.
- 서블릿 컨테이너는 스레드를 생성
- 미리 만든 HttpServletRequest와 HttpServletResponse 객체를 전달하여 service 메소드를 호출.
- 개발자가 정의한 요청 처리 로직이 실행됨.
- 처리가 끝나면, HttpServletRequest와 HttpServletResponse 객체가 소멸됨.
- 서블릿 객체는 소멸되지 않음 → 서블릿은 싱글톤으로 관리되며, 재사용됨.
싱글톤이란?
- 싱글톤(Singleton)은 애플리케이션 내에서 특정 클래스의 인스턴스를 하나만 유지하도록 보장하는 디자인 패턴.
- 서블릿 컨테이너는 서블릿 객체를 한 번만 생성하고, 이후 동일한 인스턴스를 재사용하여 메모리 낭비를 방지.
Dispatcher Servlet
여러 요청이 동시에 들어온다면?
- 멀티스레드를 이용해 각 요청을 처리하지만,
- 스레드 생성 비용이 크고, 컨텍스트 스위칭이 많아지면 오버헤드 발생.
- 스레드가 과도하게 생성되면 서버 과부하 위험 증가.
해결책: Dispatcher Servlet
- 공통 로직을 중앙에서 처리하고, 필요한 요청만 개별 핸들러(컨트롤러)에서 수행.
- Dispatcher Servlet은 하나의 서블릿으로 모든 요청을 관리하도록 설계됨.
Dispatcher Servlet의 처리 과정
- Dispatcher Servlet이 요청을 받아 핸들러 매핑에게 검색 요청.
- 핸들러 매핑이 요청을 처리할 컨트롤러를 검색하여 반환.
- Dispatcher Servlet이 핸들러 어댑터를 통해 핸들러 실행 요청.
- 핸들러 어댑터가 컨트롤러의 메서드를 호출하여 비즈니스 로직 수행.
- 핸들러 어댑터가 실행 결과를 모델과 뷰 객체로 변환하여 Dispatcher Servlet에 반환.
- Dispatcher Servlet이 뷰 리졸버를 이용해 적절한 뷰(View)를 찾거나 생성.
- 찾은 뷰에 모델 데이터를 전달하여 최종 응답을 생성 (JSP, Thymeleaf 등).
결과적으로, 개발자는 컨트롤러(핸들러)만 신경 쓰면 됨.
서블릿 컨테이너와 Dispatcher Servlet의 관계
- 서블릿 컨테이너는 서블릿의 생명주기를 관리하는 환경이며, 톰캣(Tomcat) 같은 웹 서버가 이 역할을 수행.
- Dispatcher Servlet은 서블릿 컨테이너 내부에서 실행되는 특수한 서블릿으로,
- 모든 HTTP 요청을 받아 적절한 컨트롤러로 전달하는 역할을 수행.
- 즉, 톰캣 같은 서블릿 컨테이너가 Dispatcher Servlet을 실행하고, Dispatcher Servlet이 스프링 MVC의 핵심 역할을 수행하는 구조.
결과적으로, 스프링 부트에서는 Dispatcher Servlet이 자동으로 설정되므로, 서블릿 설정 파일을 잘 작성하면 필요한 객체가 Spring 컨테이너에서 관리되며 Dispatcher Servlet이 이를 자동으로 활용 가능.
즉, 서블릿을 이용하면 개발자는 요청 처리 로직(핸들러)만 신경 쓰면 되는 환경이 됨.