Spring/Spring MVC
Spring MVC - ArgumentResolver을 활용한 애노테이션 만들기
jddng
2022. 2. 9. 17:04
728x90
반응형
ArgumentResolver을 활용한 애노테이션 만들기
다음과 같은 핸들러가 있다
@GetMapping("/")
public String homeLoginV3Spring(
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {
....
}
핸들러의 파라미터중 Member loginMember는 key 값으로 @SessionAttribute 어노테이션을 이용해 Session 영역에 저장되어있는 해당 Member타입의 객체를 가져온다. 잘못된 방법은 아니지만 위 방법보다 더 보기 간편하고 편리하게 사용할 수 있도록 @SessionAttribute의 모든 파라미터 설정값을 갖는 애노테이션을 만들어 사용할 수 있다.
애노테이션 생성
- @Target(ElementType.PARAMETER)
- 파라미터에만 사용 - @Retention(RetentionPolicy.RUNTIME)
- 리플렉션 등을 활용할 수 있도록 런타임까지 애노테이션 정보가 남아있음
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
HandlerMethodArgumentResolver 구현
@Slf4j
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParameter 실행");
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasMemberType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
log.info("resolveArgument 실행");
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null) {
return null;
}
return session.getAttribute(SessionConst.LOGIN_MEMBER);
}
}
▶ supportsParameter()
- @Login 애노테이션이 있으면서 Member 타입이면 해당 ArgumentResolver가 사용
▶ resolveArgument()
- 컨트롤러 호출 직전에 호출 되어서 필요한 파라미터 정보를 생성해준다.
- 세션에 있는 member 객체를 찾아서 반환
728x90
반응형