[Java] SpringMVC에서 HandlerMapping과 HandlerAdapter가 분리된 이유

Hyo Kyun Lee·2025년 1월 21일
0

Java

목록 보기
81/87
post-thumbnail

1. 개요

클라이언트에 요청이 왔을때 어떠한 흐름으로 진행이 이루어지는지 살펴보면서, mvc구조의 dispatcher servlet이 handlermapping과 handleradapter를 통해 적절한 컨트롤러를 찾는다는 점을 알게되었다.

사실 어렴풋이 알고는 있었지만 왜 굳이 나누었는가에 대한 의문점이 생겼고, 이에 대해 새롭게 알게된 부분들을 정리하여 기록하였다.

2. HandlerMapping과 HandlerAdapter가 분리된 이유

간략하게 프론트 컨트롤러에서 동적 페이지를 구성해줄 컨트롤러를 찾기까지 나타내면 위와 같다.

  • 클라이언트 요청이 오면 웹컨테이너의 디스패처 서블릿이 전달받고, 이를 처리할 컨트롤러를 찾기위해 HandlerMapping을 실행한다.
  • 이후 HandlerAdapter를 통해 컨트롤러를 호출하고, 알맞은 서비스 로직을 진행한 후 데이터와 뷰이름을 전달한다.
  • 이를 View Resolver가 뷰객체를 생성하고 모델데이터를 활용하여 클라이언트에게 보여줄 화면을 만들고 최종 전달한다.

이때 HandlerMapping과 HandlerAdapter는 모두 인터페이스, 즉 기능적으로 분리되어 각각의 명확한 역할을 수행하기 위해 제공된다.

HandlerMapping

  • getHandler 메소드를 통해 HttpServletRequest 객체를 전달받아 HandlerExecutionChain 객체를 반환한다.
  • 이 Execution 객체안에 실제 호출할 컨트롤러 전후 실행될 인터셉터 정보가 들어가있다.

HandlerAdapter

  • 내부 handler 메소드를 통해 HandlerMapping으로부터 전달받은 핸들러 정보를 처리하여 실제 로직을 처리한다.
  • View Resolver를 통해 생성된 뷰객체와 모델데이터가 ModelAndView 객체에 담겨져 최종 전달 및 렌더링된다.

이렇게 분리된 매핑과 어댑터 정보는 분리된 책임으로 명확한 기능을 수행할 수 있고, 특히 어댑터에서의 컨트롤러와 매핑의 디스패처서블릿 간의 호환성을 제공하여 결합도가 낮고 객체지향적인 구조를 만들 수 있게 된다.

스프링구조가 mvc만 있는 것은 아니기때문에, 다양한 컨트롤러가 존재할 수 있다는 점을 기억하자.

3. 참고자료

매핑과 어댑터가 분리된 이유 - https://stonehee99.tistory.com/24

0개의 댓글

관련 채용 정보