• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

서블릿 컨테이너에 서블릿 등록

24.04.02 13:34 작성 조회수 96

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
서블릿 컨테이너에 서블릿 객체를 등록한다의 뜻은 서블릿 객체를 스프링 빈으로 스프링 컨테이너에 등록한다는 것과 같은 뜻인가요?

 

이렇게 생각한 이유는 DispatcherServlet 서블릿 객체를 DispatcherServletConfiguration 설정 클래스(@Configuration)에서 @Bean을 통해 스프링 컨테이너에 스프링 빈으로 등록했기 때문입니다.

답변 1

답변을 작성해보세요.

1

안녕하세요. 경민님

서블릿 컨테이너에 서블릿 객체를 등록하는 것과 서블릿 객체를 스프링 빈으로 스프링 컨테이너에 등록하는 것은 유사한 듯 보이지만, 기본적으로 서로 다른 과정을 의미합니다. 각각의 컨테이너가 하는 일과 그 목적을 이해하면 이 차이점이 명확해집니다.

서블릿 컨테이너

서블릿 컨테이너(예: Apache Tomcat, Jetty)는 서블릿 생명 주기를 관리하고, HTTP 요청을 받아서 서블릿에 전달한 후, 서블릿이 생성하는 HTTP 응답을 클라이언트에게 전송하는 역할을 합니다. 서블릿 컨테이너에 서블릿 객체를 등록한다는 것은 이러한 서블릿 컨테이너가 관리할 수 있도록 서블릿 클래스를 등록하고, URL 패턴과 연결하는 과정을 의미합니다. 이 등록 과정은 대개 web.xml 파일에 서블릿과 서블릿 매핑을 정의하거나, 서블릿 3.0 이상에서 제공하는 @WebServlet과 같은 애노테이션을 사용하여 수행됩니다.

스프링 컨테이너

반면, 스프링 프레임워크는 자체 컨테이너(ApplicationContext 등)를 통해 스프링 빈의 생명 주기를 관리합니다. 스프링 컨테이너에 객체를 스프링 빈으로 등록한다는 것은 그 객체가 스프링 프레임워크의 관리 아래에 들어간다는 의미이며, 이를 통해 의존성 주입, AOP, 트랜잭션 관리 등 스프링이 제공하는 다양한 기능을 활용할 수 있습니다.

DispatcherServlet과의 관계

DispatcherServlet은 스프링 MVC에서 중앙 제어 서블릿으로 작동하여 HTTP 요청을 적절한 컨트롤러에 분배하고, 모델 및 뷰를 처리하는 역할을 합니다. DispatcherServlet을 스프링 컨테이너에 등록하는 것은, 스프링이 DispatcherServlet의 생명 주기를 관리하고, 스프링 MVC 프레임워크 내에서 필요한 의존성들을 DispatcherServlet에 주입하기 위함입니다. 그러나 실제로 DispatcherServlet이 요청을 처리하기 위해서는 서블릿 컨테이너에도 등록되어야 합니다.

즉, DispatcherServlet이 스프링 컨테이너에 등록되어 스프링 빈으로 관리되는 것은 스프링 프레임워크 내에서의 관리와 설정을 위한 것이며, 이것이 서블릿 컨테이너에 등록되는 것과는 별개의 과정입니다. DispatcherServlet 설정 클래스에서 @Bean을 통해 스프링 컨테이너에 등록하는 것은 스프링 프레임워크의 관점에서 필요한 설정이며, 이것을 통해 서블릿 컨테이너에 자동으로 등록되기 위해서는 추가적인 설정(예: ServletRegistrationBean 사용)이 필요할 수 있습니다.

감사합니다.

경민님의 프로필

경민

질문자

2024.04.06

감사합니다 ! 그동안 강의에서 설명해주신 WAS의 역할과 서블릿 컨테이너의 역할이 비슷하다고 보면 되겠네요 !

 

그렇다면 요청 시의 웹 흐름을 간단하게 요약했을 때 요청 => WAS => 필터 => DispatcherServlet => 인터셉터(preHandle) => 컨트롤러 라고 한다면

서블릿 컨테이너가 "직접" 관리하는 생명 주기는 WAS(서블릿 컨테이너) => 필터 => DispatcherServlet 까지이고, 서블릿 컨테이너에서 내부적으로 DispatcherServlet 호출하면 그때부터 스프링 컨테이너의 생명주기가 시작되므로 스프링 컨테이너의 관리 주기는 DispatcherServlet => 인터셉터 => 컨트롤러 까지라고 이해해도 괜찮을까요?

 

물론 서블릿 컨테이너가 내부적으로 스프링 컨테이너를 호출하니 결국 서블릿 컨테이너의 생명주기 안에 스프링 컨테이너의 생명주기가 "포함"되는 것은 이해하였습니다 !

네 생각하신 내용이 맞습니다. 스프링 빈으로 등록한 것은 모두 스프링 컨테이너가 관리하고, 추가로 서블릿은 모두 서플릿 컨테이너가 관리합니다. 여기서 DispatcherServlet은 중복으로 관리되는데, 이것은 약간 특수한 경우라고 생각하시면 됩니다.

감사합니다.

경민님의 프로필

경민

질문자

2024.04.06

정말 감사합니다.. 막혔던 부분이 뻥 뚫릴 수 있었습니다 !