Spring Argument resolver

🗓️

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