1. 개요
우리의 애플리케이션은 종종 HTTP 요청을 통해 파일 업로드를 처리해야 합니다. Spring 5부터 이제 이러한 요청을 반응형으로 만들 수 있습니다. 리액티브 프로그래밍
에 대한 추가 지원을 통해 적은 수의 스레드와 배압 을 사용하여 비차단 방식 으로 작업할 수 있습니다 .
이 기사에서는 비차단 반응 HTTP 클라이언트인 WebClient 를 사용하여 파일을 업로드하는 방법을 설명합니다. WebClient 는 Project Reactor 라는 반응형 프로그래밍 라이브러리의 일부입니다 . BodyInserter 를 사용하여 파일을 업로드하는 두 가지 접근 방식을 다룰 것 입니다.
2. WebClient 로 파일 업로드
WebClient 를 사용하려면 프로젝트에 spring-boot-starter-webflux 의존성을 추가해야 합니다 .
<dependency>
<groupId>org.springframework.boot</groupId>.
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2.1. 리소스에서 파일 업로드
우선 URL을 선언하고 싶습니다.
URI url = UriComponentsBuilder.fromHttpUrl(EXTERNAL_UPLOAD_URL).build().toUri();
이 예에서 PDF를 업로드한다고 가정해 보겠습니다. MediaType.APPLICATION_PDF 를 ContentType 으로 사용 합니다.
업로드 엔드포인트는 HttpStatus를 반환합니다. 하나의 결과만 예상하므로 Mono 로 래핑합니다 .
Mono<HttpStatus> httpStatusMono = webClient.post()
.uri(url)
.contentType(MediaType.APPLICATION_PDF)
.body(BodyInserters.fromResource(resource))
.exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToMono(HttpStatus.class).thenReturn(response.statusCode());
} else {
throw new ServiceException("Error uploading file");
}
});
이 메서드를 사용하는 메서드는 Mono 를 반환할 수도 있으며 실제로 결과에 액세스해야 할 때까지 계속할 수 있습니다. 준비가 되면 Mono 객체 에서 block() 메서드를 호출할 수 있습니다 .
fromResource () 메서드는 전달된 리소스 의 InputStream 을 사용하여 출력 메시지에 씁니다.
2.2. 멀티파트 리소스에서 파일 업로드
외부 업로드 엔드포인트가 Multipart 양식 데이터를 사용하는 경우 MultiPartBodyBuilder 를 사용하여 부분을 처리할 수 있습니다.
MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("file", multipartFile.getResource());
여기에서 요구 사항에 따라 다양한 부품을 추가할 수 있습니다. 맵의 값은 Object 또는 HttpEntity일 수 있습니다.
WebClient 를 호출할 때 BodyInsterter.fromMultipartData 를 사용 하고 개체를 빌드합니다.
.body(BodyInserters.fromMultipartData(builder.build()))
변경 사항을 반영하기 위해 콘텐츠 유형을 MediaType.MULTIPART_FORM_DATA 로 업데이트합니다.
전체 호출을 살펴보겠습니다.
Mono<HttpStatus> httpStatusMono = webClient.post()
.uri(url)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(builder.build()))
.exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToMono(HttpStatus.class).thenReturn(response.statusCode());
} else {
throw new ServiceException("Error uploading file");
}
});
3. 결론
이 사용방법(예제)에서는 BodyInserter 를 사용하여 WebClient 로 파일을 업로드하는 두 가지 방법을 보여 주었습니다 . 항상 그렇듯이 코드는 GitHub에서 사용할 수 있습니다 .