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을 담아 테스트를 진행.

 

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