본문 바로가기
Swimming/Think

Spring Security 적용 이후 API 계층 테스트 방법에 대한 생각

by JKROH 2023. 12. 5.
반응형

 Spring Security를 적용하고 API계층을 테스트하기가 한층 어려워졌다. Spring Security 프레임워크를 사용하기 시작하는 시점부터, API 계층은 해당 라이브러리와 아주 강하게 결합된다.

 

 Security 설정을 어느 정도 마치고 테스트에 적용하니, 내가 작성한 Configuration 파일이 적용되지 않았다. 예를 들어, 사용자의 인증 정보가 필요하지 않은 메서드에도 @WithAnonymousUser가 적용되지 않거나, disable한 csrf를 요구했다. 내가 생각한데로 진행이 되지 않아 답답했다.

 

 아마 이렇게 된 이유는 @WebMvcTest를 이용하여 단위 테스트 형태로 테스트 코드를 작성한 탓이라 생각되어 @SpringBootTest로 바꾸고 테스트를 진행해보니 내가 생각한 데로 잘 작동했다. 찾아보니 Configuration이 적용이 안되면 Spring Security의 기본 설정이 적용된다더라. 그래서 @WebMvcTest에 내가 작성한 Configuration을 어떻게 적용시킬 수 있는지 오만가지 방법을 찾아가며 시도해봤다.

 

 @Import를 통해 Configuration 클래스 파일을 읽어오는 것도 시도해보고, mockBean을 새롭게 Build하는 방법도 시도해보고, 아무튼 뭐 온갖 방법을 다 수행해보고자 노력했다. 내가 Security Configuration 파일을 너무 못짰나 생각이 들어 해당 부분에 대해서도 다른 분들이 작성하신 수많은 블로그 글들을 읽어봤다.

 

 그런데 문득 이런 생각이 들었다. '이게 단위 테스트가 맞나?'

 

 글 서두에 말했다싶이, 위 문제는 Spring Security 프레임워크를 사용하고, Security Filter Chain이 적용되면서 발생한 일이다. 그런데, Security Filter Chain이 작동하는 위치는 API 계층이 아니다. 내가 단위 테스트를 적용해 테스트하고자 하는 기능에는 Security Filter Chain을 테스트하려는 의도는 없다.

 

 반면, 통합 테스트를 진행하고 싶으면 어떨까? 당연히 Spring Security와 Security Filter Chain이 적용되어야한다. 내가 사용한 프레임워크 상에서 애플리케이션이 제 기능을 하는지를 알고 싶으니, 내가 적용한 Spring Security가 잘 작동하는지는 테스트에 포함되어야 한다.

 

 내 생각은,@WebMvcTest를 적용한 단위 테스트 클래스에는 Spring Security를 제외하고, 통합 테스트를 진행하고자 할 때는 @SpringBootTest를 사용하자는 것이다. 굳이 단위 테스트에 프레임워크의 로직을 적용해야할까? 심지어 해당 모듈과 같은 레벨에서 작동하는 로직도 아닌데?

 

 물론 이 방법이 옳지 못 한 생각일 수도 있다. Configuration을 적용하지 못해서 도피적인 발상으로 생각난 걸 수도 있다. 당연히 내 Configuration을 어떻게 적용시킬 수 있을지도 더 찾아볼 것이다.

 

 사실 오늘 생각한 주제는 어떻게 보면 더 근본에 다가가야 한다. '단위 테스트란 무엇인가?' 에 대한 근본적인 답변을 내릴 수 있다면, 지금 내 생각이 옳은지 그른지에 대해서도 훨씬 명확한 답변을 내릴 수 있을 것이다. 이 부분에 대한 고민은 프로젝트를 진행하면서 좀 더 깊이 해봐야 할 문제인 것 같다.

 

 

 

반응형

댓글