Apache Tomcat / / 2024. 10. 7. 16:46

Servlet, DispatcherServlet, Special Bean

서블릿(Servlet)과 디스패처서블릿(DispatcherServlet)의 차이는 그들이 사용되는 맥락역할에서 크게 달라. 둘 다 웹 애플리케이션에서 클라이언트의 요청을 처리하기 위해 사용되지만, 각각의 역할과 동작 방식은 다르지.

 

1. 서블릿(Servlet)

 

서블릿은 자바 EE(현재는 자카르타 EE)에서 제공하는 표준 인터페이스로, 클라이언트(주로 웹 브라우저)로부터 요청을 받아서 처리한 후 응답을 생성하는 역할을 해. 가장 기본적인 웹 컴포넌트 중 하나야. 서블릿은 다음과 같은 특징을 가지고 있어:

 

역할: HTTP 요청을 처리하고, 그 결과를 응답으로 클라이언트에게 보냄.

동작 방식: HttpServlet 클래스를 상속해서 구현한 후, doGet(), doPost() 같은 메서드에서 요청을 처리함.

위치: 주로 서블릿 컨테이너(톰캣 같은 서버)에서 실행됨.

 

서블릿은 웹 애플리케이션의 요청과 응답 처리를 위한 기본적인 단위지만, 비즈니스 로직프레젠테이션 로직을 모두 처리해야 하기 때문에 큰 애플리케이션에서는 유지보수와 확장이 어려울 수 있어.

 

2. 디스패처서블릿(DispatcherServlet)

 

**디스패처서블릿(DispatcherServlet)**은 Spring MVC 프레임워크에서 제공하는 서블릿이야. Spring MVC의 핵심 컴포넌트로, 프론트 컨트롤러(Front Controller) 역할을 해. 쉽게 말하면, 클라이언트로부터 모든 요청을 받아서 적절한 컨트롤러에게 전달하고, 컨트롤러가 처리한 결과를 뷰(View)로 전달하는 중간 관리자 역할을 해.

 

역할: 모든 요청을 받고, 해당 요청을 처리할 컨트롤러에게 전달한 후 응답을 생성함. 즉, 요청 분배기 역할.

동작 방식: 클라이언트로부터 들어오는 모든 요청을 하나의 진입점에서 받고, 핸들러 매핑을 통해 적절한 컨트롤러로 분기시킴. 그 후 컨트롤러가 처리한 데이터를 다시 모델과 뷰로 결합해 응답을 생성함.

위치: Spring MVC 애플리케이션에서 web.xml이나 스프링 부트의 자동 설정을 통해 서블릿으로 등록됨.

 

디스패처서블릿은 MVC 패턴을 기반으로 동작하며, 요청 처리를 여러 레이어로 나눠서 관리하기 때문에 유지보수와 확장이 훨씬 용이해. 또, Spring의 다양한 기능(의존성 주입, AOP, 트랜잭션 관리 등)을 활용할 수 있어.

 

주요 차이점 정리:

 

서블릿(Servlet) 디스패처서블릿(DispatcherServlet)
자바 EE 표준 기반 Spring MVC의 핵심 컴포넌트
HTTP 요청/응답을 직접 처리 요청을 받아서 컨트롤러에 분배하고, 응답을 조합해 반환
비즈니스 로직과 프레젠테이션 로직이 혼재 MVC 패턴을 통해 역할 분리 (컨트롤러, 서비스, 뷰)
단순한 요청 처리 복잡한 요청 흐름을 관리하고, 다양한 Spring 기능과 연동 가능

 


 

DispatcherServlet(출처-https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/context-hierarchy.html)

 

1. DispatcherServlet

 

DispatcherServlet은 Spring MVC에서 프론트 컨트롤러 역할을 수행해. 모든 HTTP 요청은 이 서블릿을 통해 처리되고, 알맞은 핸들러(Controller)로 매핑돼.

클라이언트의 요청을 받아 알맞은 비즈니스 로직과 뷰를 처리할 수 있도록 연결하는 중요한 요소야.

 

2. Servlet WebApplicationContext

 

Servlet WebApplicationContextDispatcherServlet에 의해 생성되는 WebApplicationContext로, 주로 웹과 관련된 빈(Bean)을 관리해.

여기에는 Controllers, ViewResolver, HandlerMapping과 같은 웹 관련 빈이 포함돼.

Controllers: 사용자의 요청을 처리하는 비즈니스 로직의 입구 역할을 해.

HandlerMapping: 어떤 요청 URL이 어떤 컨트롤러에 매핑될지를 결정하는 역할을 해.

ViewResolver: 컨트롤러가 반환하는 논리적 뷰 이름을 실제 뷰(JSP, HTML 등)로 매핑하는 역할을 해.

 

3. Root WebApplicationContext

 

Root WebApplicationContext는 애플리케이션의 공통적인 빈을 관리하며, Servlet WebApplicationContext의 부모 역할을 해.

이 컨텍스트는 모든 서블릿들이 공유하는 공통 빈(서비스, 데이터 소스 등)을 포함해.

Services: 비즈니스 로직을 처리하는 서비스 레이어를 말해. 여기서 실제로 비즈니스 처리가 이루어져.

Repositories: 데이터 접근을 담당하는 레이어로, 주로 데이터베이스와의 상호작용을 담당해.

 

4. 의존 관계 및 위임 구조

 

Servlet WebApplicationContext에서 빈을 찾을 수 없으면 Root WebApplicationContext로 요청을 위임하게 돼.

이 구조 덕분에 Servlet WebApplicationContext는 웹에 특화된 빈을 관리하고, Root WebApplicationContext는 더 일반적인 애플리케이션 로직에 대한 빈을 관리하여 역할을 구분할 수 있어.

 

요약

 

DispatcherServlet: 모든 요청을 중앙에서 받아서 처리하고, 핸들러로 연결하는 역할을 해.

Servlet WebApplicationContext: 웹 관련 빈(Controller, ViewResolver 등)을 관리하는 컨텍스트.

Root WebApplicationContext: 전체 애플리케이션에 대한 공통적인 빈(서비스, 데이터 소스 등)을 관리하는 컨텍스트.


DispatcherServlet은 Spring MVC에서 모든 웹 요청을 처리하는 프론트 컨트롤러 역할을 하고, 여러 종류의 Special Bean들을 감지해서 웹 애플리케이션의 동작을 조정해. 이들 Special Bean은 요청을 어떤 핸들러로 보내야 하는지, 뷰를 어떻게 선택할지, 예외를 어떻게 처리할지를 결정하는 중요한 역할을 해.

 

DispatcherServlet에 의해 감지되는 Special Bean들

 

1. HandlerMapping

역할: 요청 URL을 적절한 핸들러(주로 컨트롤러)에 매핑하는 역할을 해.

사용 방식: 클라이언트로부터 HTTP 요청이 들어오면, DispatcherServlet은 HandlerMapping 빈을 사용해 해당 요청을 처리할 핸들러를 찾게 돼.

예시: @RequestMapping("/hello") 애노테이션이 붙은 메서드를 처리하기 위해 사용돼. 이 빈은 URL 패턴과 일치하는 핸들러(컨트롤러 메서드)를 찾아주는 역할을 해.

주요 구현체: RequestMappingHandlerMapping, SimpleUrlHandlerMapping 등이 있어.

2. HandlerAdapter

역할: HandlerMapping에 의해 찾아진 핸들러(컨트롤러)를 실제로 호출하는 역할을 해.

사용 방식: 각 핸들러의 호출 방식이 다를 수 있기 때문에, HandlerAdapter가 해당 핸들러를 실행할 수 있도록 돕지. 예를 들어, 특정한 컨트롤러 타입이나 메서드 형식에 맞는 호출 방식이 필요할 때 사용돼.

예시: RequestMappingHandlerAdapter@RequestMapping 애노테이션이 붙은 메서드를 실제로 호출해.

주요 구현체: RequestMappingHandlerAdapter는 표준 Spring MVC 컨트롤러를 처리하고, HttpRequestHandlerAdapterHttpRequestHandler 인터페이스를 구현하는 객체를 처리해.

3. HandlerExceptionResolver

역할: 요청 처리 중에 발생한 예외를 처리하기 위해 사용돼.

사용 방식: 컨트롤러나 다른 핸들러에서 예외가 발생하면, DispatcherServlet은 등록된 HandlerExceptionResolver 빈을 사용해 예외를 처리하려고 시도해. 이 빈을 사용하여 특정한 예외가 발생했을 때 사용자에게 적절한 응답(예: 에러 페이지)을 제공할 수 있어.

예시: @ExceptionHandler 애노테이션이 붙은 메서드를 사용해 예외를 처리할 수 있고, 이 로직을 HandlerExceptionResolver가 관리해.

주요 구현체: ExceptionHandlerExceptionResolver, ResponseStatusExceptionResolver 등이 있어.

4. ViewResolver

역할: 컨트롤러가 반환하는 논리적인 뷰 이름을 실제 뷰로 매핑하는 역할을 해.

사용 방식: 컨트롤러가 문자열로 뷰 이름(예: “home”)을 반환하면, DispatcherServlet은 ViewResolver를 사용해 해당 뷰 이름을 실제 JSP 파일이나 다른 뷰로 변환해. 이를 통해 적절한 화면을 사용자에게 제공할 수 있게 돼.

예시: "home"이라는 뷰 이름을 home.jsp 파일로 매핑해주는 역할을 함.

주요 구현체: InternalResourceViewResolver는 JSP와 같은 리소스를 뷰로 사용하고, ThymeleafViewResolver는 Thymeleaf 템플릿을 사용할 때 사용해.

5. LocaleResolver

역할: 요청의 **지역(locale)**을 결정하는 역할을 해. 즉, 사용자의 언어와 지역 설정에 따라 다른 리소스를 제공할 수 있어.

사용 방식: 사용자의 요청에 담긴 정보나 쿠키 등에 따라 적절한 지역 설정을 선택하고, 그 설정을 바탕으로 올바른 리소스를 사용해.

예시: 사용자가 브라우저에서 ko 지역으로 설정되어 있으면 한국어 리소스를, en 지역으로 설정되어 있으면 영어 리소스를 제공하도록 설정할 수 있어.

주요 구현체: SessionLocaleResolver, CookieLocaleResolver 등이 있어.

6. MultipartResolver

역할: 멀티파트 요청, 즉 파일 업로드 요청을 처리하는 역할을 해.

사용 방식: 사용자가 파일을 업로드할 때, DispatcherServlet은 MultipartResolver를 사용해 파일 데이터를 분리하고 이를 컨트롤러에서 다룰 수 있도록 해줘.

예시: 사용자가 이미지를 업로드하면, 이 요청을 MultipartResolver가 처리하여 컨트롤러에서 파일 데이터를 받을 수 있도록 해.

주요 구현체: CommonsMultipartResolver, StandardServletMultipartResolver 등이 있어.

 

정리

 

DispatcherServlet은 Spring MVC의 핵심 요소로서, 웹 요청을 처리하기 위해 다양한 Special Bean들을 감지하고 사용해. 이들 Special Bean들은 요청을 올바른 핸들러로 라우팅하고, 예외를 처리하고, 뷰를 결정하는 등 웹 요청을 처리하는 전반적인 과정을 돕는 역할을 해.

 

HandlerMapping: 요청 URL을 핸들러에 매핑해.

HandlerAdapter: 찾아진 핸들러를 실제로 호출해.

HandlerExceptionResolver: 요청 처리 중 발생한 예외를 처리해.

ViewResolver: 논리적인 뷰 이름을 실제 뷰로 변환해.

LocaleResolver: 요청의 지역 설정을 관리해.

MultipartResolver: 파일 업로드와 같은 멀티파트 요청을 처리해.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유