The AWS SDK for Java 1.x는 2024년 7월 31일부터 유지 관리 모드로 전환되었으며 2025년 12월 31일에 end-of-support
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon S3 운영을 위한 TransferManager 사용
AWS SDK for Java TransferManager 클래스를 사용하여 로컬 환경에서 Amazon S3로 파일을 안정적으로 전송하고 한 S3 위치에서 다른 위치로 객체를 복사할 수 있습니다. TransferManager
는 전송 진행 상황을 가져오고 업로드 및 다운로드를 일시 중지 또는 재개할 수 있습니다.
참고
모범 사례
Amazon S3 버킷에서 AbortIncompleteMultipartUpload 수명 주기 규칙을 활성화하는 것이 좋습니다.
이 규칙은 시작된 후 지정된 일수 내에 완료되지 않은 멀티파트 업로드를 중단하도록 Amazon S3에 지시합니다. 설정된 시간 제한을 초과하면 Amazon S3가 업로드를 중단한 후 완료되지 않은 업로드 데이터를 삭제합니다.
자세한 내용은 Amazon S3 사용 설명서의 버전 관리가 포함된 버킷의 수명 주기 구성을 참조하세요.
참고
이 코드 예제에서는 사용자가 AWS SDK for Java 사용의 내용을 이해하고 개발을 위한 AWS 자격 증명 및 리전 설정의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.
파일 및 디렉터리 업로드
TransferManager는 이전에 생성한 모든 Amazon S3 버킷에 파일, 파일 목록 및 디렉터리를 업로드할 수 있습니다.
단일 파일 업로드
TransferManager의 upload
메서드를 호출하여 Amazon S3 버킷 이름, 키(객체) 이름, 업로드할 파일을 나타내는 표준 Java File
가져오기
import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.MultipleFileUpload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; import java.io.File; import java.util.ArrayList; import java.util.Arrays;
코드
File f = new File(file_path); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Upload xfer = xfer_mgr.upload(bucket_name, key_name, f); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
upload
메서드는 (값을) 즉시 반환하며, 전송 상태를 확인하거나 완료될 때까지 대기하는 데 사용할 Upload
객체를 제공합니다.
TransferManager의 shutdownNow
메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 waitForCompletion
를 사용하는 방법에 대한 자세한 내용은 전송이 완료될 때까지 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 전송 상태 및 진행 상황 가져오기를 참조하십시오.
GitHub의 전체 예제
파일 목록 업로드
여러 파일을 한 번에 업로드하려면 다음을 지정하여 TransferManager uploadFileList
메서드를 호출합니다.
가져오기
import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.MultipleFileUpload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; import java.io.File; import java.util.ArrayList; import java.util.Arrays;
코드
ArrayList<File> files = new ArrayList<File>(); for (String path : file_paths) { files.add(new File(path)); } TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { MultipleFileUpload xfer = xfer_mgr.uploadFileList(bucket_name, key_prefix, new File("."), files); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
TransferManager의 shutdownNow
메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 waitForCompletion
를 사용하는 방법에 대한 자세한 내용은 전송이 완료될 때까지 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 전송 상태 및 진행 상황 가져오기를 참조하십시오.
uploadFileList
에서 반환한 MultipleFileUpload 객체를 사용하여 전송 상태 또는 진행 상황을 쿼리할 수 있습니다. 자세한 내용은 현재 전송 진행 상황 폴링 및 ProgressListener를 사용하여 전송 진행 상황 가져오기를 참조하십시오.
또한 MultipleFileUpload
's getSubTransfers
메서드를 사용하여 전송될 각 파일의 Upload
객체를 가져올 수도 있습니다. 자세한 내용은 하위 전송 진행 상황 가져오기를 참조하십시오.
GitHub의 전체 예제
디렉터리 업로드
TransferManager의 uploadDirectory
메서드와 하위 디렉터리의 파일을 재귀적으로 복사하는 옵션을 사용하여 전체 파일 디렉터리를 업로드할 수 있습니다. Amazon S3 버킷 이름, S3 키 접두사, Fileboolean
값(하위 디렉터리를 재귀적으로 복사할지 여부를 나타내는 값으로, true 또는 false)을 제공합니다.
가져오기
import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.MultipleFileUpload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; import java.io.File; import java.util.ArrayList; import java.util.Arrays;
코드
TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucket_name, key_prefix, new File(dir_path), recursive); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
TransferManager의 shutdownNow
메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 waitForCompletion
를 사용하는 방법에 대한 자세한 내용은 전송이 완료될 때까지 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 전송 상태 및 진행 상황 가져오기를 참조하십시오.
uploadFileList
에서 반환한 MultipleFileUpload 객체를 사용하여 전송 상태 또는 진행 상황을 쿼리할 수 있습니다. 자세한 내용은 현재 전송 진행 상황 폴링 및 ProgressListener를 사용하여 전송 진행 상황 가져오기를 참조하십시오.
또한 MultipleFileUpload
's getSubTransfers
메서드를 사용하여 전송될 각 파일의 Upload
객체를 가져올 수도 있습니다. 자세한 내용은 하위 전송 진행 상황 가져오기를 참조하십시오.
GitHub의 전체 예제
파일 또는 디렉터리 다운로드
TransferManager 클래스를 사용하여 Amazon S3에서 단일 파일(Amazon S3 객체) 또는 디렉터리(Amazon S3 버킷 이름 뒤에 객체 접두사 지정)를 다운로드할 수 있습니다.
단일 파일 다운로드
TransferManager의 download
메서드를 사용하여 다운로드할 객체를 포함하는 Amazon S3 버킷 이름, 키(객체) 이름 및 로컬 시스템에 생성할 파일을 나타내는 File
가져오기
import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.Download; import com.amazonaws.services.s3.transfer.MultipleFileDownload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import java.io.File;
코드
File f = new File(file_path); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Download xfer = xfer_mgr.download(bucket_name, key_name, f); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
TransferManager의 shutdownNow
메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 waitForCompletion
를 사용하는 방법에 대한 자세한 내용은 전송이 완료될 때까지 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 전송 상태 및 진행 상황 가져오기를 참조하십시오.
GitHub의 전체 예제
디렉터리 다운로드
Amazon S3에서 공통 키 접두사(파일 시스템의 디렉터리와 유사)를 공유하는 파일 세트를 다운로드하려면 TransferManager downloadDirectory
메서드를 사용합니다. 이 메서드는 다운로드할 객체를 포함하는 Amazon S3 버킷 이름, 모든 객체에서 공유하는 객체 접두사, 그리고 파일을 로컬 시스템으로 다운로드할 디렉터리를 나타내는 File
가져오기
import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.Download; import com.amazonaws.services.s3.transfer.MultipleFileDownload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import java.io.File;
코드
TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { MultipleFileDownload xfer = xfer_mgr.downloadDirectory( bucket_name, key_prefix, new File(dir_path)); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
TransferManager의 shutdownNow
메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 waitForCompletion
를 사용하는 방법에 대한 자세한 내용은 전송이 완료될 때까지 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 전송 상태 및 진행 상황 가져오기를 참조하십시오.
GitHub의 전체 예제
객체 복사
한 S3 버킷에서 다른 버킷으로 객체를 복사하려면 TransferManager copy
메서드를 사용합니다.
가져오기
import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.Copy; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
코드
System.out.println("Copying s3 object: " + from_key); System.out.println(" from bucket: " + from_bucket); System.out.println(" to s3 object: " + to_key); System.out.println(" in bucket: " + to_bucket); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Copy xfer = xfer_mgr.copy(from_bucket, from_key, to_bucket, to_key); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
GitHub의 전체 예제
전송 완료 대기
전송이 완료될 때까지 애플리케이션(또는 스레드)을 차단할 수 있는 경우 Transfer 인터페이스의 waitForCompletion
메서드를 사용하여 전송이 완료되거나 예외가 발생할 때까지 차단할 수 있습니다.
try { xfer.waitForCompletion(); } catch (AmazonServiceException e) { System.err.println("Amazon service error: " + e.getMessage()); System.exit(1); } catch (AmazonClientException e) { System.err.println("Amazon client error: " + e.getMessage()); System.exit(1); } catch (InterruptedException e) { System.err.println("Transfer interrupted: " + e.getMessage()); System.exit(1); }
waitForCompletion
를 호출하기 전에 이벤트를 폴링하거나, 별도의 스레드에서 폴링 메커니즘을 구현하거나, ProgressListener를 사용하여 비동기적으로 진행 상황 업데이트를 수신하면 전송 진행 상황을 확인할 수 있습니다.
GitHub의 전체 예제
전송 상태 및 진행 상황 가져오기
TransferManager upload*
, download*
및 copy
메서드에 의해 반환되는 각각의 클래스는 단일 파일 작업인지 다중 파일 작업인지에 따라 다음 클래스 중 하나의 인스턴스를 반환합니다.
클래스 | 반환 메서드 |
---|---|
|
|
|
|
|
|
|
|
|
이들 클래스는 모두 Transfer 인터페이스를 구현합니다. Transfer
는 전송 진행 상황을 가져오거나, 전송을 일시 중지 또는 재개하거나, 전송의 현재 또는 최종 상태를 가져올 수 있는 유용한 메서드를 제공합니다.
현재 전송 진행 상황 폴링
이 루프는 전송 진행 상황을 출력하며, 실행 중에 현재 진행 상황을 검사하고, 완료되었을 때 최종 상태를 출력합니다.
가져오기
import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.event.ProgressEvent; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.transfer.*; import com.amazonaws.services.s3.transfer.Transfer.TransferState; import java.io.File; import java.util.ArrayList; import java.util.Collection;
코드
// print the transfer's human-readable description System.out.println(xfer.getDescription()); // print an empty progress bar... printProgressBar(0.0); // update the progress bar while the xfer is ongoing. do { try { Thread.sleep(100); } catch (InterruptedException e) { return; } // Note: so_far and total aren't used, they're just for // documentation purposes. TransferProgress progress = xfer.getProgress(); long so_far = progress.getBytesTransferred(); long total = progress.getTotalBytesToTransfer(); double pct = progress.getPercentTransferred(); eraseProgressBar(); printProgressBar(pct); } while (xfer.isDone() == false); // print the final state of the transfer. TransferState xfer_state = xfer.getState(); System.out.println(": " + xfer_state);
GitHub의 전체 예제
ProgressListener를 사용하여 전송 진행 상황 가져오기
전송 인터페이스의 addProgressListener
메서드를 사용하여 ProgressListener를 모든 전송에 연결할 수 있습니다.
ProgressListener에는 progressChanged
라는 메서드 하나만 필요하며, 이 메서드는 ProgressEvent 객체를 사용합니다. 이 객체를 사용하면 getBytes
메서드를 호출하여 총 작업 바이트 수와 getBytesTransferred
를 호출하여 지금까지 전송된 바이트 수를 가져올 수 있습니다.
가져오기
import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.event.ProgressEvent; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.transfer.*; import com.amazonaws.services.s3.transfer.Transfer.TransferState; import java.io.File; import java.util.ArrayList; import java.util.Collection;
코드
File f = new File(file_path); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Upload u = xfer_mgr.upload(bucket_name, key_name, f); // print an empty progress bar... printProgressBar(0.0); u.addProgressListener(new ProgressListener() { public void progressChanged(ProgressEvent e) { double pct = e.getBytesTransferred() * 100.0 / e.getBytes(); eraseProgressBar(); printProgressBar(pct); } }); // block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(u); // print the final state of the transfer. TransferState xfer_state = u.getState(); System.out.println(": " + xfer_state); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();
GitHub의 전체 예제
하위 전송 진행 상황 가져오기
MultipleFileUpload 클래스는 getSubTransfers
메서드를 호출하여 하위 전송에 대한 정보를 반환할 수 있습니다. 각 하위 전송의 개별 전송 상태 및 진행 상황을 제공하는 수정 불가능한 업로드 컬렉션
가져오기
import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.event.ProgressEvent; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.transfer.*; import com.amazonaws.services.s3.transfer.Transfer.TransferState; import java.io.File; import java.util.ArrayList; import java.util.Collection;
코드
Collection<? extends Upload> sub_xfers = new ArrayList<Upload>(); sub_xfers = multi_upload.getSubTransfers(); do { System.out.println("\nSubtransfer progress:\n"); for (Upload u : sub_xfers) { System.out.println(" " + u.getDescription()); if (u.isDone()) { TransferState xfer_state = u.getState(); System.out.println(" " + xfer_state); } else { TransferProgress progress = u.getProgress(); double pct = progress.getPercentTransferred(); printProgressBar(pct); System.out.println(); } } // wait a bit before the next update. try { Thread.sleep(200); } catch (InterruptedException e) { return; } } while (multi_upload.isDone() == false); // print the final state of the transfer. TransferState xfer_state = multi_upload.getState(); System.out.println("\nMultipleFileUpload " + xfer_state);
GitHub의 전체 예제
추가 정보
-
Amazon Simple Storage Service 사용 설명서의 객체 키