ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 추가는 비교적 간단하게 수행할 수 있다. 

     

     

     

Designed by Tistory.