[Spring Boot] 간편하게 구글 로그인 확인하기 create custom annotation for check login

yoonddo·2024년 4월 11일

SPRING

목록 보기
3/4
post-thumbnail

이전 구글로그인 구현에 이어서 매번 HttpSession의 getAttribute()메서드로 세션 정보를 가져와야하는 번거로움을 개선하기 위해 애노테이션을 생성하고, 적용 시켜보자 !

아직 구글로그인을 구현해보지 못했거나, 구현하는데 어려움이 있는 사람은 다음 링크를 참고하면 된다.
구글로그인 구현하기 GO

1. Create annotation 🌠

1-1) SessionUser.class

Session값을 담을 SesssionUser 클래스 생성

본인의 엔티티 클래스를 넣어주고 변수명도 동일하게 작성해야한다.

@Getter
public class SessionUser implements Serializable {
    private String email;
    private String name;

    public SessionUser(UserEntity user) {
        this.email = user.getEmail();
        this.name = user.getName();
    }
}

1-2) LoginUser.@interface

LoginUser 어노테이션 생성

@Target -> ElementType에는 CLASS, METHOD 등 여러가지가 있는데, 파라미터에서 사용하기 위해 PARAMETER로 설정했다.
@Retention -> 애노테이션의 생명 주기를 정하며 RetientionPolicy 속성으로 SOURCE, CALSS, RUNTIME 등 존재할 범위를 설정한다.
RUNTIME은 런타임동안 살아있으며 사실상 사라지지 않음을 의미한다.

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

1-3) LoginUserArgumentResolver.class

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");
    }
}

implements HandlerMethodArgumentResolver를 작성하면 메서드 두개를 오버라이딩 하라는 경고가 뜬다.
오버라이딩 후 위 코드와 같이 리팩토링한다.

1-4) WebConfig.class

WebMvcConfigurer 인터페이스의 구현체 WebConfig 클래스 생성

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
    private final LoginUserArgumentResolver loginUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(loginUserArgumentResolver);
    }

}

addArgumentResolver 메서드를 오버라이딩하고 lgoinUserArgumentResolver를 add하는 코드를 작성한다.

2. Test @LoginUser annotation

Controller에서 @LoginUser 사용해보기

위에서 애노테이션에@Target(ElementType.PARAMETER)를 설정했기 때문에 파라미터 타입으로만 사용할 수 있다.

/access/{url} 경로로 요청이 들어오면 로그인 여부를 확인하고 세션값이 존재하면 해당 url로 이동, 존재하지 않으면 구글로그인 경로로 이동하는 코드를 작성해보자

@RequestMapping(value={"/access/{url}"})
    public String sessionUser(@LoginUser SessionUser session, @PathVariable String url) {
        log.info("로그인확인");
        if(session != null){
            log.info("로그인ok");
            log.info(session.getName());
            log.info(session.getEmail());
            return url;
        }
        return "redirect:/oauth2/authorization/google";
    }

위 코드를 작성하고 /access/{url} 경로로 접속해 테스트하면 정상적으로 실행되는걸 확인할 수 있다.












정확하지 않거나 틀린부분이 있으면 댓글 남겨주시면 보답의 의미로 커피 쿠폰 보내드리겠습니다 ☕☕

profile
곰발이지만 개발 잘 하고싶다 🐻🐾

0개의 댓글