Transfer Manager를 버전 1에서 버전 2로 마이그레이션 AWS SDK for Java - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Transfer Manager를 버전 1에서 버전 2로 마이그레이션 AWS SDK for Java

이 마이그레이션 가이드에서는 생성자 변경 사항, 메서드 매핑 및 일반적인 작업에 대한 코드 예제를 포함하여 Transfer Manager v1과 S3 Transfer Manager v2 간의 주요 차이점을 다룹니다. 이러한 차이점을 검토한 후 기존 Transfer Manager 코드를 성공적으로 마이그레이션하여 v2에서 향상된 성능과 비동기 작업을 활용할 수 있습니다.

AWS SDK 마이그레이션 도구 정보

는 v1 Transfer Manager API의 대부분을 v2로 마이그레이션할 수 있는 자동화된 마이그레이션 도구를 AWS SDK for Java 제공합니다. 그러나 마이그레이션 도구는 여러 v1 Transfer Manager 기능을 지원하지 않습니다. 이러한 경우이 주제의 지침을 사용하여 Transfer Manager 코드를 수동으로 마이그레이션해야 합니다.

이 가이드 전체에서 마이그레이션 상태 표시기는 마이그레이션 도구가 생성자, 메서드 또는 기능을 자동으로 마이그레이션할 수 있는지 여부를 보여줍니다.

  • ✅ 지원됨: 마이그레이션 도구가이 코드를 자동으로 변환할 수 있습니다.

  • ❌ 지원되지 않음: 코드를 수동으로 마이그레이션해야 함

"지원됨"으로 표시된 항목에 대해서도 마이그레이션 결과를 검토하고 철저히 테스트합니다. Transfer Manager 마이그레이션에는 동기식 작업에서 비동기식 작업으로의 상당한 아키텍처 변경이 포함됩니다.

개요

S3 Transfer Manager v2는 Transfer Manager API에 중요한 변경 사항을 도입합니다. S3 Transfer Manager v2는 비동기 작업을 기반으로 하며 특히 AWS CRT 기반 Amazon S3 클라이언트를 사용할 때 더 나은 성능을 제공합니다.

주요 차이점

  • 패키지: com.amazonaws.services.s3.transfersoftware.amazon.awssdk.transfer.s3

  • 클래스 이름: TransferManagerS3TransferManager

  • 클라이언트 종속성: 동기식 Amazon S3 클라이언트 → 비동기식 Amazon S3 클라이언트(S3AsyncClient)

  • 아키텍처: 동기식 작업 →를 사용한 비동기식 작업 CompletableFuture

  • 성능: AWS CRT 기반 클라이언트 지원으로 향상

높은 수준의 변경 사항

속성 V1 V2
Maven 종속성 aws-java-sdk-s3 s3-transfer-manager
Package com.amazonaws.services.s3.transfer software.amazon.awssdk.transfer.s3
기본 클래스 TransferManager S3TransferManager
Amazon S3 클라이언트 AmazonS3 (동기화) S3AsyncClient (비동기식)
반환 유형 차단 작업 CompletableFuture<T>

Maven 종속성

V1 V2
<dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>>1.12.7871</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.31.682</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> </dependency> <!-- Optional: For enhanced performance with AWS CRT --> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.38.53</version> </dependency> </dependencies>

1 최신 버전. 2 최신 버전. 3최신 버전.

클라이언트 생성자 마이그레이션

지원되는 생성자(자동 마이그레이션)

V1 생성자 V2 동등 마이그레이션 상태
new TransferManager() S3TransferManager.create() ✅ 지원됨
TransferManagerBuilder. defaultTransferManager() S3TransferManager.create() ✅ 지원됨
TransferManagerBuilder. standard().build() S3TransferManager.builder().build() ✅ 지원됨
new TransferManager(AWSCredentials) S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() ✅ 지원됨
new TransferManager( AWSCredentialsProvider) S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() ✅ 지원됨

지원되지 않는 생성자(수동 마이그레이션 필요)

V1 생성자 V2 동등 마이그레이션 참고 사항
new TransferManager(AmazonS3) 수동 마이그레이션 필요 S3AsyncClient 별도로 생성
new TransferManager(AmazonS3, ExecutorService) 수동 마이그레이션 필요 실행기 생성 S3AsyncClient 및 구성
new TransferManager(AmazonS3, ExecutorService, boolean) 수동 마이그레이션 필요 shutDownThreadPools 지원되지 않는 파라미터

수동 마이그레이션 예제

V1 코드:

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); TransferManager transferManager = new TransferManager(s3Client);

V2 코드:

// Create an `S3AsyncClient` with similar configuration S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .credentialsProvider(DefaultCredentialsProvider.create()) .build(); // Provide the configured `S3AsyncClient` to the S3 transfer manager builder. S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();

클라이언트 메서드 마이그레이션

현재 마이그레이션 도구는 기본 copy, , download, upload, uploadDirectory, resumeDownloadresumeUpload 메서드downloadDirectory를 지원합니다.

코어 전송 방법

V1 메서드 V2 메서드 반환 유형 변경 마이그레이션 상태
upload(String, String, File) uploadFile(UploadFileRequest) UploadFileUpload ✅ 지원됨
upload(PutObjectRequest) upload(UploadRequest) UploadUpload ✅ 지원됨
download(String, String, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ 지원됨
download(GetObjectRequest, File) downloadFile(DownloadFileRequest) DownloadFileDownload ✅ 지원됨
copy(String, String, String, String) copy(CopyRequest) CopyCopy ✅ 지원됨
copy(CopyObjectRequest) copy(CopyRequest) CopyCopy ✅ 지원됨
uploadDirectory(String, String, File, boolean) uploadDirectory( UploadDirectoryRequest) MultipleFileUploadDirectoryUpload ✅ 지원됨
downloadDirectory(String, String, File) downloadDirectory( DownloadDirectoryRequest) MultipleFileDownloadDirectoryDownload ✅ 지원됨

재사용 가능한 전송 방법

V1 메서드 V2 메서드 마이그레이션 상태
resumeUpload(PersistableUpload) resumeUploadFile(ResumableFileUpload) ✅ 지원됨
resumeDownload(PersistableDownload) resumeDownloadFile(ResumableFileDownload) ✅ 지원됨

수명 주기 메서드

V1 메서드 V2 메서드 마이그레이션 상태
shutdownNow() close() ✅ 지원됨
shutdownNow(boolean) close() 메서드를 사용하여 수동으로 코드 조정 ❌ 지원되지 않음

지원되지 않는 V1 클라이언트 메서드

V1 메서드 V2 대체 Notes
abortMultipartUploads(String, Date) 하위 수준 Amazon S3 클라이언트 사용 ❌ 지원되지 않음
getAmazonS3Client() 참조를 별도로 저장 ❌ 지원되지 않음, v2에 getter 없음
getConfiguration() 참조를 별도로 저장 ❌ 지원되지 않음, v2에 getter 없음
uploadFileList(...) 여러 번 uploadFile() 호출 ❌ 지원되지 않음
copy TransferStateChangeListener 파라미터가 있는 메서드 TransferListener 사용 수동 마이그레이션 예제 참조
download S3ProgressListener 파라미터가 있는 메서드 TransferListener 사용 수동 마이그레이션 예제 참조

downloadDirectory 파라미터가 4개 이상인 메서드

수동 마이그레이션 예제 참조
upload ObjectMetadataProvider 파라미터가 있는 메서드 요청 시 메타데이터 설정 수동 마이그레이션 예제 참조
uploadDirectory *Provider 파라미터가 있는 메서드 요청 시 태그 설정 수동 마이그레이션 예제 참조

copyTransferStateChangeListener 파라미터가 있는 메서드

  • copy(CopyObjectRequest copyObjectRequest, AmazonS3 srcS3, TransferStateChangeListener stateChangeListener)

  • copy(CopyObjectRequest copyObjectRequest, TransferStateChangeListener stateChangeListener)

// V1 ---------------------------------------------------------------------------------------------- // Initialize source S3 client AmazonS3 s3client = AmazonS3ClientBuilder.standard() .withRegion("us-west-2") .build(); // Initialize Transfer Manager TransferManager tm = TransferManagerBuilder.standard() .withS3Client(srcS3) .build(); CopyObjectRequest copyObjectRequest = new CopyObjectRequest( "amzn-s3-demo-source-bucket", "source-key", "amzn-s3-demo-destination-bucket", "destination-key" ); TransferStateChangeListener stateChangeListener = new TransferStateChangeListener() { @Override public void transferStateChanged(Transfer transfer, TransferState state) { //Implementation of the TransferStateChangeListener } }; Copy copy = tm.copy(copyObjectRequest, srcS3, stateChangeListener); // V2 ---------------------------------------------------------------------------------------------- S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .region(Region.US_WEST_2) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build(); // Create transfer listener (equivalent to TransferStateChangeListener in v1) TransferListener transferListener = new TransferListener() { @Override public void transferInitiated(Context.TransferInitiated context) { //Implementation System.out.println("Transfer initiated"); } @Override public void bytesTransferred(Context.BytesTransferred context) { //Implementation System.out.println("Bytes transferred"); } @Override public void transferComplete(Context.TransferComplete context) { //Implementation System.out.println("Transfer completed!"); } @Override public void transferFailed(Context.TransferFailed context) { //Implementation System.out.println("Transfer failed"); } }; CopyRequest copyRequest = CopyRequest.builder() .copyObjectRequest(req -> req .sourceBucket("amzn-s3-demo-source-bucket") .sourceKey("source-key") .destinationBucket("amzn-s3-demo-destination-bucket") .destinationKey("destination-key") ) .addTransferListener(transferListener) // Configure the transferListener into the request .build(); Copy copy = transferManager.copy(copyRequest);

downloadS3ProgressListener 파라미터가 있는 메서드

  • download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener)

  • download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis)

  • download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis, boolean resumeOnRetry)

// V1 ---------------------------------------------------------------------------------------------- S3ProgressListener progressListener = new S3ProgressListener() { @Override public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) { long bytes = progressEvent.getBytesTransferred(); ProgressEventType eventType = progressEvent.getEventType(); // Use bytes and eventType as needed } @Override public void onPersistableTransfer(PersistableTransfer persistableTransfer) { } }; Download download1 = tm.download(getObjectRequest, file, progressListener); Download download2 = tm.download(getObjectRequest, file, progressListener, timeoutMillis) Download download3 = tm.download(getObjectRequest, file, progressListener, timeoutMillis, true) // V2 ---------------------------------------------------------------------------------------------- TransferListener transferListener = new TransferListener() { @Override public void transferInitiated(Context.InitializedContext context) { // Equivalent to ProgressEventType.TRANSFER_STARTED_EVENT System.out.println("Transfer initiated"); } @Override public void bytesTransferred(Context.BytesTransferred context) { // Equivalent to ProgressEventType.REQUEST_BYTE_TRANSFER_EVENT long bytes = context.bytesTransferred(); System.out.println("Bytes transferred: " + bytes); } @Override public void transferComplete(Context.TransferComplete context) { // Equivalent to ProgressEventType.TRANSFER_COMPLETED_EVENT System.out.println("Transfer completed"); } @Override public void transferFailed(Context.TransferFailed context) { // Equivalent to ProgressEventType.TRANSFER_FAILED_EVENT System.out.println("Transfer failed: " + context.exception().getMessage()); } }; DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(getObjectRequest) .destination(file.toPath()) .addTransferListener(transferListener) .build(); // For download1 FileDownload download = transferManager.downloadFile(downloadFileRequest); // For download2 CompletedFileDownload completedFileDownload = download.completionFuture() .get(timeoutMillis, TimeUnit.MILLISECONDS); // For download3, the v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1. // If a download is interrupted, you need to start a new download request.

downloadDirectory 파라미터가 4개 이상인 메서드

  • downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry)

  • downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry, KeyFilter filter)

  • downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, KeyFilter filter)

// V1 ---------------------------------------------------------------------------------------------- KeyFilter filter = new KeyFilter() { @Override public boolean shouldInclude(S3ObjectSummary objectSummary) { //Filter implementation } }; MultipleFileDownload multipleFileDownload = tm.downloadDirectory(bucketName, keyPrefix, destinationDirectory, filter); // V2 ---------------------------------------------------------------------------------------------- // The v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1. // If a download is interrupted, you need to start a new download request. DownloadFilter filter = new DownloadFilter() { @Override public boolean test(S3Object s3Object) { // Filter implementation. } }; DownloadDirectoryRequest downloadDirectoryRequest = DownloadDirectoryRequest.builder() .bucket(bucketName) .filter(filter) .listObjectsV2RequestTransformer(builder -> builder.prefix(keyPrefix)) .destination(destinationDirectory.toPath()) .build(); DirectoryDownload directoryDownload = transferManager.downloadDirectory(downloadDirectoryRequest);

uploadObjectMetadata 파라미터가 있는 메서드

  • upload(String bucketName, String key, InputStream input, ObjectMetadata objectMetadata)

// V1 ----------------------------------------------------------------------------------------------ObjectMetadata metadata = new ObjectMetadata(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("text/plain"); // System-defined metadata metadata.setContentLength(22L); // System-defined metadata metadata.addUserMetadata("myKey", "myValue"); // User-defined metadata PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, metadata); Upload upload = transferManager.upload("amzn-s3-demo-bucket", "my-key", inputStream, metadata); // V2 ---------------------------------------------------------------------------------------------- /* When you use an InputStream to upload in V2, you should specify the content length and use `RequestBody.fromInputStream()`. If you don't provide the content length, the entire stream will be buffered in memory. If you can't determine the content length, we recommend using the CRT-based S3 client. */ Map<String, String> userMetadata = new HashMap<>(); userMetadata.put("x-amz-meta-myKey", "myValue"); PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket("amzn-s3-demo-bucket1") .key("k") .contentType("text/plain") //System-defined metadata usually has separate methods in the builder. .contentLength(22L) .metadata(userMetadata) //metadata() is only for user-defined metadata. .build(); UploadRequest uploadRequest = UploadRequest.builder() .putObjectRequest(putObjectRequest) .requestBody(AsyncRequestBody.fromInputStream(stream, 22L, executor)) .build(); transferManager.upload(uploadRequest).completionFuture().join();

uploadDirectoryObjectMetadataProvider 파라미터 포함

  • uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider)

  • uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider)

  • uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider, ObjectCannedAclProvider cannedAclProvider)

// V1 ---------------------------------------------------------------------------------------------- tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider) tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider) tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider, cannedAclProvider) // V2 ---------------------------------------------------------------------------------------------- UploadDirectoryRequest request = UploadDirectoryRequest.builder() .bucket(bucketName) .s3Prefix(virtualDirectoryKeyPrefix) .source(directory.toPath()) .maxDepth(includeSubdirectories ? Integer.MAX_VALUE : 1) .uploadFileRequestTransformer(builder -> { // 1.Replace `ObjectMetadataProvider`, `ObjectTaggingProvider`, and `ObjectCannedAclProvider` with an // `UploadFileRequestTransformer` that can combine the functionality of all three *Provider implementations. // 2. Convert your v1 `ObjectMetadata` to v2 `PutObjectRequest` parameters. // 3. Convert your v1 `ObjectTagging` to v2 `Tagging`. // 4. Convert your v1 `CannedAccessControlList` to v2 `ObjectCannedACL`. }) .build(); DirectoryUpload directoryUpload = transferManager.uploadDirectory(request);

모델 객체 마이그레이션

에서는 AWS SDK for Java 2.x많은 TransferManager 모델 객체가 재설계되었으며 v1의 모델 객체에서 사용할 수 있는 여러 getter 및 setter 메서드가 더 이상 지원되지 않습니다.

v2에서는 CompletableFuture<T> 클래스를 사용하여 전송이 성공적으로 완료되거나 예외적으로 작업을 수행할 수 있습니다. 필요한 경우 join() 메서드를 사용하여 완료될 때까지 기다릴 수 있습니다.

코어 전송 객체

V1 클래스 V2 클래스 마이그레이션 상태
TransferManager S3TransferManager ✅ 지원됨
TransferManagerBuilder S3TransferManager.Builder ✅ 지원됨
Transfer Transfer ✅ 지원됨
AbortableTransfer Transfer ✅ 지원됨(별도 클래스 없음)
Copy Copy ✅ 지원됨
Download FileDownload ✅ 지원됨
Upload Upload / FileUpload ✅ 지원됨
MultipleFileDownload DirectoryDownload ✅ 지원됨
MultipleFileUpload DirectoryUpload ✅ 지원됨

지속성 객체

V1 클래스 V2 클래스 마이그레이션 상태
PersistableDownload ResumableFileDownload ✅ 지원됨
PersistableUpload ResumableFileUpload ✅ 지원됨
PersistableTransfer ResumableTransfer ✅ 지원됨
PauseResult<T> 직접 재개 가능한 객체 ❌ 지원되지 않음

결과 객체

V1 클래스 V2 클래스 마이그레이션 상태
CopyResult CompletedCopy ✅ 지원됨
UploadResult CompletedUpload ✅ 지원됨

구성 객체

V1 클래스 V2 클래스 마이그레이션 상태
TransferManagerConfiguration MultipartConfiguration (Amazon S3 클라이언트) ✅ 지원됨
TransferProgress TransferProgress + TransferProgressSnapshot ✅ 지원됨
KeyFilter DownloadFilter ✅ 지원됨

지원되지 않는 객체

V1 클래스 V2 대체 마이그레이션 상태
PauseStatus 지원되지 않음 ❌ 지원되지 않음
UploadContext 지원되지 않음 ❌ 지원되지 않음
ObjectCannedAclProvider PutObjectRequest.builder().acl() ❌ 지원되지 않음
ObjectMetadataProvider PutObjectRequest.builder().metadata() ❌ 지원되지 않음
ObjectTaggingProvider PutObjectRequest.builder().tagging() ❌ 지원되지 않음
PresignedUrlDownload 지원되지 않음 ❌ 지원되지 않음

TransferManagerBuilder 구성 마이그레이션

구성 변경

v2 전송 관리자에 대해 설정해야 하는 구성 변경은 사용하는 S3 클라이언트에 따라 다릅니다. AWS CRT 기반 S3 클라이언트 또는 표준 Java 기반 S3 비동기 클라이언트 중에서 선택할 수 있습니다. 차이점에 대한 자세한 내용은 의 S3 클라이언트 AWS SDK for Java 2.x 주제를 참조하세요.

Use the AWS CRT-based S3 client
설정 v1 v2 - AWS CRT 기반 S3 클라이언트를 사용한 Transfer Manager

(빌더 구하기)

TransferManagerBuilder tmBuilder = TransferManagerBuilder.standard();
S3TransferManager.Builder tmBuilder = S3TransferManager.builder();

S3 클라이언트

tmBuilder.withS3Client(...); tmBuilder.setS3Client(...);
tmBuilder.s3Client(...);

실행자

tmBuilder.withExecutorFactory(...); tmBuilder.setExecutorFactory(...);
tmBuilder.executor(...);

스레드 풀 종료

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
지원하지 않음. 가 닫히면 제공된 실행S3TransferManager기가 종료되지 않습니다.

최소 업로드 파트 크기

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). minimumPartSizeInBytes(...).build(); tmBuilder.s3Client(s3);

멀티파트 업로드 임계값

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). thresholdInBytes(...).build(); tmBuilder.s3Client(s3);

최소 복사 파트 크기

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). minimumPartSizeInBytes(...).build(); tmBuilder.s3Client(s3);

멀티파트 복사 임계값

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.crtBuilder(). thresholdInBytes(...).build(); tmBuilder.s3Client(s3);

병렬 다운로드 비활성화

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
멀티파트가 비활성화된 표준 Java 기반 S3 클라이언트(기본값)를 전송 관리자에게 전달하여 병렬 다운로드를 비활성화합니다.
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

항상 멀티파트 md5를 계산하세요.

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
지원하지 않음.
Use Java-based S3 async client
설정 v1 v2 - Java 기반 S3 비동기 클라이언트를 사용하는 Transfer Manager

(빌더 구하기)

TransferManagerBuilder tmBuilder = TransferManagerBuilder.standard();
S3TransferManager.Builder tmBuilder = S3TransferManager.builder();

S3 클라이언트

tmBuilder.withS3Client(...); tmBuilder.setS3Client(...);
tmBuilder.s3Client(...);

실행자

tmBuilder.withExecutorFactory(...); tmBuilder.setExecutorFactory(...);
tmBuilder.executor(...);

스레드 풀 종료

tmBuilder.withShutDownThreadPools(...); tmBuilder.setShutdownThreadPools(...);
지원하지 않음. 가 닫히면 제공된 실행S3TransferManager기가 종료되지 않습니다.

최소 업로드 파트 크기

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.minimumPartSizeInBytes(...)).build(); tmBuilder.s3Client(s3);

멀티파트 업로드 임계값

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.thresholdInBytes(...)).build(); tmBuilder.s3Client(s3);

최소 복사 파트 크기

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.minimumPartSizeInBytes(...)).build(); tmBuilder.s3Client(s3);

멀티파트 복사 임계값

tmBuilder.withMinimumUploadPartSize(...); tmBuilder.setMinimumUploadPartSize(...);
S3AsyncClient s3 = S3AsyncClient.builder() .multipartConfiguration(cfg -> cfg.thresholdInBytes(...)).build(); tmBuilder.s3Client(s3);

병렬 다운로드 비활성화

tmBuilder.withDisableParallelDownloads(...); tmBuilder.setDisableParallelDownloads(...);
멀티파트가 비활성화된 표준 Java 기반 S3 클라이언트(기본값)를 전송 관리자에게 전달하여 병렬 다운로드를 비활성화합니다.
S3AsyncClient s3 = S3AsyncClient.builder().build(); tmBuilder.s3Client(s3);

항상 멀티파트 md5를 계산하세요.

tmBuilder.withAlwaysCalculateMultipartMd5(...); tmBuilder.setAlwaysCalculateMultipartMd5(...);
지원하지 않음.

동작 변경 사항

비동기식 운영

V1(차단):

Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file); upload.waitForCompletion(); // Blocks until complete

V2(비동기식):

FileUpload upload = transferManager.uploadFile(UploadFileRequest.builder() .putObjectRequest(PutObjectRequest.builder() .bucket("amzn-s3-demo-bucket") .key("key") .build()) .source(file) .build()); CompletedFileUpload result = upload.completionFuture().join(); // Blocks until complete // Or handle asynchronously: upload.completionFuture().thenAccept(result -> { System.out.println("Upload completed: " + result.response().eTag()); });

오류 처리

V1: 하위 요청이 실패하면 디렉터리 전송이 완전히 실패합니다.

V2: 일부 하위 요청이 실패하더라도 디렉터리 전송이 성공적으로 완료되었습니다. 오류를 명시적으로 확인합니다.

DirectoryUpload directoryUpload = transferManager.uploadDirectory(request); CompletedDirectoryUpload result = directoryUpload.completionFuture().join(); // Check for failed transfers if (!result.failedTransfers().isEmpty()) { System.out.println("Some uploads failed:"); result.failedTransfers().forEach(failed -> System.out.println("Failed: " + failed.exception().getMessage())); }

바이트 범위 페치를 통한 병렬 다운로드

v2 SDK에서 자동 병렬 전송 기능이 활성화되면 S3 Transfer Manager는 바이트 범위 가져오기를 사용하여 객체의 특정 부분을 병렬로 검색합니다(멀티파트 다운로드). v2를 사용하여 객체를 다운로드하는 방법은 객체가 처음 업로드된 방식에 따라 달라지지 않습니다. 모든 다운로드는 높은 처리량과 동시성의 이점을 누릴 수 있습니다.

반대로 v1의 Transfer Manager에서는 객체가 원래 업로드된 방식이 중요합니다. v1 Transfer Manager는 파트가 업로드된 것과 동일한 방식으로 객체의 파트를 검색합니다. 객체가 원래 단일 객체로 업로드된 경우 v1 Transfer Manager는 하위 요청을 사용하여 다운로드 프로세스를 가속화할 수 없습니다.