일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- cicd
- Vue
- 2817
- pinia
- VueDevTools
- 네트워크
- Junit5
- 이벤트루프
- GitHub
- 이것이안드로이드다
- 혼공컴운
- MySQL
- 러닝GO
- 자바스크립트
- 백준
- JavaScript
- AWS 비용 최적화 바이블
- HTTP
- WebTestClient
- 헤드퍼스트 디자인패턴
- 스프링
- Java
- Git
- 한빛미디어
- 도메인 주도 개발 시작하기
- vue-router
- 1436
- 구글 엔지니어는 이렇게 일한다
- 이것이자바다
- Today
- Total
이시안 개발 블로그
WebClient 테스트 코드 작성하기 본문
오늘은 WebClient를 이용해 서버에서 요청을 받아오는 것을 테스트 코드로 작성하자가 목표였습니다.
그전에 살짝 WebClient
WebClient는 Spring 애플리케이션에서 HTTP 요청을 할 수 있는 HTTP Client 모듈 중 하나라고 합니다.
기존에는 RestTemplate가 많이 사용되었으나 성능이 좋지 못해서 Spring 5 버전부터는 Deprecated 처리되었습니다.
두 HTTP 클라이언트의 차이는 Blocking, Non-Blocking 방식으로 구분됩니다.
RestTemplate는 Blocking 방식이라 응답이 올 때까지 병목 현상이 일어나게 되지만
WebClient는 요청을 보낸 후 응답을 기다리지 않고 바로 제어권을 넘겨준다는 큰 차이가 있습니다.
테스트 코드 작성
테스트는 간단하게 코인원의 마켓 정보를 가져오는 Public API를 사용해봤습니다.
WebClient
@Test
@DisplayName("WebClient 테스트")
void getResponse() {
// given
String BASE_URL = "https://api.coinone.co.kr/public/v2";
WebClient client = WebClient.builder()
.baseUrl(BASE_URL)
.build();
// when
client.get()
.uri("/markets/KRW")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class)
.subscribe(System.out::println);
}
저는 이 코드가 당연히 뭐라도 출력될 줄 알았습니다.
안 나오더라구요.
응답을 받기 전에 테스트 코드가 종료되어서 그런가? subscribe 메서드를 호출하면 분명히 잘 되었는데?
삽질하다가 찾아낸 것이 WebTestClient 였습니다.
사실 좀만 더 차분히 알아봤어도 금방 알아냈을 텐데...
WebTestClient
@Test
@DisplayName("WebTestClient 테스트")
void getCoinList() {
// given
String BASE_URL = "https://api.coinone.co.kr/public/v2";
WebTestClient client = WebTestClient.bindToServer()
.baseUrl(BASE_URL)
.build();
// when
client.get()
.uri("/markets/KRW")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus().isOk()
.expectHeader().contentType(MediaType.APPLICATION_JSON)
.expectBody(String.class)
.consumeWith(stringEntityExchangeResult -> log.info(stringEntityExchangeResult.toString()));
}
WebTestClient의 경우 WebClient와 달리 bindToServer() 메서드를 호출한 후에 객체를 생성할 수 있습니다.
또한 mockMvc처럼 검증 메서드들을 지원하고 있어 테스트 코드 작성이 매우 간편합니다.
보시다시피 제가 원하던 대로 테스트 코드가 성공한 모습입니다.
다음에는 응답 데이터 중 markets 배열에서 필요한 데이터들을 객체로 변환하는 것을 해보도록 하겠습니다.🤪🤪🤪
마치며
혼자 코딩하면서 처음으로 테스트 코드를 먼저 작성해본 것 같아요.
TDD는 테스트 코드 작성 -> 실패 -> 수정을 반복해서 개발해나가는 방식으로 알고 있는데
오늘의 삽질로 아주 살짝 무슨 느낌인 지 알 것 같습니다.
참고
https://www.baeldung.com/spring-5-webclient
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
'📖삽질' 카테고리의 다른 글
Vue 개발도구 Memory Leak 해결하기 (0) | 2022.10.15 |
---|---|
Github Action을 사용해보자 (1) | 2022.07.15 |
도커로 설치한 MySQL 연결 오류 해결하기 (3) | 2022.06.20 |