Spring & Servlet

스프링에서 DispatcherServlet의 역할은 무엇인가요? 그리고 서블릿 컨테이너와 어떤 관계를 갖고 있는지도 설명해주세요.

  • DispatcherServlet은 Spring MVC의 프론트 컨트롤러 역할을 수행

  • HttpServlet을 상속받은 클래스이며, 서블릿 컨테이너(Tomcat 등) 에 의해 관리됨

  • 모든 요청을 받아 핸들러 탐색, 실행, 응답 렌더링까지 담당

DispatcherServlet이 요청을 받은 후 내부적으로 어떤 흐름으로 동작하나요? 핵심 컴포넌트들과 함께 설명해주세요.

Client → Filter → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ModelAndView → ViewResolver → View → Response

  • Filter: 서블릿 컨테이너 레벨의 전처리

  • Interceptor: Spring Handler 전/후 처리

  • ModelAndView: 컨트롤러에서 로직 결과와 뷰 정보를 담는 객체

  • ViewResolver: 논리 뷰 이름 → 물리 뷰 이름 매핑

Spring MVC에서 HandlerMapping과 HandlerAdapter는 각각 어떤 역할을 하나요? 그리고 왜 이 둘이 분리되어 있는지 설명해주세요.

컴포넌트
역할

HandlerMapping

요청 URL에 매핑되는 Handler 객체 찾기

HandlerAdapter

해당 Handler를 실제로 실행할 수 있는 전략 객체 선택 및 실행

  • 예시:

    • @Controller 메서드 → RequestMappingHandlerAdapter

    • HttpRequestHandler 구현 → HttpRequestHandlerAdapter

→ 덕분에 Spring MVC는 다양한 방식의 Controller를 유연하게 처리할 수 있음 (Adapter Pattern)

그럼 HandlerMapping은 handler를 찾는 역할이고, HandlerAdapter는 그 handler를 실행하는 역할이라는 말이 있어. 이게 무슨 의미인지, 구체적으로 예시를 들어 설명해줄 수 있을까? (예: 어노테이션 기반 Controller 등)

Spring MVC는 요청 처리 과정을 유연하게 구성하기 위해 HandlerMappingHandlerAdapter라는 두 컴포넌트를 분리

🔹 HandlerMapping

  • 요청 정보(URL, HTTP method 등) 를 바탕으로 어떤 Handler 객체가 이 요청을 처리할지 결정해요.

  • 이때의 Handler는 실제로는 Method 객체, 또는 Bean 객체와 메서드 정보를 담은 HandlerMethod 등입니다.

🔸 예시:

  • 클라이언트가 /user/123에 GET 요청 → @RequestMapping("/user/{id}")이 있는 Controller 메서드 반환됨.

🔹 HandlerAdapter

  • HandlerMapping이 찾아준 Handler 객체를 실행할 수 있는 방법을 알고 있는 실행기(Executor) 역할이에요.

  • Handler의 타입에 따라 실행 방식이 다를 수 있기 때문에 Adapter 패턴이 도입되었어요.

🔸 예시:

  • 위에서 찾은 @RequestMapping 기반 Handler는 HandlerMethod 객체이고, 이걸 실행할 수 있는 HandlerAdapter는 **RequestMappingHandlerAdapter**입니다.

  • 만약 요청이 SimpleControllerHandlerAdapterHttpRequestHandlerAdapter가 처리하는 타입이라면 해당 Adapter가 실행하게 돼요.

💡 왜 이렇게 분리했을까?

유연성 때문이에요.

Spring은 다양한 종류의 핸들러를 지원하길 원했어요:

  • @Controller의 메서드

  • HttpRequestHandler

  • SimpleController

  • 심지어 외부 라이브러리 기반 핸들러

그래서 요청 → 핸들러 찾기(HandlerMapping), 핸들러 실행(HandlerAdapter)로 나눈 거예요.

✅ 예시 흐름

클라이언트가 /hello로 GET 요청 시:

  1. DispatcherServlet이 요청 수신

  2. HandlerMapping이 이 URL을 처리할 @Controller 클래스의 hello() 메서드를 찾아냄 → HandlerMethod로 래핑

  3. HandlerAdapterRequestMappingHandlerAdapter가 이 HandlerMethod를 실행할 수 있는지 판단

  4. 해당 Adapter가 hello() 메서드 실행

  5. 결과인 ModelAndView 반환


✅ 핵심 요약

컴포넌트
역할
예시

HandlerMapping

요청 URL → Handler 결정

/users/{id} → UserController의 메서드

HandlerAdapter

Handler 실행 방법 결정 및 실행

HandlerMethod → 메서드 invoke

Last updated