JAVA

[Java] 핸들러(Handler), 핸들러맵핑(Handler Mapping), 핸들러어댑터(Handler Adapter) - 개발자 배찌

개발자 배찌 2022. 10. 25. 15:39
728x90

회사에서 Java 서버단을 뒤지다가 Handler가 사용된 코드들이 보였다.

Handler??? 분명 강의들으면서 공부했는데..!!
다시 떠올리니 그게 무엇인지, 어떤기능인지,, 설명하지 못한 나 자신… 다시 공부하기로 마음먹었다….
내 기준에!!!!
handler를 잘 모른다면 Java개발자야! 라고 말할 수 없다고 생각한다!!!!


스프링 MVC의 핵심인
DispatcherServlet.java…. 요녀석이 중요!!
스프링 MVC의 프론트컨트롤러이다.

Why???

스프링 MVC 동작원리
Http 요청 -> FrontController(=DIspatcherServlet) -> 핸들러 매핑정보 조회 -> 핸들러 어댑터 조회-> 핸들러 호출 -> ModelAndView반환 -> ViewResolver 호출

DispatcherSevlet
- HttpServlet을 상속받아서 사용 됨
- 스프링부트는 DispatcherServlet을 자동으로 서블릿으로 등록하면서 모든 경로에 대해서 맵핑한다.
(urlPattern=“/”) 더 자세한 경로가 우선순위가 높다.

DispatcherServlet.java > doDispatcher() 호출

protected void doDispatch(HttpServletRequest request, HttpServletResponse
  response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    ModelAndView mv = null;
	// 1. 핸들러 조회
	mappedHandler = getHandler(processedRequest);
	//2.핸들러 어댑터 조회-핸들러를 처리할 수 있는 어댑터
	HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
	// 3. 핸들러 어댑터 실행 -> 4. 핸들러 어댑터를 통해 핸들러 실행 -> 5. ModelAndView 반환
	mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
   processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

  
  private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception {
  // 뷰 렌더링 호출
	render(mv, request, response);
  }
  
  
  protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
   View view;
	String viewName = mv.getViewName(); //6. 뷰 리졸버를 통해서 뷰 찾기,7.View 반환
   view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
	// 8. 뷰 렌더링
   view.render(mv.getModelInternal(), request, response);
 }
  


스프링 MVC의 강점은 DispatcherServlet 코드를 변경없이 원하는 기능을 변경하거나 확장할 수 있다.

자, 그럼 그 안의 handlerMapping과 HandlerAdapter을 알아보자!

HandlerMapping

0 = RequestMappingHandlerMapping
: 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용

1= BeanNameUrlHandlerMapping
: 스프링 빈의 이름으로 핸들러를 찾는다.


HandlerAdapter

0 = RequestMappingHandlerAdapter
: 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용

1 = HttpRequestHandlerAdapter
: HttpRequestHandler 처리

2 = SimpleControllerHandlerAdapter
: Controller 인터페이스(애노테이션X, 과거에 사용) 처리


가장 우선순위가 높은 핸들러매핑과 핸들러어댑터
RequestMappingHandler
RequestMappingAdapter

@RequestMapping 의 앞글자를 따서 만든 이름.
99.9% 실무에서 사용하고 있음.