본문 바로가기

개발 이모저모/Spring

HandlerMethod란?

반응형

HandlerMethod는 Spring Framework에서 사용되는 클래스 중 하나로, Spring MVC가 HTTP 요청을 처리할 때 매핑된 컨트롤러 메서드를 캡슐화하는 객체이다. 
Spring MVC는 사용자가 요청한 URL을 처리하기 위해 컨트롤러 클래스의 특정 메서드와 매핑을 하고, 이 매핑된 메서드를 HandlerMethod 객체로 관리한다.

HTTP요청을 처리할 때, HandlerMethod 객체를 통해 해당 메서드를 호출하여 실제 비즈니스 로직에 실행하고, 요청 매핑, 메서드 실행 전후 로직처리 등 다양한 기능과 쉽게 연결 될 수 있도록 설계되어 HandlerMethod를 사용하면 유용하다.


보통 사용되는 곳은 DispatcherServletHandlerMapping, HandlerInterceptor이다.

▶ DispatcherServlet, HandlerMapping에서는 Spring MVC의 요청 처리 흐름에서 URL과 컨트롤러 메서드 매핑 정보를 저장하고 관리하는데 사용된다.

@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        return "Hello, Welcome to Jin2rang Blog :: " + name;
    }
}

 

소스의 흐름은,

  1. 클라이언트가 /api/hello?name=JIN 요청을 보낸다.
  2. DispatcherServlet이 요청 URL을 분석한다.
  3. HandlerMapping이 요청을 처리할 수 있는 메서드를 검색한다.
  4. /api/hello에 매핑된 메서드 hello(String name)을 HandlerMethod로 캡슐화한다.
  5. HandlerMethod 객체가 실제 메서드를 호출한다.

 

 


 
HandlerInterceptor에서는 HandlerMethod 객체를 활용해서 요청을 처리하는 메서드 정보를 확인 할 수 있다.

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    if (handler instanceof HandlerMethod) {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        System.out.println("Controller: " + handlerMethod.getBeanType());
        System.out.println("Method: " + handlerMethod.getMethod());
    }
    return true;
}

Interceptor에서 정적리소스와 같은 다른 핸들러가 아니라 Controller method를 처리하는 경우 특정 로직을 실행할 때 유용하다.

아래 코드들과 같이 interceptor에서 활용 할 수 있다.

//예제1

if (handler.getClass().getName().endsWith("HandlerMethod")) {
    // 컨트롤러 메서드와 관련된 처리
    System.out.println("This is a HandlerMethod");
} else {
    // 다른 타입의 핸들러에 대한 처리
    System.out.println("This is not a HandlerMethod");
}

 

//예제2

// HandlerMethod로 컨트롤러 이름 확인
if (handler instanceof HandlerMethod) {
    HandlerMethod hm = (HandlerMethod) handler;
    controllerName = hm.getBean().getClass().getSimpleName();
    Log.Debug("[Controller] Name: " + controllerName);

    //main Controller인 경우에는 쿠키에 있는 값 조회
    if ("MainController".equals(controllerName)) {
        sessionToken = CookieBox.getCookie(request,"session");
        authToken = CookieBox.getCookie(request,"userId");
    }
}

 

반응형