Skip to content

@WebMvcTest와_@SpringBootTest_차이

Park Sangwoo edited this page Apr 29, 2021 · 1 revision

컨트롤러 테스트를 하는 방법

컨트롤러를 테스트하는것은 유닛테스트라고 할 수 있다. 컨트롤러에 요청을 보내고 요청에 대한 응답이 잘 오는지 확인만하면 되는 테스트이다. 이때 컨트롤러를 테스트하는 방법은 @WebMvcTest를 사용하는 방법과 @SpingBootTest를 사용하는방법이 있다.

@WebMvcTest는 서버에서 컨트롤러만 테스트할 때 사용하는 애노테이션 @SpringBootTest는 클라이언트로부터 상호작용을 확인하는 통합테스트에 적합하다. (Mock객체를 사용할 수 있지만 간단한 컨트롤러 테스트에는 적합하지 않다)

근본적으로 둘의 차이는 얼마나 많은 설정과 컨텍스트를 불러오느냐에 있다. @SpringBootTest는 웹 애플리케이션 컨텍스트와 설정을 모두 불러와 실제 웹 서버에 연결을 시도한다. 이 경우에 테스트를 위해서는 RestTemplate을 이용하면 된다.

반면 @MockMvcTest는 웹애플리케이션 컨텍스트를 초기화 하지만 모든 설정을 불러오는 것이 아니라 MVC레이어와 관련된 설정만 불러온다. HTTP 요청은 mock을 이용해 가짜로 이뤄지고 실제 연결은 생성되지 않는다.


컨트롤러 테스트가 필요한가?

서비스레이어에 대해서 테스트를 통과하면 컨트롤러 테스트가 꼭 필요한가? 에 대해서 의문이 생길 수 있다. MSA 구조에서 여러 팀이 서로 다른 서비스를 관리하기 때문에 API의 변경이 치명적인 장애를 발생시킬 수 있다. 따라서 컨트롤러에 대한 테스트가 중요하다. 컨트롤러에 대한 단위 테스트가 통과되면 비즈니스 로직이 변경되거나 코드를 리팩토링 하더라도 실제 응답에 변화가 생기지 않았음을 보장할 수 있다. (만약 변화가 생겼다면 테스트는 깨지게 되고 변경사항을 다른팀에게 전달하거나 응답에 변화가 생기지 않도록 코드를 새로짜야 한다.)

Clone this wiki locally