ArgumentResolver란?
컨트롤러로 들어온 파라미터를 가공, 수정하기 위한 것이다.
HandlerMethodArgumentResolver를 구현한다.
보통 여태까지의 코드들은 컨트롤러에서 유저아이디를 꺼내왔었지만 ArgumentResolver를 사용함으로써 이 코드들이 중복되는 것을 방지한다.(물론 @RequestAttribute Long userId를 파라미터로 해서 가져오는 방법도 존재한다, JwtFilter에서 setAttribute로 해주었기 때문.)
코드의 목적 : 컨트롤러에 AuthUser라는 내가 만든 객체, 내가 설정한 정보들을 Controller에 넘기고 싶다.
AuthUserArgumentResolver에선
AuthUser의 어노테이션이 제대로 사용되어 있는지 유효성을 검사하는 메소드와
JwtFilter에서 request에 세팅된 값들을 새로운 AuthUser객체에 할당하는 역할을 하고 있다.
HTTP 요청이 들어오면 Spring MVC는 등록된 ArgumentResolver들을 순회하는데, 간단하게 다시 말해서 필요한 유저 정보들을 컨트롤러에 넘겨주는 과정이다.
이렇게 설정하게 되면 컨트롤러에 파라미터로 @Auth AuthUser authuser 방식으로 넘겨줄 수 있게 된다. (@Auth는 사용자지정 어노테이션이니 참고하자)
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
// ArgumentResolver 등록
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new AuthUserArgumentResolver());
}
}
public class AuthUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasAuthAnnotation = parameter.getParameterAnnotation(Auth.class) != null;
boolean isAuthUserType = parameter.getParameterType().equals(AuthUser.class);
// @Auth 어노테이션과 AuthUser 타입이 함께 사용되지 않은 경우 예외 발생
if (hasAuthAnnotation != isAuthUserType) {
throw new AuthException("@Auth와 AuthUser 타입은 함께 사용되어야 합니다.");
}
return hasAuthAnnotation;
}
@Override
public Object resolveArgument(
@Nullable MethodParameter parameter,
@Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
@Nullable WebDataBinderFactory binderFactory
) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
// JwtFilter 에서 set 한 userId, email, username, userRole 값을 가져옴
Long userId = (Long) request.getAttribute("userId");
String email = (String) request.getAttribute("email");
String username = (String) request.getAttribute("username");
UserRole userRole = UserRole.of((String) request.getAttribute("userRole"));
return new AuthUser(userId, email,username, userRole);
}
}
'Spring' 카테고리의 다른 글
RequestDto에서 @NotBlank시 Error 발생 (0) | 2025.03.27 |
---|---|
Spring Event - 최종 프로젝트 관련 내용 포함 (0) | 2025.03.27 |
[Spring] Spring Security - 필터를 Spring Security Filter로 갈아끼워보자! (0) | 2025.01.16 |
[Spring-AOP]특정 api 로깅하기 - requestBody를 어떻게꺼내?? (0) | 2025.01.03 |