Error

RestDocs @AuthenticationPrinciapl 인증 실패 Error

kkkkkdddddhhhhh 2024. 1. 16. 03:51

개인 프로젝트 REST API Server 작업이 슬슬 마무리되는 단계여서 문서화의 필요성을 느꼈다.

API 문서화는 TestCode를 중요하게 생각하기때문에 RESTDocs로 결정.

 

Spring 공식 문서를 참조해가며 글 등록API를 문서화하려다 문제가 발생했다.

 

 

mockMvc를 이용해 문서화를 진행하려했고

컨트롤러 클래스의 테스트경우 SpringBoot Container를 띄우면 테스트가 장기적으로 느려질 가능성이 매우 크기에

standAloneSetup을 이용해 RestDocs Test를 진행하려했지만,

 

@AuthenticationPrincipal을 통해 사용자 아이디를 받고 게시글의 외래키인 사용자 컬럼을 채운다.

 

위 방법으로 mockMvc를 설정해 request를 요청하니 컨트롤러 메서드에서 받기로한

UserPrincipal 인증객체를 가져오지 못하는 에러가 발생했다.

 

 

RestDocs Test가 아닌 본 컨트롤러 단위테스트에서도 이런 경험이 있기에 

@WithMockUser를 커스텀해 사용해 해결하고자 했지만

 

역시나 UserPrincipal이 모두 null로 넘어와 테스트가 진행이 안되는 상황...

 

해결

@WebMvcTest와 직접 mockMvc를 설정해 테스트의 차이에서 오는 문제점으로 파악,

둘의 차이를 찾아봤다.

@WebMvcTest:

  • 컨트롤러뿐아니라 관련 필터, 시큐리티 config까지 띄워준다.

그에비해 직접 mockMvc를 설정할 경우 시큐리티 관련 클래스들은 설정되지않고,

직접 apply()를 통해 수많은 필터 혹은 클래스를 하나하나 추가해줘야한다.

 

@AutoConfigureRestDocs를 사용해 mockMvc를 내가 setting하지 않고 RestDocs Test를 진행하기로 결정했다.

 

 

해당 annotation은 uriScheme, uriHost, UriPort를 지정해주면 restDocs를 위한 request를 설정해준다.

 

 

그 후에 perform().with()에 UserDetails 담아 전송 할 수 있는 user() 메서드가 존재한다.

UserDetails를 구현한 User를 상속받은 CustomUserPrincipal을 담아 테스트를 진행.

 

성공적으로 문서화를 진행 할 수 있게됬다!

'Error' 카테고리의 다른 글

Test were not recieved  (0) 2024.01.09
JWT Token AccessDenied 403 Error  (0) 2024.01.02
QueryDSL No Property Error  (0) 2023.12.12
테스트 환경에서 Cookie를 다루거나 검증해야할때  (0) 2023.12.08
스프링 이미지 출력 문제  (0) 2023.10.06