WebClient๋ Spring 5์์ ๋์ ๋ ๋น๋๊ธฐ์ ์ด๊ณ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ HTTP ํด๋ผ์ด์ธํธ์ ๋๋ค. RestTemplate์ ํ๋์ ์ธ ๋์์ผ๋ก, ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์ง์ํฉ๋๋ค.
๋น๋๊ธฐ ๋ฐ ๋๊ธฐ ์์ ๋ชจ๋ ์ง์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ API
์คํธ๋ฆฌ๋ฐ ์ง์
ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ
pom.xml์ ๋ค์ ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
return WebClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
}
Mono<User> userMono = webClient.get()
.uri("/users/{id}", 1)
.retrieve()
.bodyToMono(User.class);
userMono.subscribe(user -> System.out.println(user.getName()));
User newUser = new User("John Doe", "john@example.com");
Mono<User> createdUserMono = webClient.post()
.uri("/users")
.body(Mono.just(newUser), User.class)
.retrieve()
.bodyToMono(User.class);
createdUserMono.subscribe(user -> System.out.println("Created user ID: " + user.getId()));
User updatedUser = new User("John Updated", "john@example.com");
Mono<Void> updateMono = webClient.put()
.uri("/users/{id}", 1)
.body(Mono.just(updatedUser), User.class)
.retrieve()
.bodyToMono(Void.class);
updateMono.subscribe(null, error -> System.err.println("Error updating user: " + error.getMessage()));
Mono<Void> deleteMono = webClient.delete()
.uri("/users/{id}", 1)
.retrieve()
.bodyToMono(Void.class);
deleteMono.subscribe(null, error -> System.err.println("Error deleting user: " + error.getMessage()));
Mono<User> userMono = webClient.get()
.uri("/users/{id}", 1)
.header("Authorization", "Bearer " + token)
.retrieve()
.bodyToMono(User.class);
Mono<User> userMono = webClient.get()
.uri("/users/{id}", 1)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response ->
Mono.error(new RuntimeException("API not found")))
.onStatus(HttpStatus::is5xxServerError, response ->
Mono.error(new RuntimeException("Server error")))
.bodyToMono(User.class);
userMono.subscribe(
user -> System.out.println(user.getName()),
error -> System.err.println("Error: " + error.getMessage())
);
Flux<User> userFlux = webClient.get()
.uri("/users")
.retrieve()
.bodyToFlux(User.class);
userFlux.subscribe(
user -> System.out.println(user.getName()),
error -> System.err.println("Error: " + error.getMessage()),
() -> System.out.println("Completed")
);
Mono<User> userMono = webClient.get()
.uri("/users/{id}", 1)
.retrieve()
.bodyToMono(User.class)
.timeout(Duration.ofSeconds(5));
๋น๋๊ธฐ ๋ฐ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ํจ์จ์ ์ธ ๋ฆฌ์์ค ์ฌ์ฉ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ๋ก ๊ฐ๋
์ฑ ํฅ์
์คํธ๋ฆฌ๋ฐ ์ง์์ผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ๋ฆฌ
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ๊ณผ์ ํตํฉ์ด ์ฉ์ด
๋๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์ต์ํ ๊ฐ๋ฐ์์๊ฒ ๋ ์ง๊ด์
๋ ๊ฑฐ์ ์์คํ
๊ณผ์ ํตํฉ์ด ์ฌ์
GitHub API๋ฅผ ์ฌ์ฉํ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ:
WebClient client = WebClient.create("https://api.github.com");
Mono<GitHubUser> userMono = client.get()
.uri("/users/{username}", "octocat")
.retrieve()
.bodyToMono(GitHubUser.class);
userMono.subscribe(
user -> System.out.println("Name: " + user.getName() + ", Followers: " + user.getFollowers()),
error -> System.err.println("Error: " + error.getMessage())
);
์ปค๋ฅ์ ํ๋ง: HttpClient ์ค์ ์ ํตํด ์ปค๋ฅ์ ํ ์ฌ์ฉ
์ฌ์๋ ๋ฉ์ปค๋์ฆ ๊ตฌํ: Retry ์ฐ์ฐ์ ์ฌ์ฉ
์บ์ฑ: Spring์ ์บ์ฑ ์ถ์ํ ํ์ฉ
์์ ๋ฅผ ํ์ฉํด์ TIL์ ์ ์์ฑํด์ฃผ์ จ๋ค์ ๐๐ป