본문 바로가기
스프링부트

Spring WebFlux의 WebClient를 사용하여 비동기, 논블로킹 방식으로 HTTP 요청을 보내보자

by 플라퉁 2023. 10. 14.
728x90
반응형

 

 

 

안녕하세요 오늘은 WebFlux에서 WebClient를 사용해보겠습니다.

 

 

1. 의존성 추가

 

먼저, 프로젝트의 의존성 관리 파일(: pom.xml 또는 build.gradle)

Spring WebFlux WebClient 의존성을 추가해야 합니다.

 

메이븐:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

그래들:

implementation 'org.springframework.boot:spring-boot-starter-webflux'

 

 

2. WebClient 생성

 

WebClient 사용하기 위해 먼저 WebClient 인스턴스를 생성해야 합니다.

일반적으로 WebClient.builder() 메소드를 사용하여 인스턴스를 생성합니다.

 

WebClient webClient = WebClient.builder()
        .baseUrl("https://api.example.com") // 기본 URL 설정 (선택 사항)
        .build();

 

예시에서는 baseUrl 설정하였지만, 필수적으로 설정해야 하는 것은 아닙니다.

baseUrl 설정하면 요청에서 상대 URL 사용할 있습니다.

 

 

 

3. HTTP 요청 보내기

 

WebClient 사용하여 HTTP 요청을 보내려면

다음과 같이 메소드 체인을 사용하여 원하는 요청 구성을 있습니다.

 

webClient.get()
        .uri("/api/resource") // 요청 URI 설정
        .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) // 헤더 설정 (선택 사항)
        .retrieve() // 응답 받기
        .bodyToMono(Resource.class) // 응답 본문을 객체로 변환 (예시: Resource 클래스)
        .subscribe(resource -> {
            // 응답 처리 로직
            System.out.println("Received resource: " + resource);
        });

 

예시에서는 GET 메소드를 사용하여 "/api/resource" 경로로 요청을 보내고,

Content-Type 헤더를 설정하였습니다.

그리고 retrieve() 메소드를 호출하여 실제로 서버에 요청을 보냅니다.

그리고 나서 bodyToMono() 메소드를 호출하여 응답 본문(JSON) 자바 객체(Resource 클래스) 변환합니다.

최종적으로 subscribe() 메소드를 호출하여 비동기적으로 응답 결과를 처리합니다.

 

 

 

4. 에러 처리

 

WebClient 예외와 에러 처리에 대한 기능도 제공합니다.

예를 들어, onStatus() 메소드를 사용하여 특정 상태 코드에 대한 처리를 있습니다.

 

webClient.get()
        .uri("/api/resource")
        .retrieve()
        .onStatus(HttpStatus::is4xxClientError, response -> {
            // 4xx 클라이언트 에러 처리 로직
            return Mono.error(new CustomException("Client error occurred"));
        })
        .onStatus(HttpStatus::is5xxServerError, response -> {
            // 5xx 서버 에러 처리 로직
            return Mono.error(new CustomException("Server error occurred"));
        })
        .bodyToMono(Resource.class)
        .subscribe(resource -> {
            // 응답 처리 로직
            System.out.println("Received resource: " + resource);
        }, error -> {
            // 에러 처리 로직
            System.err.println("Error occurred: " + error.getMessage());
        });

 

예시에서는 onStatus() 메소드를 사용하여 4xx 5xx 상태 코드에 대한 에러 처리 로직을 구성하였습니다.

해당 상태 코드가 발생하면 Mono.error() 사용하여 원하는 예외(CustomException) 발생시킵니다.

 

 

 

5. 결론

 

Spring WebFlux WebClient 비동기, 논블로킹 방식으로 HTTP 요청을 보내는 매우 유용합니다.

WebClient 함수형 프로그래밍 스타일로 작성되어 있으며,

리액티브 스트림(Reactive Streams) 통합되어 비동기 작업을 효율적으로 처리할 있습니다.

이를 통해 빠르고 확장 가능한 애플리케이션을 개발할 있습니다.

 

참고 자료:

 

감사합니다.

 

 

 

728x90
반응형

댓글