RestTemplate

RestClient

Http 커넥션

HTTP 커넥션 사용의 주의점

예시코드

일반적인 성공시 로깅 패턴

webClient.get()
    .uri("/internal/v1/videos/{vid}/meta", vid)
    .retrieve()
    .bodyToMono(VideoMeta::class.java)
    .doOnNext { response ->
        log.info("video meta fetched - vid={}, title={}", vid, response.title)
    }
    .block()

exchangeToMono + when 패턴

webClient.get()
    .uri("/internal/v1/videos/{vid}/meta", vid)
    .exchangeToMono { response ->
        when (response.statusCode()) {
            HttpStatus.OK -> {
                response.bodyToMono(VideoMeta::class.java)
                    .doOnNext { log.info("success - vid={}", vid) }
            }
            HttpStatus.NOT_FOUND -> {
                response.releaseBody()  // 바디 안 쓰면 반드시 release
                    .then(Mono.error(VideoNotFoundException("vid=$vid")))
            }
            HttpStatus.UNAUTHORIZED -> {
                response.releaseBody()
                    .then(Mono.error(UnauthorizedException("vid=$vid")))
            }
            else -> {
                response.createException()  // WebClientResponseException으로 변환
                    .flatMap { Mono.error(it) }
            }
        }
    }
    .block()

doOnSuccess vs reponse.statusCode()직접 확인

결론부터 말하자면 doOnSuccess 는 mono가 null 을 포함한 값 또는 빈 완료 신호를 내보낼때도 모두 호출된다. 즉 200뿐만 아니라 404not found일때도 호출됨.