-
SpringMVC 2 - ArgumentResolver 활용카테고리 없음 2023. 11. 15. 23:54
@GetMapping("/") public String homeLoginV3ArgumentResolver(@Login Member loginMember, Model model) { //세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; } //세션이 유지되면 로그인으로 이동 model.addAttribute("member", loginMember); return "loginHome"; }
- @Login 애노테이션을 만들어보자
- 이 애노테이션이 있으면, 직접 만든 ArgumentResolver가 작동해서, 자동으로 세션에 로그인 회원 찾아주고,
세션이 없다면 null을 반환하도록 하자
1. 어노테이션 생성
package hello.login.web.argumentresolver; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface Login { }
- 파라미터와, 런타임에 작동하는 어노테이션을 만들었다.
2. ArgumentResolver 구현
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver{ @Override public boolean supportsParameter(MethodParameter parameter){ boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); boolean hasMemberType = Member.class.isAssinableFrom((parameter.getParameterType()); //instanceOf보다 좋음!! 하위타입도 조회해줌 return hasLgoinAnnotation && hasMemberType; } @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_MEMBER); } }
- 어노테이션 기반 컨트롤러이므로 HandlerMethodArgumenteResolver를 사용하자
- supportsParameter() : @Login 어노테이션이 있으면서 Member타입일 때 작동
- resolveArgument() : 컨트롤러 호출 직전에 호출 -> 파라미터 정보 생성
여기서는 session에서 정보 꺼내줌 -> 이후 스프링 MVC에서 메서드 호출하면서 파라미터 전달함
3. WebMvcConfigurer설정
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new LoginMemberArgumentResolver()); } //... }
- argumentResolver 추가는 비교적 간단하게 수행할 수 있다.