RequestMappingHandlerAdapter
어노테이션 기반의 컨트롤러, @RequestMapping
을 처리하는 HandlerAdapter .
RequestMappingHandlerAdapter 동작 방식
ArgumentResolver
어노테이션 기반의 컨트롤러는 다양한 파라미터를 사용할 수 있다. (HttpServletRequest, Model, @RequestParam, @ModelAttribute, @RequestBody) 이것을 처리할 수 있는 것은 ArgumentResolver기반에서 작동하기 때문이다. 원하는 ArgumentResolver를 만들수도 있다.
ReturnValueHandler
컨트롤러의 반환 값을 변환 (ModelAndView, ResponseBody, HttpEntity..)
HTTP MessageConverter
각 ArgumentResolver들이 HTTP MessageConverter를 사용해 필요한 객체를 생성한다. 각 ReturnValueHandler들이 HTTP MessageConverter를 사용해 필요한 객체를 생성한다. 그런존재다.
ArgumentResolver 활용한 Login 어노테이션 구현
Argument resolver로 사용할 어노테이션 생성
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
ArgumentResolver 구현
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasUserType = User.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasUserType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null)
return null;
return session.getAttribute(SessionConst.LOGIN_USER);
}
}
사용할 자리에 대신하여 어노테이션 삽입
@Controller
public class FrontWebController {
@GetMapping(value = "/")
public String front(@Login User user,
Model model) {
model.addAttribute("user", user);
return "front";
}
}
slf4j
http://dveamer.github.io/backend/HowToUseSlf4j.html