본문 바로가기

BackEnd/spring

[springboot] HandlerMethodArgumentResolver

반응형

spring docs
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodArgumentResolver.html

 

HandlerMethodArgumentResolver (Spring Framework 5.2.6.RELEASE API)

 

docs.spring.io

즉 간단히 설명하면 주어진 요청을 처리할때 메소드 파라미터를 인자값들에 주입해주는 전략 인터페이스이다

간단한 예제코드를 보자

LoginUserArgumentResolver.java

import javax.servlet.http.HttpSession;

@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {

    private final HttpSession httpSession;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
        boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
        return isLoginUserAnnotation && isUserClass;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        return httpSession.getAttribute("user");
    }
}
  • 두개의 Override 메소드를 작성해야한다.
  • supportsParameter 메서드는 현재 파라미터를 resolver이 지원하는지에 대한 boolean을 리턴합니다.
  • resolveArgument 메서드는 실제로 바인딩을 할 객체를 리턴합니다.

@interface를 통한 커스텀 어노테이션 작성
LoginUser.java 

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 LoginUser {
}

WebConfig에 Override 메소드에 해당 커스텀 Resolver 를 등록해 준다.
WebConfig.java

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
    private final LoginUserArgumentResolver loginUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(loginUserArgumentResolver);
    }
}


실제 Controller에서 사용 예

@RequiredArgsConstructor
@Controller
public class IndexController {

    private final PostsService postsService;

    @GetMapping("/")
    public String index(Model model, @LoginUser SessionUser user) {
        model.addAttribute("posts", postsService.findAllDesc());
        if (user != null) {
            model.addAttribute("userName", user.getName());
        }
        return "index";
    }
}



참고 문헌
스프링부트와 AWS로 혼자 구현하는 웹서비스

반응형