애노테이션 생성

Seung jun Cha·2024년 7월 22일
0

1. @interface

@Schema(hidden = true)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthenticatedUserId {
}
  • @Schema(hidden = true): 이 애노테이션은 @AuthenticatedUserId 애노테이션이 Swagger 또는 OpenAPI 문서에서 숨겨지도록 합니다.

  • @Target(ElementType.PARAMETER): 애노테이션이 메서드의 매개변수(Parameter)에서만 사용될 수 있도록 지정합니다. 다른 위치(예: 클래스, 메서드 등)에는 사용할 수 없습니다.

  • @Retention(RetentionPolicy.RUNTIME): 이 애노테이션은 @AuthenticatedUserId 애노테이션이 런타임(runtime) 동안 유지되어야 함을 의미합니다. 즉, 애노테이션이 컴파일된 후에도 실행 중에 반영될 수 있습니다.

2. HandlerMethodArgumentResolver

@Component
public class UserIdArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(AuthenticatedUserId.class);
    }

    @Override
    public Object resolveArgument(
            MethodParameter parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory
    ) {
        /**
         * 사용자가 로그인하지 않거나 인증되지 않은 상태에서는 Spring Security는 Authentication 객체를 anonymousUser로 설정합니다.
         * 이 객체의 getPrincipal() 메서드는 "anonymousUser" 문자열을 반환합니다.
         */
        if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().equals("anonymousUser")) {
            throw new NotSignedInException("anonymousUser");
        }

        UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        // getPrincipal()의 반환 타입이 Object이므로, 실제 사용하는 타입인 UserDetails로 캐스팅하여 사용 (일반적으로 UserDetails로 인식하면됨)
        // 인증된 사용자에 대한 더 많은 세부 정보를 얻기 위해 캐스팅을 통해 접근
        return userDetails.getUsername();
    }
}
  • 특정 컨트롤러 메서드의 매개변수를 자동으로 처리하는 방법을 정의할 때 사용합니다.

    • supportsParameter 메서드 는 주어진 매개변수가 @AuthenticatedUserId 애노테이션을 가지고 있는지 확인합니다. 붙어있으면 true를 반환하고 resolveArgument메서드가 작동합니다.

    • resolveArgument 메서드는 매개변수를 해결하고 반환하는 로직을 구현합니다. 여기서의 return 값이 매개변수에 삽입됩니다.

3. WebMvcConfigurer

  • 만든 resolver가 작동할 수 있게 WebMvcConfigurer를 사용해서 등록합니다.

0개의 댓글