Amazon S3 운영을 위한 TransferManager 사용 - AWS SDK for Java 1.x

The AWS SDK for Java 1.x는 2024년 7월 31일부터 유지 관리 모드로 전환되었으며 2025년 12월 31일에 end-of-support에 도달할 예정입니다. 새로운 기능, 가용성 개선 사항 및 보안 업데이트를 AWS SDK for Java 2.x 계속 받으려면 로 마이그레이션하는 것이 좋습니다.

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

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 메서드를 호출합니다.

  • Amazon S3 버킷 이름

  • 키 접두사 - 생성된 객체의 이름(객체를 넣을 버킷 내 경로) 앞에 붙습니다.

  • File 객체 - 파일 경로를 생성할 상대 디렉터리를 나타냅니다.

  • List 객체 - 업로드할 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;

코드

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 키 접두사, File 객체(복사할 로컬 디렉터리를 나타냄) 및 boolean 값(하위 디렉터리를 재귀적으로 복사할지 여부를 나타내는 값으로, 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 메서드에 의해 반환되는 각각의 클래스는 단일 파일 작업인지 다중 파일 작업인지에 따라 다음 클래스 중 하나의 인스턴스를 반환합니다.

클래스 반환 메서드

복사

copy

다운로드

download

MultipleFileDownload

downloadDirectory

업로드

upload

MultipleFileUpload

uploadFileList, uploadDirectory

이들 클래스는 모두 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 사용 설명서의 객체 키