

# 버전 관리를 사용하는 버킷의 객체 목록
<a name="list-obj-version-enabled-bucket"></a>

이 섹션에서는 버전 관리를 사용하는 버킷의 객체 버전을 나열하는 예제를 제공합니다. Amazon S3에서는 객체 버전 정보를 버킷에 연결된 *versions* 하위 리소스에 저장합니다. 자세한 내용은 [범용 버킷 구성 옵션](UsingBucket.md#bucket-config-options-intro) 섹션을 참조하세요. 버전 관리가 활성화된 버킷의 객체를 나열하려면 `ListBucketVersions` 권한이 필요합니다.

## S3 콘솔 사용
<a name="view-object-versions"></a>

다음 단계에 따라 Amazon S3 콘솔을 사용하여 객체의 여러 버전을 확인합니다.

**객체의 여러 버전 보기**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷(Buckets)** 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

1. 버킷에 있는 객체 버전 목록을 확인하려면 **버전 표시** 스위치를 선택합니다.

   각 객체 버전에 대해 콘솔에 고유한 버전 ID, 객체 버전이 생성된 날짜/시간 및 기타 속성이 표시됩니다. (버전 관리 상태로 설정하기 전에 버킷에 저장된 객체의 버전 ID는 **null**이 됩니다.)

   해당 버전이 없는 객체를 나열하려면 **버전 나열(List versions)** 스위치를 선택합니다.

또한, 콘솔의 객체 개요 패널에서도 객체 버전을 보고, 다운로드하며, 삭제할 수 있습니다. 자세한 내용은 [Amazon S3 콘솔에서 객체 속성 보기](view-object-properties.md) 섹션을 참조하세요.

**참고**  
 300개 버전 이전의 객체 버전에 액세스하려면 AWS CLI 또는 객체의 URL을 사용해야 합니다.

**중요**  
객체는 최신 버전으로 삭제한 경우에만 삭제를 취소할 수 있습니다. 삭제했던 객체의 이전 버전은 삭제를 취소할 수 없습니다. 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

## AWS SDK 사용
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

이 섹션의 예제에서는 버전 관리를 사용하는 버킷에서 객체 목록을 가져오는 방법을 보여줍니다. 더 낮은 개수를 지정했더라도 각 요청에서는 최대 1,000개의 버전을 반환합니다. 버킷에 이 제한보다 더 많은 버전이 포함되어 있는 경우 일련의 요청을 보내 모든 버전 목록을 가져옵니다. "페이지"에 표시되는 이러한 결과 반환 프로세스를 *페이지 매김*이라고 합니다.

페이지 매김 작동 방식을 설명하기 위해 예제에서는 각 응답을 두 가지 객체 버전으로 제한합니다. 결과의 첫 페이지를 가져온 후 각 예제에서는 버전 목록이 잘렸는지 여부를 확인합니다. 잘린 경우 계속해서 모든 버전을 가져올 때까지 페이지를 가져옵니다.

**참고**  
다음 예제 역시 버전 관리를 사용하지 않는 버킷이나 개별 버전이 없는 객체를 사용합니다. 이러한 경우 Amazon S3는 `null`의 버전 ID를 사용하여 객체 목록을 반환합니다.

 다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ Java ]

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 AWS SDK for Java 개발자 안내서의 [시작하기](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) 섹션을 참조하세요.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

코드 예제 설정 및 실행에 대한 자세한 내용은 *AWS SDK for .NET 개발자 안내서*의 [AWS SDK for .NET 시작하기](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)를 참조하세요.

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## REST API 사용
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example - 버킷의 모든 객체 버전 나열**  
버킷에 있는 전체 객체의 버전을 모두 나열하려면 `versions` 요청에 `GET Bucket` 하위 리소스를 사용합니다. Amazon S3에서는 최대 1,000개의 객체를 검색할 수 있으며, 각 객체 버전은 각각 하나의 객체로 온전히 취급됩니다. 따라서 버킷에 두 개의 키(예: `photo.gif` 및 `picture.jpg`)가 포함되어 있고 첫 번째 키에 990개의 버전이, 두 번째 키에 400개의 버전이 있는 경우, 단일 요청으로는 `photo.gif`의 990개 버전 모드를 가져오고 `picture.jpg`의 최신 버전 10개만 가져오게 됩니다.  
Amazon S3에서는 객체 버전을 객체가 저장된 순서대로 가장 최근에 저장된 것을 먼저 반환합니다.  
`GET Bucket` 요청에 `versions` 하위 리소스를 포함합니다.  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example - 키의 전체 버전 검색**  
 객체 버전의 하위 집합을 가져오려면 `GET Bucket`에 요청 파라미터를 사용합니다. [자세한 내용은 GET Bucket 단원을 참조하세요.](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)  

1. `prefix` 파라미터를 검색하려는 객체의 키로 설정합니다.

1. `GET Bucket` 하위 리소스 및 `versions`를 사용하여 `prefix` 요청을 보냅니다.

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example - 접두사를 사용하여 객체 검색**  
다음 예제에서는 키가 `myObject`이거나 이렇게 시작하는 객체를 가져옵니다.  

```
1. GET /?versions&prefix=myObject HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```
기타 요청 파라미터를 사용하여 전체 객체 버전의 하위 집합을 가져올 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)를 참조하세요.

**Example - 응답이 잘린 경우 추가 객체의 목록 검색**  
`GET` 요청에서 반환될 수 있는 객체 수가 `max-keys` 값을 초과한 경우, 응답에는 `<isTruncated>true</isTruncated>`가 포함되며 요청을 충족하지만 반환되지 않은 첫 번째 키와 첫 번째 버전 ID를 각각 `NextKeyMarker`와 `NextVersionIdMarker`에 포함시킵니다. 그러한 반환된 값을 후속 요청의 시작 지점으로 사용하여 `GET` 요청을 충족하는 추가 객체를 가져옵니다.  
다음 프로세스를 사용하여 버킷에서 `GET Bucket versions` 요청을 충족하는 추가 객체를 가져옵니다. `key-marker`, `version-id-marker`, `NextKeyMarker` 및 `NextVersionIdMarker`에 대한 자세한 내용은 *Amazon Simple Storage Service API 참조*의 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)을 참조하세요.  
다음은 원래 `GET` 요청을 충족하는 추가 응답입니다.  
+ `key-marker`의 값을 이전 응답의 `NextKeyMarker`에서 반환된 키로 설정합니다.
+ `version-id-marker`의 값을 이전 응답의 `NextVersionIdMarker`에서 반환된 버전 ID로 설정합니다.
+ `GET Bucket versions` 및 `key-marker`를 사용하여 `version-id-marker` 요청을 보냅니다.

**Example - 지정된 키 및 버전 ID로 시작하는 객체 검색**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

## AWS CLI 사용
<a name="list-obj-version-enabled-bucket-cli"></a>

다음 명령은 버킷에 있는 객체의 모든 버전에 대한 메타데이터를 반환합니다.

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

`list-object-versions`에 대한 자세한 정보는 **AWS CLI 명령 참조의 [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html) 섹션을 참조하세요.