@AuthenticationPrincipal
이 Spring Security에서 인증된 사용자 객체를 SecurityContextHolder
로부터 바로 주입해주는 표준 방식
@Auth
어노테이션을 사용했을 때는 별도의 커스텀 방식으로 인증 객체를 주입java.lang.NullPointerException: Cannot invoke "org.example.expert.domain.user.enums.UserRole.name()" because "userRole" is null
@AuthenticationPrincipal
: Spring Security의 기본 제공 방식@AuthenticationPrincipal
은 Spring Security가 자동으로 설정한 SecurityContext
에서 Principal
을 가져와 컨트롤러에 주입하는 어노테이션SecurityContextHolder
에 저장된 사용자 정보(주로 Principal
)를 컨트롤러의 파라미터로 쉽게 주입할 수 있도록 해줌.JwtAuthenticationToken
이 SecurityContext
에 저장되고, 이를 통해 AuthUser
객체가 자동으로 @AuthenticationPrincipal
로 컨트롤러에 전달.Principal
객체를 처리하기 때문에, 추가적인 설정 없이 바로 사용 가능.@Auth
: 커스텀 방식@Auth
는 일반적으로 Spring Security가 제공하는 방식이 아니며, 커스텀한 방식으로 사용자 인증 객체를 주입할 때 사용.@Auth
어노테이션을 사용하려면, Spring MVC의 HandlerMethodArgumentResolver
를 통해 SecurityContextHolder
에서 사용자 인증 정보를 가져와야.AuthUser
객체가 주입되지 않거나, 인증 정보가 제대로 전달되지 않아 null
이 발생할 수 있음.@Auth
어노테이션을 통해 AuthUser
객체를 주입하려면 올바른 ArgumentResolver
또는 필터 설정이 필요하지만, 그 과정에서 userRole
이나 다른 필드가 제대로 주입되지 않거나 SecurityContextHolder
에서 데이터를 제대로 꺼내오지 못했던 것 같다.@AuthenticationPrincipal
은 Spring Security에서 제공하는 기본적인 주입 방식이므로, 별도의 설정 없이도 올바르게 인증된 사용자 객체가 주입되며, 그로 인해 문제가 해결