2.5. Client Filters

WebClient.Builder๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ํ•„ํ„ฐ(ExchangeFilterFunction)๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์š”์ฒญ์„ ์ธํ„ฐ์…‰ํŠธํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ๊ทธ ์˜ˆ์ œ๋‹ค:

Java:

WebClient client = WebClient.builder()
        .filter((request, next) -> {

            ClientRequest filtered = ClientRequest.from(request)
                    .header("foo", "bar")
                    .build();

            return next.exchange(filtered);
        })
        .build();

Kotlin:

val client = WebClient.builder()
        .filter { request, next ->

            val filtered = ClientRequest.from(request)
                    .header("foo", "bar")
                    .build()

            next.exchange(filtered)
        }
        .build()

ํ•„ํ„ฐ๋Š” ์ธ์ฆ๊ณผ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(cross-cutting concerns)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ๊ธฐ๋ณธ ์ธ์ฆ์— ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋‹ค.

Java:

import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;

WebClient client = WebClient.builder()
        .filter(basicAuthentication("user", "password"))
        .build();

Kotlin:

import org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication

val client = WebClient.builder()
        .filter(basicAuthentication("user", "password"))
        .build()

ํ•„ํ„ฐ๋Š” ๋ชจ๋“  ์š”์ฒญ์— ์ „์—ญ์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ํŠน์ • ์š”์ฒญ์— ๋Œ€ํ•œ ํ•„ํ„ฐ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, ClientRequest์— request ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ํ•„ํ„ฐ ์ฒด์ธ์—์„œ ์ด ์†์„ฑ์— ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค์Œ์€ ๊ทธ ์˜ˆ์ œ๋‹ค:

Java:

WebClient client = WebClient.builder()
        .filter((request, next) -> {
            Optional<Object> usr = request.attribute("myAttribute");
            // ...
        })
        .build();

client.get().uri("https://example.org/")
        .attribute("myAttribute", "...")
        .retrieve()
        .bodyToMono(Void.class);

    }

Kotlin:

val client = WebClient.builder()
            .filter { request, _ ->
        val usr = request.attributes()["myAttribute"];
        // ...
    }.build()

    client.get().uri("https://example.org/")
            .attribute("myAttribute", "...")
            .retrieve()
            .awaitBody<Unit>()

๊ธฐ์กด์˜ WebClient๋ฅผ ๋ณต์ œํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ํ•„ํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ ๋“ฑ๋ก๋œ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ธ๋ฑ์Šค 0๋ฒˆ ์งธ์— ์ธ์ฆ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

Java:

import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;

WebClient client = webClient.mutate()
        .filters(filterList -> {
            filterList.add(0, basicAuthentication("user", "password"));
        })
        .build();

Kotlin:

val client = webClient.mutate()
        .filters { it.add(0, basicAuthentication("user", "password")) }
        .build()

๋ชฉ์ฐจ ๊ฐ€์ด๋“œ