241010 내일배움캠프 백엔드 Java 6기 TIL : Spring-Plus주차 과제 트러블슈팅

박대현·2024년 10월 10일
0

@AuthenticationPrincipal

@AuthenticationPrincipal이 Spring Security에서 인증된 사용자 객체를 SecurityContextHolder로부터 바로 주입해주는 표준 방식

  • @Auth 어노테이션을 사용했을 때는 별도의 커스텀 방식으로 인증 객체를 주입

문제발생

  • 9번과제를 진행하면서 생긴 문제. DB에 유저 등록까지는 원활하게 작동.
  • 검증을 위해 할일을 등록하는 API를 실행시키면 다음과 같은 에러발생
    java.lang.NullPointerException: Cannot invoke "org.example.expert.domain.user.enums.UserRole.name()" because "userRole" is null

원인

  • Controller단에서 사용자 정보가 담긴 객체를 @Auth로 받고있었음
    • Spring Security를 사용한다면 @AuthenticationPrincipal로 수정해야함

차이점

1. @AuthenticationPrincipal: Spring Security의 기본 제공 방식

  • @AuthenticationPrincipal은 Spring Security가 자동으로 설정한 SecurityContext에서 Principal을 가져와 컨트롤러에 주입하는 어노테이션
  • Spring Security가 인증을 처리한 후, SecurityContextHolder에 저장된 사용자 정보(주로 Principal)를 컨트롤러의 파라미터로 쉽게 주입할 수 있도록 해줌.
  • JwtAuthenticationTokenSecurityContext에 저장되고, 이를 통해 AuthUser 객체가 자동으로 @AuthenticationPrincipal로 컨트롤러에 전달.
  • Spring Security에서 이미 표준화된 방식으로 Principal 객체를 처리하기 때문에, 추가적인 설정 없이 바로 사용 가능.

2. @Auth: 커스텀 방식

  • @Auth는 일반적으로 Spring Security가 제공하는 방식이 아니며, 커스텀한 방식으로 사용자 인증 객체를 주입할 때 사용.
  • @Auth 어노테이션을 사용하려면, Spring MVC의 HandlerMethodArgumentResolver를 통해 SecurityContextHolder에서 사용자 인증 정보를 가져와야.
  • 이 방식은 커스텀 설정이 필요하며, 올바르게 설정되지 않으면 AuthUser 객체가 주입되지 않거나, 인증 정보가 제대로 전달되지 않아 null이 발생할 수 있음.

해결

  • @Auth 어노테이션을 통해 AuthUser 객체를 주입하려면 올바른 ArgumentResolver 또는 필터 설정이 필요하지만, 그 과정에서 userRole이나 다른 필드가 제대로 주입되지 않거나 SecurityContextHolder에서 데이터를 제대로 꺼내오지 못했던 것 같다.
  • 반면 @AuthenticationPrincipal은 Spring Security에서 제공하는 기본적인 주입 방식이므로, 별도의 설정 없이도 올바르게 인증된 사용자 객체가 주입되며, 그로 인해 문제가 해결

QueryDSL 검색쿼리 만들기

문제발생

  • 특정조건을 바탕으로 검색(ex. title에 b가 들어가는 todo)했을때 원하는 결과가 나오지 않음
    • 3개가 나와야하는데 자꾸 하나의 todo가 중복해서 반환되는 결과 발생("b3"이라는 할일이 중복반환)

원인

  • Join으로 인한 중복

해결

  • distinct()로 해결하려고 시도
    • orderby와 충돌로 에러발생. 다른 방법을 찾아보면서 재시도
  • groupBy(todo.id) 이용으로 해결

0개의 댓글