카테고리 없음

세션값을 전역적으로 사용하기 - HandlerMethodArgumentResolver

sungw00 2025. 9. 9. 00:03
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