프로젝트에서 각자 맡은 부분의 test 코드를 작성해야하는데 스프링 시큐리티 @AuthenticationPrincipal 테스트해야 하는데 기존의 Fixtures 제작만으로 해결이 되지 않아서 작성하게 되었다
@MockBean VS @Autowired@MockBean
테스트 대상 클래스에 대한 가짜(mock) 빈을 주입하는 데 사용
외부 의존성을 실제로 호출하지 않고 대신 모의(mock) 객체를 사용하여 테스트를 수행
단위 테스트에 적합
@Autowired
실제 빈 인스턴스를 주입받게 되므로 애플리케이션 컨텍스트에서 관리되는 빈의 실제 동작을 테스트
테스트 시 실제 데이터베이스, 서비스, 컴포넌트 등을 사용하게 될 수 있음
통합 테스트에 적합
User, UserDetails 차이)UserDetails 인터페이스
UserDetails 인터페이스를 구현한 클래스
User 클래스
User 클래스는 Spring Security에서 제공하는 **UserDetails**의 구현 클래스 중 하나User 클래스는 사용자의 기본 정보를 담는데, 주로 사용자의 식별 정보(username), 암호화된 비밀번호, 권한 목록을 포함⚠️ 적용할 프로젝트 상황
ReviewController
@ApiOperation(value = "리뷰 조회 API")
@GetMapping("{bookId}")
public ResponseEntity<ResultResponse> getReviewByUserNameBookId(
@AuthenticationPrincipal UserDetail userDetail,
@PathVariable Long bookId
){
User user = userService.findUserByUsername(userDetail.getUsername());
ReviewRes reviewRes = reviewService.findReviewByUserNameIdBookId(user, bookId);
return ResponseEntity.ok(ResultResponse.of(GET_REVIEW_SUCCESS, reviewRes));
}
→ 파라미터에 @AuthenticationPrincipal 이 부착되어 있어서 현재 세션에 담긴 사용자 정보를 얻을 수 있음
@WithMockUser
→ Controller 테스트 시에 Spring Security에 설정한 인증 정보를 제공해 주는 역할
→ 사용자 인증 정보를 담은 Authentication을 UsernamePasswordAuthenticationToken으로 넣어주고, Principal은 User 객체에 넣어 SecurityContext에 보관
⚠️ 커스텀된 Authentication(주체) 인증 정보는 사용 ❌