반응형
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로 혼자 구현하는 웹서비스
반응형
'BackEnd > spring' 카테고리의 다른 글
@PathVariable 정규식 (0) | 2021.02.07 |
---|---|
[JPA] - 이슈 링크 (0) | 2020.10.10 |
Restfull - HTTP (0) | 2020.03.29 |
Springboot2 + Gradle + Docker (0) | 2019.12.16 |
[Error 처리] a cookie associated with a cross-site resource at was set without the samesite attribute (0) | 2019.10.31 |