728x90
1. 커스텀 어노테이션 생성
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {}
2. ArgumentResolver 구현
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(LoginUser.class) != null
&& parameter.getParameterType().equals(MemberDto.class);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
HttpSession session = webRequest.getNativeRequest(HttpServletRequest.class).getSession(false);
if (session != null) {
return session.getAttribute("member");
}
return null;
}
}
3. WebMvcConfigurer에 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
public WebConfig(LoginUserArgumentResolver loginUserArgumentResolver) {
this.loginUserArgumentResolver = loginUserArgumentResolver;
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(loginUserArgumentResolver);
}
}
4. 컨트롤러에서 사용
@GetMapping("/profile")
public String profile(@LoginUser MemberDto member) {
System.out.println(member.getMemNo()); // 세션에서 자동 주입됨
return "profile";
}728x90