2. 핸들러 어댑터를 통한 컨트롤러 로직 실행

상위 맥락

03. Request Response Cycle < 02. MVC 아키텍처와 요청 흐름 < 01. Spring MVC1 기초와 아키텍처 < MVC < Spring < Web

핵심 정리

핸들러가 결정되면 DispatcherServlet은 그 핸들러를 직접 실행하지 않고 HandlerAdapter에게 실행을 위임합니다. HandlerAdapter는 다양한 핸들러 규격을 표준화하여 실제 컨트롤러 메서드를 호출합니다.

실행 흐름

  1. DispatcherServlet이 HandlerMapping으로부터 핸들러를 받습니다.
  2. 해당 핸들러를 실행할 수 있는 HandlerAdapter를 선택합니다.
  3. HandlerAdapter가 컨트롤러 메서드를 호출합니다.
  4. 컨트롤러가 요청을 처리한 결과를 반환합니다.
  5. HandlerAdapter가 그 결과를 DispatcherServlet에 전달합니다.

컨트롤러 내부의 기본 역할

HandlerAdapter에 의해 실행된 @Controller 메서드는 보통 다음 순서로 동작합니다.

  1. 요청 파라미터를 확인합니다.
  2. Service를 호출하여 비즈니스 로직을 수행합니다.
  3. 결과 데이터를 Model에 저장합니다.
  4. 논리적 View 이름 또는 데이터를 반환합니다.

왜 중요한가

HandlerAdapter가 있기 때문에 DispatcherServlet은 @Controller 메서드의 세부 실행 방식에 직접 의존하지 않습니다. 새로운 핸들러 방식이 추가되어도 프론트 컨트롤러의 핵심 구조를 바꾸지 않고 확장할 수 있습니다.

주의할 점

컨트롤러가 Service에 위임하지 않고 내부에 모든 로직을 넣으면 Fat Controller가 됩니다. 또한 내부 메서드에 @Async나 @Cacheable을 붙이고 직접 호출하면 내부 호출 문제가 발생할 수 있습니다. 따라서 컨트롤러는 요청 처리 흐름을 제어하고, 핵심 로직은 별도 Service 빈으로 분리하는 것이 자료의 흐름과 맞습니다.

한 문장 요약

HandlerAdapter는 DispatcherServlet이 찾은 핸들러를 표준 방식으로 실행하고, 컨트롤러가 요청 분석부터 결과 반환까지의 로직을 수행하도록 연결합니다.

핵심 연결

DispatcherServlet, HandlerMapping, HandlerAdapter와 함께 읽으면 좋습니다.