Spring Boot 3와 WebClient: 비동기식 HTTP 요청을 쉽게 구현하기

2024. 6. 11. 10:40·개발중/Spring Boot
728x90
반응형

 

 

 

WebClient

Spring Boot 3에서 WebClient는 비동기 및 동기식 HTTP 요청을 수행하기 위해 사용되는, 강력하고 유연한 HTTP 클라이언트입니다. WebClient는 Spring 5에서 처음 도입되었으며, Spring Boot 2.x 및 3.x에서도 계속해서 사용되고 있습니다. 이는 Spring의 기존 RestTemplate을 대체하는 역할을 수행하며, 비동기식 API 호출을 더욱 간편하게 구현할 수 있도록 합니다.

 

 

주요 특징

비동기 및 동기식 요청

WebClient는 비동기식과 동기식 요청을 모두 지원합니다.


반응형 프로그래밍 지원

WebClient는 Reactor 라이브러리를 기반으로 하여, 반응형 스트림을 활용한 비동기 프로그래밍을 지원합니다.


플러그인 아키텍처

요청 및 응답을 변환하고 처리하기 위한 다양한 플러그인을 쉽게 추가할 수 있습니다.

 

 

WebClient 설정 및 사용 예제

Maven 의존성 추가

먼저, pom.xml 파일에 Spring WebFlux 의존성을 추가해야 합니다:

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

 

 

WebClient 빈 설정

WebClient를 빈으로 설정하는 방법입니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient(WebClient.Builder builder) {
        return builder
                .baseUrl("https://api.example.com")
                .build();
    }
}

 

 

WebClient 사용 예제

WebClient를 사용하여 HTTP 요청을 보내는 예제입니다:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class MyService {

    private final WebClient webClient;

    @Autowired
    public MyService(WebClient webClient) {
        this.webClient = webClient;
    }

    public Mono<String> fetchSomeData() {
        return webClient.get()
                .uri("/data")
                .retrieve()
                .bodyToMono(String.class);
    }
}

 

WebClient 생성 방법

Spring Boot에서 WebClient를 생성하는 두 가지 방법을 설명합니다: create()를 사용하는 방법과 build()를 사용하는 방법입니다.

1. 단순하게 create()를 사용하는 방법

create() 메서드를 사용하면 기본 설정으로 WebClient 인스턴스를 빠르게 생성할 수 있습니다.

WebClient webClient = WebClient.create("https://api.example.com");

 

이 방법은 기본적인 HTTP 클라이언트를 필요로 할 때 유용합니다.

 

2. 옵션을 추가할 수 있는 build()를 사용하는 방법

build() 메서드를 사용하면 다양한 옵션을 추가하여 WebClient를 구성할 수 있습니다.

이를 통해 더 복잡한 설정을 적용할 수 있습니다.

WebClient webClient = WebClient.builder()
        .baseUrl("https://api.example.com")
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
        .defaultUriVariables(Collections.singletonMap("url", "https://api.example.com"))
        .build();

이 방법은 WebClient를 커스터마이징하여 사용하고자 할 때 유용합니다

 

WebClient 사용 방법

GET 요청

Mono<String> response = webClient.get()
        .uri("/endpoint")
        .retrieve()
        .bodyToMono(String.class);

 

 

POST 요청

Mono<String> response = webClient.post()
        .uri("/endpoint")
        .bodyValue(new MyRequest())
        .retrieve()
        .bodyToMono(String.class);

 

 

헤더 설정

Mono<String> response = webClient.get()
        .uri("/endpoint")
        .header("Authorization", "Bearer my-token")
        .retrieve()
        .bodyToMono(String.class);

 

 

에러 처리

Mono<String> response = webClient.get()
        .uri("/endpoint")
        .retrieve()
        .onStatus(HttpStatus::is4xxClientError, clientResponse -> {
            return Mono.error(new RuntimeException("Client error"));
        })
        .onStatus(HttpStatus::is5xxServerError, clientResponse -> {
            return Mono.error(new RuntimeException("Server error"));
        })
        .bodyToMono(String.class);

 

 

WebClient vs RestTemplate

RestTemplate는 동기식 API 호출을 지원하며, 사용이 간편하지만 확장성과 유연성이 부족합니다.
WebClient는 비동기식 API 호출을 지원하며, 반응형 프로그래밍 모델을 사용하여 높은 유연성과 확장성을 제공합니다.
WebClient는 현대적인 비동기 및 반응형 애플리케이션 개발에 적합하며, Spring Boot 3에서는 더 많은 기능과 유연성을 제공합니다. 따라서 새로운 프로젝트에서는 RestTemplate 대신 WebClient를 사용하는 것이 권장됩니다.

 

 

코드 정리

 

GitHub - soobinJung/SpringBootWebClient

Contribute to soobinJung/SpringBootWebClient development by creating an account on GitHub.

github.com

 

 

Mono와 Flux의 차이점과 활용법 - Spring WebFlux

 

Mono와 Flux의 차이점과 활용법 - Spring WebFlux

Flux와 MonoSpring WebFlux의 Flux와 Mono는 반응형 프로그래밍 모델의 두 가지 주요 구성 요소입니다. Mono Mono는 0 또는 1개의 요소를 비동기적으로 제공하는 Publisher입니다. 단일 값 또는 빈 값의

soobindeveloper8.tistory.com

 

 

 

 

728x90
반응형
저작자표시 (새창열림)

'개발중 > Spring Boot' 카테고리의 다른 글

ApplicationListener 를 이용해서 어플리케이션 기동시 에러날 경우에 대처하기.  (0) 2024.09.19
Mono와 Flux의 차이점과 활용법 - Spring WebFlux  (0) 2024.06.11
Spring Project 의 MyBatis 쿼리를 Console 에 찍는 설정 (log4j2)  (1) 2023.12.30
Spring 환경에서 프로파일 별 효율적 코드 관리 전략  (1) 2023.12.08
SocketException의 수수께끼: 첫 번째 API 호출에서만 왜 실패할까? ( retrofit java.net.socketexception connection reset )  (0) 2023.10.06
'개발중/Spring Boot' 카테고리의 다른 글
  • ApplicationListener 를 이용해서 어플리케이션 기동시 에러날 경우에 대처하기.
  • Mono와 Flux의 차이점과 활용법 - Spring WebFlux
  • Spring Project 의 MyBatis 쿼리를 Console 에 찍는 설정 (log4j2)
  • Spring 환경에서 프로파일 별 효율적 코드 관리 전략
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (948)
      • 개발중 (635)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (88)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (27)
        • 기록 (3)
        • 캐글 스터디 (3)
        • R (12)
        • MLOps (9)
      • 논문 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크 관리사 자격증
    리눅스 마스터 1급 요약
    네트워크 관리사 요약
    네트워크 관리사 학점
    springboot
    Git 저장소
    리눅스 마스터 1급 정리
    네트워크 관리사 2급
    Spring
    쿠버네티스
    알고리즘
    파이썬 알고리즘
    리눅스 마스터 1급
    리눅스 마스터 요약
    jpa
    쿠버네티스 스터디
    java
    redis
    네트워크 관리사
    리눅스 1급 요약
    네트워크 관리사 2급 실기
    리눅스 마스터
    파이썬
    git
    VUE
    스프링
    REST API
    docker
    BackendDevelopment
    네트워크 관리사 실기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
Spring Boot 3와 WebClient: 비동기식 HTTP 요청을 쉽게 구현하기
상단으로

티스토리툴바