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로 사용할 어노테이션 생성
java@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
ArgumentResolver 구현
javapublic 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);
}
}
사용할 자리에 대신하여 어노테이션 삽입
java@Controller
public class FrontWebController {
@GetMapping(value = "/")
public String front(@Login User user,
Model model) {
model.addAttribute("user", user);
return "front";
}
}
slf4j