[Aribnb] SpringSecurity와 OAuth2.0으로 로그인 기능 구현하기 4

장수현·2021년 11월 3일
0

에어비앤비

목록 보기
13/15

5.4 어노테이션 기반으로 개선하기

IndexController에서 세션값을 가져오는 부분을 메소드 인자로 바로 받을 수 있도록 변경할 것 이다.

Session user = (SessionUser) httpSession.getAttribute("user");

을 아래 코드로 변경

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}

- @Target(ElementType.PARAMETER)
현재 만드는 어노테이션이 생성될 수 있는 위치를 지정.
현재는 파라미터로 선언된 객체에서만 사용할 수 있게 지정하였다.
- public @interface LoginUser
LoginUser라는 어노테이션으로 생성

LoginUserArgumentResolver 생성

  • HandlerMethodArgumentResolver 인터페이스를 구현한 클래스
  • 조건에 맞는 경우 메소드가 있다면 HandlerMethodArgumentResolver 구현체가 지정한 값으로 해당 메소드의 파라미터를 넘길 수 있다.
@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
파라미터에 전달할 객체를 생성, 여기서는 세션에서 객체를 가져온다.

LoginUserArgumentResolver가 스프링에서 인식될 수 있도록 WebMvcConfigurer에 코드를 추가한다.

@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()를 통해 추가해야 한다.

기존에 '(SessionUser) httpSession.getAttribute("user");'로 가져오던 세션정보 값을 @LoginUser SessionUser user 로 개선하였다.

이제는 어느 컨트롤러던지 @LoginUser를 사용하여 세션 정보를 가져올 수 있다.

0개의 댓글