반응형
HandlerMethod는 Spring Framework에서 사용되는 클래스 중 하나로, Spring MVC가 HTTP 요청을 처리할 때 매핑된 컨트롤러 메서드를 캡슐화하는 객체이다.
Spring MVC는 사용자가 요청한 URL을 처리하기 위해 컨트롤러 클래스의 특정 메서드와 매핑을 하고, 이 매핑된 메서드를 HandlerMethod 객체로 관리한다.
HTTP요청을 처리할 때, HandlerMethod 객체를 통해 해당 메서드를 호출하여 실제 비즈니스 로직에 실행하고, 요청 매핑, 메서드 실행 전후 로직처리 등 다양한 기능과 쉽게 연결 될 수 있도록 설계되어 HandlerMethod를 사용하면 유용하다.
보통 사용되는 곳은 DispatcherServlet과 HandlerMapping, 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;
}
}
소스의 흐름은,
- 클라이언트가 /api/hello?name=JIN 요청을 보낸다.
- DispatcherServlet이 요청 URL을 분석한다.
- HandlerMapping이 요청을 처리할 수 있는 메서드를 검색한다.
- /api/hello에 매핑된 메서드 hello(String name)을 HandlerMethod로 캡슐화한다.
- 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");
}
}
반응형
'개발 이모저모 > Spring' 카테고리의 다른 글
request.setAttribute() 와 request.getAttribute()는 뭘까? (0) | 2025.01.18 |
---|---|
Spring Boot - 웹개발 기초 - ② MVC란? (0) | 2022.11.09 |
Spring Boot - 웹개발 기초 - ① 정적컨텐츠 (0) | 2022.06.27 |
Spring Boot 기초 - 라이브러리 살펴보기 (0) | 2022.06.27 |
Spring Boot - thymeleaf ( 템플릿 엔진 ) (0) | 2022.06.25 |