[SpringBoot] WebClient

2026. 1. 22. 11:12·Web/Spring

WebClient란?

WebClient는 Spring WebFlux에서 제공하는 논블로킹(Non-blocking) HTTP 클라이언트

 


WebClient가 필요한 경우

외부 API 호출이 많은 서비스

결제 시스템 구현, OAuth 로그인, SMS, 알림 등등

MSA 환경

서비스간 HTTP 호출이 잦은 경우

대량 트래픽

 


WebClient 사용 방법

의존성 추가

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

Config 설정

@Slf4j
@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient() {

        // 메모리 설정
        ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
                .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(1024 * 1024 * 50))
                .build();

        // Timeout 설정
        HttpClient httpClient = HttpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
                .doOnConnected(conn -> conn
                        .addHandlerLast(new ReadTimeoutHandler(5000, TimeUnit.MILLISECONDS))
                        .addHandlerLast(new WriteTimeoutHandler(5000, TimeUnit.MILLISECONDS)))
                .headers(header -> header.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                );

        return WebClient.builder()
                .exchangeStrategies(exchangeStrategies)
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .filter(logRequest())
                .filter(logResponse())
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();
    }

    // Request Log Filter
    private static ExchangeFilterFunction logRequest() {
        return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
            log.info("Client Request : [{}, {}]", clientRequest.method(), clientRequest.url());

            return Mono.just(clientRequest);
        });
    }

    // Response Log Filter
    private static ExchangeFilterFunction logResponse() {
        return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
            log.info("Client Response : {}", clientResponse.statusCode());

            return Mono.just(clientResponse);
        });
    }
}

서비스

// 토스페이먼츠 confirm 예시

Map<String, Object> body = Map.of(
        "paymentKey", req.getPaymentKey(),
        "orderId", req.getOrderId(),
        "amount", req.getAmount()
); // body 예제


Map<String, Object> test = WebClient.builder()
        .baseUrl(BASE_URL) // ex) https://api.tosspayments.com
        .defaultHeaders(headers -> {
            headers.setBasicAuth(secretKey, "");
            headers.setContentType(MediaType.APPLICATION_JSON);
        }) // 헤더 설정
        .build()
        .post() // method 설정
        .uri(URI) // api 주소 ex)/v1/payments/confirm
        .bodyValue(body) //
        .retrieve()
        .bodyToMono(Map.class)
        .block();

이 방법을 이용하면 외부 API 호출을 통해 백엔드에서 값을 받아올 수 있다.

저작자표시 (새창열림)

'Web > Spring' 카테고리의 다른 글

[JAVA] 객체지향 프로그래밍(OOP)의 핵심 개념  (1) 2024.04.18
MVC 패턴이란?  (0) 2023.03.21
Spring Container에 대해서  (0) 2023.03.02
Spring Framework에 대해서  (0) 2023.03.02
'Web/Spring' 카테고리의 다른 글
  • [JAVA] 객체지향 프로그래밍(OOP)의 핵심 개념
  • MVC 패턴이란?
  • Spring Container에 대해서
  • Spring Framework에 대해서
DevelopJJong
DevelopJJong
기록에서 기억까지
  • DevelopJJong
    기록에서 기억까지
    DevelopJJong
  • 전체
    오늘
    어제
    • 분류 전체보기 (62)
      • 프로젝트 (1)
        • 팀 프로젝트 (0)
        • 토이프로젝트 (1)
        • 디스코드 봇 개발 (0)
      • Web (8)
        • Spring (5)
        • Server (1)
      • Knowledge (0)
        • 자료구조 (0)
        • 디자인 패턴 (0)
        • 개발 지식 (0)
      • DBMS (2)
        • Oracle (2)
        • MySQL (0)
      • 알고리즘 (25)
        • 알고리즘 기초 (1)
        • 백준 (22)
        • 프로그래머스 (2)
        • 코드업 (0)
      • Programming Language (9)
        • Java (9)
        • Python (0)
      • 이론 공부 (4)
        • 자료구조 (0)
        • 컴퓨터과학(CS) (1)
        • 이산수학 (0)
        • 네트워크 (3)
      • Tool (8)
        • IntelliJ (6)
        • Git (1)
        • etc. (1)
      • 일상 (0)
        • 맛집 리뷰 (0)
        • 소소한 이야기 (0)
      • 독서 후기 (0)
      • etc. (1)
      • TIL (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

    • 쫑이가 공부하는 공간 (광고 및 수익창출 X)
  • 인기 글

  • 태그

    네트워크 #LAN #랜선 #WAN #근거리 통신망 #원거리 통신망 #인터넷 #네트워크 공부 #프로토콜 뜻 #프로토콜
    생성자만드는법#생성자단축키#인텔리제이
    인터넷 뜻
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
DevelopJJong
[SpringBoot] WebClient
상단으로

티스토리툴바