IndexController에서 세션값을 가져오는 부분을 메소드 인자로 바로 받을 수 있도록 변경할 것 이다.
Session user = (SessionUser) httpSession.getAttribute("user");
을 아래 코드로 변경
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
- @Target(ElementType.PARAMETER)
현재 만드는 어노테이션이 생성될 수 있는 위치를 지정.
현재는 파라미터로 선언된 객체에서만 사용할 수 있게 지정하였다.
- public @interface LoginUser
LoginUser라는 어노테이션으로 생성
@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");
}
}
- supportsParameter
컨트롤러 메서드의 특정 파라미터를 지원하는지 확인
- isLoginUserAnnotation
파라미터에 @LoginUser가 있는지 체크
- isUserClass
파라미터 클래스 타입이 SessionUser 인지 치크
- resolveArgument
파라미터에 전달할 객체를 생성, 여기서는 세션에서 객체를 가져온다.
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolver) {
argumentResolver.add(loginUserArgumentResolver);
}
}
- @Bean, @Congifuration
개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때 @Bean어노테이션을 활용한다.
1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Congifuration을 명시해 주어야 한다.
- @Conponent
개발자가 직접 개발한 클래스를 Bean으로 등록하고자 하는 경우에 사용한다.
- HandlerMethodArgumentResolver는 항상 WebMvcConfigurer의 addArgumentResolvers()를 통해 추가해야 한다.
이제는 어느 컨트롤러던지 @LoginUser를 사용하여 세션 정보를 가져올 수 있다.