이시안 개발 블로그

WebClient 테스트 코드 작성하기 본문

📖삽질

WebClient 테스트 코드 작성하기

ICAN 2022. 7. 7. 22:54
오늘은 WebClient를 이용해 서버에서 요청을 받아오는 것을 테스트 코드로 작성하자가 목표였습니다.

그전에 살짝 WebClient

WebClient는 Spring 애플리케이션에서 HTTP 요청을 할 수 있는 HTTP Client 모듈 중 하나라고 합니다.

기존에는 RestTemplate가 많이 사용되었으나 성능이 좋지 못해서 Spring 5 버전부터는 Deprecated 처리되었습니다.

 

두 HTTP 클라이언트의 차이는 Blocking, Non-Blocking 방식으로 구분됩니다.

RestTemplate는 Blocking 방식이라 응답이 올 때까지 병목 현상이 일어나게 되지만

WebClient는 요청을 보낸 후 응답을 기다리지 않고 바로 제어권을 넘겨준다는 큰 차이가 있습니다.

 

동기와 비동기, 그리고 블럭과 넌블럭

무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 한 번씩은 꼭 들어보고, 또 익혔음직한 내용이겠습니다. 이름하야, 동기(Synchronous)와 비

musma.github.io

 

테스트 코드 작성

테스트는 간단하게 코인원의 마켓 정보를 가져오는 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
Comments