SpringFramework에 기본적으로 등록되어 있는 HandlerAdapter는 세가지가 있다.
- RequestMappingHandlerAdapter
- HttpRequestHandlerAdapter
- SimpleControllerHandlerAdapter
가장 많이쓰는 @RequestMapping이나 해당 어노테이션에서 파생된 GetMapping, PostMapping, .. 등의 요청은 RequestMappingHandlerAdapter를 통해 매핑이되어 그에 맞는 Method가 실행된다.
그렇다면 HandlerAdapter란 무엇일까?
핸들러 매핑에 의해 사용할 Controller를 찾아주면, 그에 맞는 HandlerAdapter를 이용해 컨트롤러 메서드를 실행 해준다. 요청과 실행 중간에서 Adapter 역할을 한다.
위에 적어 놓은 3가지 HandlerAdapter 외에 커스텀하게 내가 만든 HandlerAdapter를 등록하여 원하는 Controller를 매핑시키고, 원하는 파라미터를 전달할 수 있고, 파라미터를 가공하여 전달까지 가능하게 한다.
CustomHandler를 추가하는 방법으로는 HandlerAdapter를 구현하고, Component annotation을 달아주면 HandlerAdatper List에 추가가 된다.
package me.ham.custom.adapter;
import me.ham.custom.annotation.RequiredParams;
import me.ham.custom.controller.HelloController;
import me.ham.custom.controller.SimpleController;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Component
public class SimpleHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
try{
SimpleController target = (SimpleController)(((HandlerMethod) handler).getBean());
}catch (ClassCastException e){
return false;
}
return true;
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Method m = ReflectionUtils.findMethod(HelloController.class, "control", Map.class, Map.class);
RequiredParams requiredParams = AnnotationUtils.getAnnotation(m, RequiredParams.class);
Map<String, String> params = new HashMap<>();
for(String param : requiredParams.value()){
String value = request.getParameter(param);
if(value == null){
throw new IllegalStateException();
}
params.put(param, value);
}
Map<String, Object> model = new HashMap<>();
model.put("param",params);
model.put("thisIsAddedParamInCustomHandler","이게되네");
SimpleController simpleController = (SimpleController)(((HandlerMethod) handler).getBean());
simpleController.control(params, model);
return new ModelAndView("test", model);
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return 0;
}
}
SimpleHandlerAdapter.java hosted with ❤ by GitHub
GitHub: Where the world builds software
GitHub is where over 56 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...
github.com
Custom으로 만든 HandlerAdapter는 Map<String, String>과 Map<String,Object>를 파라미터로 받고, 추가적으로 두번째 파라미터에는 HandlerAdatperd에서 “thisIsAddedParamInCustomHandler”를 key로하는 “이게되네” value를 할당해주었다.
(controller에서 두번째 파라미터에 get을 하여 해당 value를 받을 수 있음
, support가 해당 Adapter가 지원하는 Object이냐를 판별하고, 지원할 경우에 handler 메서드가 실행된다.)
과거의 컨트롤러 매핑 파라미터로 HttpServletRequest와 HttpServletResponse를 파라미터로 받아 처리 했던 시절에도 HandlerAdapter가 처리해주어 파라미터로 전달받아 이를 사용해줄 수 있었던 것이다.
지금 주로 사용 되고 있는 RequestMappingHandlerAdapter에서도 매우 많은 메서드들이 여러 편의 기능을 제공하고 있는 것 같다.
아직은 좀 더 깊게 알아보진 않았지만, 평상시에 매핑 되어 사용되었던 Controller method의 사용에 대해 조금이나마 더 이해할 수 있게 되었고, 원하는대로 수정할 수도 있는 생각을 할 수 있게 되었다.
출처 : medium.com/@hhs1253/%EA%B3%A0%EB%A7%99%EB%8B%A4-hadleradapter-c5fe08777583
'빅데이터 교육과정 (2021-01-25 ~ 2021-06-24) > JAVA (01-28 ~)' 카테고리의 다른 글
JAVA Spring 게시판 만들기 (0) | 2021.04.18 |
---|---|
[JAVA Spring] 뷰 리졸버(viewResolver) (0) | 2021.04.09 |
[JAVA Spring] Dispatcher Servlet, Handler Mapping (0) | 2021.04.09 |
[JAVA Spring] Dispatcher-Servlet이란? (0) | 2021.04.09 |
Spring AOP, Aspect 개념 특징, AOP 용어 정리 (0) | 2021.04.07 |