Spring은 Java 기반의 개발 프레임워크로, RESTful 웹 서비스를 손쉽게 개발할 수 있도록 다양한 기능을 제공한다. Spring에서는 RestTemplate과 WebClient 두 가지 주요 Rest Client를 제공한다.
RestTemplate은 Spring 3버전 이전에 주로 사용되었던 Rest Client이다. RestTemplate은 동기 방식으로 동작하며, 서버로 HTTP 요청을 보내고 응답을 받아오는 기능을 제공한다. RestTemplate은 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등)를 지원하며, 요청 및 응답 데이터를 객체로 변환하기 위한 메시지 컨버터(Message Converter)를 사용하여 자동으로 객체 변환을 처리한다.
WebClient는 Spring 5 버전부터 도입된 Non-Blocking I/O를 활용한 비동기 Rest Client이다. WebClient는 Reactor라는 리액티브 스트림(Reactive Streams) 라이브러리와 통합되어 작동하며, Non-Blocking 방식으로 요청을 보내고 응답을 받아오는 기능을 제공한다. 이를 통해 더 높은 성능과 확장성을 제공할 수 있다.
RestTemplate과 WebClient는 모두 RESTful 웹 서비스와의 통신을 간편하게 처리할 수 있는 Spring의 Rest Client이다. 최신 버전의 Spring에서는 WebClient를 주로 사용하며(Spring5.0 이후부터 RestTemplate는 deprecated 됨), 리액티브 프로그래밍에 익숙해진다면 WebClient의 비동기 방식을 활용할 수 있다.
@SpringBootTest 어노테이션은 Spring 애플리케이션의 전체적인 컨텍스트를 로드하여 테스트하기 위해 사용된다.
이 어노테이션은 일반적으로 통합 테스트 시나리오에서 사용되며, 애플리케이션의 모든 Bean을 로드하고 초기화한다. 따라서, 실제 애플리케이션과 유사한 환경에서 테스트를 수행할 수 있다.
@SpringBootTest 어노테이션을 사용하면 모든 구성 요소(컨트롤러, 서비스, 리포지토리 등)와 해당 구성 요소 간의 상호작용을 테스트할 수 있다.
테스트를 위해 실제 데이터베이스나 외부 서비스를 사용하고자 할 때도 유용하다. 그러나 이는 통합 테스트이므로 실행 속도가 느릴 수 있다.
@WebMvcTest 어노테이션은 Spring MVC 웹 애플리케이션의 특정 컨트롤러를 테스트하기 위해 사용된다. 이 어노테이션은 주로 단위 테스트 시나리오에서 사용되며, 특정 컨트롤러의 동작을 테스트하고자 할 때 유용하다.
@WebMvcTest 어노테이션을 사용하면 Spring MVC 관련 구성 요소만 로드되고 테스트된다. 따라서, 컨트롤러의 요청 및 응답 처리, URL 매핑, 검증 등과 관련된 테스트를 진행할 수 있다.
@WebMvcTest는 일반적으로 Spring Security와 같은 보안 관련 구성 요소를 제외하고 테스트하기 때문에, 컨트롤러 단위의 테스트에 적합하다.
@WebMvcTest는 Mock HTTP 요청을 보내고 응답을 검증하는 데 사용된다. 이를 통해 컨트롤러의 동작을 분리하여 테스트할 수 있다. 그러나 @WebMvcTest는 컨트롤러와 관련된 부분만 테스트하기 때문에, 다른 구성 요소(Service, Repository 등)의 동작은 고려하지 않는다.
@SpringBootTest는 통합 테스트 시나리오에서 전체 애플리케이션 컨텍스트를 로드하고 모든 구성 요소를 테스트하는 데 사용되며, @WebMvcTest는 Spring MVC 컨트롤러의 동작을 단위 테스트하기 위해 필요한 구성 요소만 로드한다.