

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

# 코드를 AWS SDK for Java 1.x에서 2.x로 마이그레이션하는 방법
<a name="migration-howto"></a>

몇 가지 방법으로 기존 SDK for Java 1.x 애플리케이션을 마이그레이션할 수 있습니다.

1. [마이그레이션 도구](migration-tool.md)를 사용한 자동 접근 방식

1. 1.x 가져오기를 2.x 가져오기로 점진적으로 대체하는 [수동 접근](migration-steps.md) 방식입니다.

먼저 마이그레이션 도구를 사용하는 것이 좋습니다. 1.x에서 2.x 코드로 일상적인 대체 작업의 대부분을 자동화합니다.

도구로 [모든 기능을 마이그레이션할 수 없으므로](migration-tool.md#migration-tool-limitations) 도구를 실행한 후 나머지 v1 코드를 검색해야 합니다. 도구를 통해 마이그레이션되지 않은 코드를 찾으면 [단계별 설명](migration-steps.md)(수동 접근 방식)을 따르고 [마이그레이션 가이드 문서](migration-whats-different.md)를 사용하여 마이그레이션을 완료합니다.

**Topics**
+ [마이그레이션 도구](migration-tool.md)
+ [단계별 설명](migration-steps.md)

# AWS SDK for Java 마이그레이션 도구
<a name="migration-tool"></a>

AWS SDK for Java는 SDK for Java 1.x(V1) 코드를 2.x(V2)로 마이그레이션하는 작업을 자동화하는 데 도움이 되는 마이그레이션 도구를 제공합니다. 이 도구는 오픈 소스, 소스 코드 리팩터링 도구인 [OpenRewrite](https://docs.openrewrite.org/)를 사용하여 마이그레이션을 수행합니다. OpenRewrite는 코드 수정 규칙(다른 명칭: ‘레시피’)을 사용하여 소스 코드를 V1에서 V2 구문 및 패턴으로 자동으로 업데이트합니다.

도구는 SDK 서비스 클라이언트 및 [S3 Transfer Manager](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html) 상위 수준 라이브러리에 대한 코드 수정 규칙을 지원합니다. V1의 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html)에서 V2로의 [DynamoDB 향상된 클라이언트 API](dynamodb-enhanced-client.md)와 같은 다른 상위 수준 API에 대한 코드 수정 규칙은 지원되지 않습니다.

제한 사항에 대한 자세한 내용은 [이 페이지의 마지막 부분](#migration-tool-limitations)을 참조하세요. 수동 마이그레이션 단계에서 지원되지 않는 일반적인 코드 패턴의 자세한 예제는 [지원되지 않는 코드 패턴](migration-tool-unsupported-patterns.md)을 참조하세요.

## 마이그레이션 도구 사용
<a name="migration-tool-use"></a>

### Maven 프로젝트 마이그레이션
<a name="migration-tool-use-maven"></a>

아래 설명에 따라 [OpenRewrite Maven 플러그인 도구](https://docs.openrewrite.org/reference/rewrite-maven-plugin)를 사용하여 SDK for Java 1.x Maven 기반 프로젝트를 마이그레이션합니다.

1. Maven 프로젝트의 루트 디렉터리로 이동

   터미널(명령줄) 창을 열고 Maven 기반 애플리케이션의 루트 디렉터리로 이동합니다.

1. 플러그인의 `rewrite-maven-plugin` 명령 실행

   `dryRun` 및 `run`의 2가지 모드(Maven 목표) 중에서 선택할 수 있습니다.

   **`dryRun`**** 모드**

   `dryRun` 모드에서 플러그인은 콘솔 출력에 diff 로그를 생성하고 `target/rewrite` 폴더에 `rewrite.patch`라는 패치 파일을 생성합니다. 이 모드를 사용하면 소스 코드 파일을 변경하지 않으므로 변경할 내용을 미리 볼 수 있습니다.

   다음 예제에서는 `dryRun` 모드에서 플러그인을 호출하는 방법을 보여줍니다.

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:dryRun \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1*<rewrite-plugin-version>*을 이 [테스트 파일](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54)에 표시된 `rewriteMavenPluginVersion` 값으로 교체합니다.

   \$1\$1*<sdkversion>*을 2.x SDK 버전으로 교체합니다. [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration)에서 최신 버전을 확인하세요.
**중요**  
다른 버전이 작동하지 않을 수 있으므로 [테스트 파일](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54)에 표시된 버전의 `rewrite-maven-plugin`을 사용해야 합니다.

   `dryRun` 모드의 콘솔 출력은 다음 출력과 유사해야 합니다.

   ```
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/pom.xml:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.UpgradeSdkDependencies
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=apache-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=netty-nio-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-bom, newGroupId=software.amazon.awssdk, newArtifactId=bom, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-s3, newGroupId=software.amazon.awssdk, newArtifactId=s3, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-sqs, newGroupId=software.amazon.awssdk, newArtifactId=sqs, newVersion=2.27.0}
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/src/main/java/foo/bar/Application.java:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.S3GetObjectConstructorToFluent
   [WARNING]             software.amazon.awssdk.v2migration.ConstructorToFluent
   [WARNING]         software.amazon.awssdk.v2migration.S3StreamingResponseToV2
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkType
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkCoreTypes
   [WARNING]             software.amazon.awssdk.v2migration.ChangeExceptionTypes
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonClientException, newFullyQualifiedTypeName=software.amazon.awssdk.core.exception.SdkException}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRequestId(), newMethodName=requestId}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorCode(), newMethodName=awsErrorDetails().errorCode}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getServiceName(), newMethodName=awsErrorDetails().serviceName}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorMessage(), newMethodName=awsErrorDetails().errorMessage}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponse(), newMethodName=awsErrorDetails().rawResponse().asByteArray}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponseContent(), newMethodName=awsErrorDetails().rawResponse().asUtf8String}
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonServiceException, newFullyQualifiedTypeName=software.amazon.awssdk.awscore.exception.AwsServiceException}
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.V1GetterToV2
   ...
   [WARNING]         software.amazon.awssdk.v2migration.V1BuilderVariationsToV2Builder
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.HttpSettingsToHttpClient
   [WARNING]         software.amazon.awssdk.v2migration.WrapSdkClientBuilderRegionStr
   [WARNING] Patch file available:
   [WARNING]     project/src/test/resources/maven/before/target/rewrite/rewrite.patch
   [WARNING] Estimate time saved: 20m
   [WARNING] Run 'mvn rewrite:run' to apply the recipes.
   ```

   **`run`**** 모드**

   플러그인을 `run` 모드에서 실행할 경우 디스크의 소스 코드를 수정하여 변경 사항을 적용합니다. 명령을 실행하기 전에 소스 코드의 백업이 있는지 확인합니다.

   다음 예제에서는 `run` 모드에서 플러그인을 호출하는 방법을 보여줍니다.

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:run \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1*<rewrite-plugin-version>*을 이 [테스트 파일](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54)에 표시된 `rewriteMavenPluginVersionvalue`로 교체합니다.

   \$1\$1*<sdkversion>*을 2.x SDK 버전으로 교체합니다. [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration)에서 최신 버전을 확인하세요.

   명령을 실행한 후 애플리케이션을 컴파일하고 테스트를 실행하여 변경 사항을 확인합니다.

### Gradle 프로젝트 마이그레이션
<a name="migration-tool-use-gradle"></a>

아래 설명에 따라 [OpenRewrite Gradle 플러그인](https://docs.openrewrite.org/reference/gradle-plugin-configuration) 도구를 사용하여 SDK for Java 1.x Gradle 기반 프로젝트를 마이그레이션합니다.

1. Gradle 프로젝트의 루트 디렉터리로 이동

   터미널(명령줄) 창을 열고 Gradle 기반 애플리케이션의 루트 디렉터리로 이동합니다.

1. Gradle init 스크립트 만들기

   디렉터리에 다음 콘텐츠로 `init.gradle`이라는 파일을 만듭니다.

   ```
   initscript {
       repositories {
           maven { url "https://plugins.gradle.org/m2" }
       }
       dependencies {
           classpath("org.openrewrite:plugin:<rewrite-plugin-version>*")
       }
   }
   
   rootProject {
       plugins.apply(org.openrewrite.gradle.RewritePlugin)
       dependencies {
           rewrite("software.amazon.awssdk:v2-migration:latest.release")
       }
   
       afterEvaluate {
           if (repositories.isEmpty()) {
               repositories {
                   mavenCentral()
               }
           }
       }
   }
   ```

   \$1*<rewrite-plugin-version>*을 이 [테스트 파일](https://github.com/aws/aws-sdk-java-v2/blob/master/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle#L6)에 표시된 버전으로 교체합니다.

1. `rewrite` 명령 실행

   Maven 플러그인과 마찬가지로 `dryRun` 또는 `run` 모드에서 Gradle 플러그인을 실행할 수 있습니다.

   **`dryRun` 모드**

   다음 예제에서는 `dryRun` 모드에서 플러그인을 호출하는 방법을 보여줍니다.

   ```
   gradle rewriteDryRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   **`run` 모드**

   다음 예제에서는 `run` 모드에서 플러그인을 호출하는 방법을 보여줍니다.

   ```
   gradle rewriteRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

## 현재 제한 사항
<a name="migration-tool-limitations"></a>

마이그레이션은 V2와 동일하게 업데이트되는 코드 수정 규칙을 통해 대부분의 V1 코드를 지원하지만, 일부 클래스와 메서드는 적용되지 않습니다. 이러한 클래스 및 메서드의 경우 [단계별 설명](migration-steps.md)에 따라 코드를 수동으로 마이그레이션합니다.

일부 지원되지 않는 코드 수정 규칙의 경우 마이그레이션 도구는 다음으로 시작하는 주석을 추가할 수 있습니다.

```
/*AWS SDK for Java v2 migration: Transform for ...
```

주석 다음에 도구는 메서드 또는 클래스의 V2 버전의 일반 스터브를 출력합니다. 예를 들어 다음 출력에서 마이그레이션 도구는 V1 S3 클라이언트의 `setBucketLifecycleConfiguration` 메서드를 마이그레이션하려고 시도했습니다.

```
/*AWS SDK for Java v2 migration: Transform for setBucketLifecycleConfiguration method not supported. 
Please manually migrate your code by using builder pattern, update from BucketLifecycleConfiguration.Rule 
to LifecycleRule, StorageClass to TransitionStorageClass, and adjust imports and names.*/
s3.putBucketLifecycleConfiguration(
        PutBucketLifecycleConfigurationRequest.builder()
            .bucket(bucketName)
            .lifecycleConfiguration(BucketLifecycleConfiguration.builder()
                .build())
            .build());
```

아래 목록의 링크를 클릭하면 코드를 수동으로 마이그레이션하는 데 도움이 되는 마이그레이션 정보로 이동합니다.
+ [버전 1과 버전 2 간의 S3 클라이언트 차이점 AWS SDK for Java](migration-s3-client.md)
+ [S3 Transfer Manager](migration-s3-transfer-manager.md)(TransferManager)
+ [DynamoDB 객체 매핑](migration-ddb-mapper.md)(DynamoDBMapper)
+ [EC2 메타데이터 유틸리티](migration-imds.md)(EC2MetadataUtils)
+ [웨이터](migration-waiters.md)(AmazonDynamoDBWaiters)
+ [IAM 정책 빌더](migration-iam-policy-builder.md)(정책)
+ [CloudFront 사전 서명](migration-cloudfront-presigning.md)(CloudFrontUrlSigner, CloudFrontCookieSigner)
+ [S3 이벤트 알림](migration-s3-event-notification.md)(S3EventNotification)
+ SDK 지표 게시([1.x 설명서](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [2.x 설명서](metrics.md))
+ [지원되지 않는 코드 패턴](migration-tool-unsupported-patterns.md) - 수동 마이그레이션이 필요한 일반적인 코드 패턴의 세부 예제

# 마이그레이션 도구의 지원되지 않는 코드 패턴
<a name="migration-tool-unsupported-patterns"></a>

마이그레이션 도구는 대부분의 v1 코드를 v2로 자동 변환합니다. 그러나 일부 코드 패턴은 수동 마이그레이션이 필요합니다. 이 주제에서는 지원되지 않는 가장 일반적인 패턴의 세부 예제를 제공하고 이를 수동으로 변환하는 방법을 보여줍니다.

다음 패턴 목록이 전부는 아닙니다. 마이그레이션 도구를 실행한 후에도 코드가 컴파일되지 않으면 [단계별 마이그레이션 설명](migration-steps.md)에 따라 나머지 v1 코드를 수동으로 마이그레이션합니다.

## 파라미터를 사용하여 객체 생성자 요청
<a name="request-pojo-constructors"></a>

요청 POJO(Amazon S3 제외)의 경우 마이그레이션 도구는 setter 메서드만 변환합니다. 이 도구는 파라미터가 있는 생성자를 지원하지 않습니다.

**지원되는 패턴: setter를 사용하여 객체 요청(작성자 파라미터 없음)**

이전(원래 v1 코드):

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest().withMessageBody("Hello World");
request.setQueueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue");
```

이후(마이그레이션 도구 결과):

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World").build();
request = request.toBuilder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue").build();
```

**지원되지 않는 패턴: 파라미터를 사용하여 객체 생성자 요청**

마이그레이션 도구는 파라미터가 있는 생성자를 변환할 수 없습니다.

수동 마이그레이션 전, 마이그레이션 도구 사용 후:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Import updated to v2.

// This pattern requires manual migration.
SendMessageRequest request = new SendMessageRequest(
    "https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", 
    "Hello World");
```

마이그레이션 도구는 가져오기를 v2로 변환하지만 생성자 코드는 변경되지 않고 빌더 패턴을 사용하려면 수동 업데이트가 필요합니다.

수동 마이그레이션 후:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World")
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .build();
```

## 개별 파라미터가 있는 서비스 클라이언트 메서드
<a name="service-client-method-overloads"></a>

마이그레이션 도구는 요청 객체(Amazon S3 제외) 대신 개별 파라미터를 사용하는 서비스 클라이언트 메서드를 변환할 수 없습니다.

이전(v1 코드):

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AmazonSQS sqs = new AmazonSQSClient();
// The following v1 method takes individual parameters.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

이후(마이그레이션 도구 결과 - 컴파일되지 않음):

```
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.
// No import statement for the v2 request POJO.

SqsClient sqs = SqsClient.builder().build();

// Does not compile–v2 methods only accept request POJOs.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

요청 객체를 사용하려면 메서드 인수를 수동으로 업데이트해야 합니다.

```
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Add manually.

SqsClient sqs = SqsClient.builder().build();

// Corrected v2 code.
SendMessageRequest request = SendMessageRequest.builder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .messageBody("Hello World")
    .build();
sqs.sendMessage(request);
```

## 요청 제한 시간 메서드
<a name="request-pojo-timeout-configuration"></a>

마이그레이션 도구는 요청 객체에 제한 시간을 설정하는 메서드를 변환하지 않습니다.

이전(v1 코드):

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest();
request.setSdkRequestTimeout(7);
```

이후(마이그레이션 도구 결과 - 컴파일되지 않음):

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;  // Import updated to v2.

SendMessageRequest request = SendMessageRequest.builder().build();

// Does not compile.
request.setSdkRequestTimeout(7);
```

v2의 `overrideConfiguration` 메서드를 사용하려면 수동으로 마이그레이션해야 합니다.

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
import java.time.Duration;

SendMessageRequest request = SendMessageRequest.builder().build();

// Corrected v2 code.
request = request.toBuilder()
    .overrideConfiguration(o -> o.apiCallTimeout(Duration.ofSeconds(7)))
    .build();
```

## 파라미터가 있는 서비스 클라이언트 생성자
<a name="service-client-constructors-with-args"></a>

마이그레이션 도구는 비어 있는 서비스 클라이언트 생성자를 변환하지만 자격 증명 또는 구성과 같은 파라미터를 허용하는 생성자는 변환할 수 없습니다.

이전(v1 코드):

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AWSCredentials awsCredentials = new BasicAWSCredentials("akid", "skid");
AmazonSQS sqs = new AmazonSQSClient(awsCredentials);
```

이후(마이그레이션 도구 결과 - 컴파일되지 않음):

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Does not compile.
SqsClient sqs = new SqsClient(awsCredentials);
```

빌더 패턴을 사용하려면 서비스 클라이언트 생성자를 수동으로 업데이트해야 합니다.

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;  // Add manually.
import software.amazon.awssdk.services.sqs.SqsClient;

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Corrected v2 code.
SqsClient sqs = SqsClient.builder()
    .credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
    .build();
```

# 마이그레이션에 대한 단계별 설명(예제 포함)
<a name="migration-steps"></a>

이 섹션에서는 현재 SDK for Java v1.x를 사용하는 애플리케이션을 SDK for Java 2.x로 마이그레이션하기 위한 단계별 안내서를 제공합니다. 첫 번째 부분에서는 단계에 대한 개요와 마이그레이션의 세부 예제를 제공합니다.

여기에서 다루는 단계는 애플리케이션이 모델 기반 서비스 클라이언트를 AWS 서비스 사용하여를 호출하는 일반적인 사용 사례의 마이그레이션을 설명합니다. [S3 Transfer Manager](migration-s3-transfer-manager.md) 또는 [CloudFront 사전 서명](migration-cloudfront-presigning.md)과 같은 개괄적인 API를 사용하는 코드를 마이그레이션해야 하는 경우 [AWS SDK for Java 1.x와 2.x의 차이점](migration-whats-different.md) 목차 아래의 섹션을 참조하세요.



여기에 설명된 접근 방식은 제안입니다. 다른 기법을 사용하고 IDE의 코드 편집 기능을 활용하여 동일한 결과를 얻을 수 있습니다.

## 단계 개요
<a name="migration-steps-overview"></a>

### 1. 먼저 SDK for Java 2.x BOM을 추가합니다.
<a name="migration-steps-overview-step1"></a>

SDK for Java 2.x의 Maven BOM(Bill of Materials) 요소를 POM 파일에 추가하면 필요한 모든 v2 종속성이 동일한 버전인지 확인할 수 있습니다. POM에는 v1 및 v2 종속성이 모두 포함될 수 있습니다. 이렇게 하면 코드를 한 번에 모두 변경하는 대신 점진적으로 마이그레이션할 수 있습니다.

#### SDK for Java 2.x BOM
<a name="drt_b5n_q1c"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>2.27.21</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

Maven 중앙 리포지토리에서 [최신 버전](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)을 확인해 보세요.

### 2. v1 클래스 가져오기 문에 대한 파일 검색
<a name="migration-steps-overview-step2"></a>

애플리케이션의 파일에서 v1 가져오기에 사용되는 SERVICE\$1ID를 스캔하면 사용된 고유한 SERVICE\$1ID를 확인할 수 있습니다. SERVICE\$1ID는의 짧고 고유한 이름입니다 AWS 서비스. 예를 들어 `cognitoidentity`는 Amazon Cognito 자격 증명의 SERVICE\$1ID입니다.

### 3. v1 가져오기 문에서 v2 Maven 종속성 확인
<a name="migration-steps-overview-step3"></a>

모든 고유한 v1 SERVICE\$1ID를 찾은 후 [Maven artifactId 매핑에 대한 패키지 이름](#migration-serviceid-artifactid-mapping)을 참조하여 v2 종속성에 해당하는 Maven 아티팩트를 확인할 수 있습니다.

### 4. POM 파일에 v2 종속성 요소 추가
<a name="migration-steps-overview-step4"></a>

3단계에서 확인한 종속성 요소로 Maven POM 파일을 업데이트합니다.

### 5. Java 파일에서 v1 클래스를 v2 클래스로 점진적으로 변경합니다.
<a name="migration-steps-overview-step5"></a>

v1 클래스를 v2 클래스로 대체할 때 생성자 대신 빌더를 사용하고 유용한 getter 및 setter를 사용하는 등 v2 API를 지원하는 데 필요한 변경 사항을 적용합니다.

### 6. POM에서 v1 Maven 종속성 제거 및 파일에서 v1 가져오기
<a name="migration-steps-overview-step6"></a>

v2 클래스를 사용하도록 코드를 마이그레이션한 후 파일에서 남은 v1 가져오기와 빌드 파일에서 모든 종속성을 제거합니다.

### 7. v2 API 개선 사항을 사용하도록 코드 리팩터링
<a name="migration-steps-overview-step7"></a>

코드가 성공적으로 컴파일되고 테스트를 통과하면 다른 HTTP 클라이언트 또는 페이지 매김 도구를 사용하여 코드를 단순화하는 등 v2 개선 사항을 활용할 수 있습니다. 이 단계는 선택 사항입니다.

## 마이그레이션 예제
<a name="migration-steps-example"></a>

이 예제에서는 SDK for Java v1을 사용하고 여러 AWS 서비스에 액세스하는 애플리케이션을 마이그레이션합니다. 5단계에서 다음 v1 메서드를 자세히 살펴봅니다. 이는 8개의 메서드가 포함된 클래스의 한 가지 메서드이며 애플리케이션에는 32개의 클래스가 있습니다.

### 마이그레이션할 v1 메서드
<a name="v1-snippet-collapsed"></a>

Java 파일에서 v1 SDK 가져오기만 아래에 나열됩니다.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple requests.
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
```

### 1. v2 Maven BOM 추가
<a name="migration-steps-example-step1"></a>

`dependencyManagement` 섹션의 다른 종속성과 함께 SDK for Java 2.x용 Maven BOM을 POM에 추가합니다. POM 파일에 SDK v1용 BOM이 있는 경우 지금은 그대로 둡니다. 이후 단계에서 제거됩니다.

#### 시작 시 POM 종속성 관리
<a name="migration-example-boms"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.example</groupId>             <!--Existing dependency in POM. -->
      <artifactId>bom</artifactId>
      <version>1.3.4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-bom</artifactId>  <!--Existing v1 BOM dependency. -->
      <version>1.11.1000</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>  <!--Add v2 BOM dependency. -->
      <artifactId>bom</artifactId>
      <version>2.27.21</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

### 2. v1 클래스 가져오기 문에 대한 파일 검색
<a name="migration-steps-example-step2"></a>

애플리케이션의 코드를 검색하여 `import com.amazonaws.services`의 고유한 발생을 찾습니다. 이를 통해 프로젝트에서 사용하는 v1 종속성을 확인할 수 있습니다. 애플리케이션에 v1 종속성이 나열된 Maven POM 파일이 있는 경우 이 정보를 대신 사용할 수 있습니다.

이 예제에서는 [`ripgrep`(rg)](https://github.com/BurntSushi/ripgrep) 명령을 사용하여 코드 베이스를 검색합니다.

코드 베이스의 루트에서 다음 `ripgrep` 명령을 실행합니다. `ripgrep`가 가져오기 문을 찾은 후 `cut`, `sort` 및 `uniq` 명령으로 파이프 처리되어 SERVICE\$1ID를 격리합니다.

```
rg --no-filename 'import\s+com\.amazonaws\.services' | cut -d '.' -f 4 | sort | uniq
```

이 애플리케이션의 경우 다음 SERVICE\$1ID가 콘솔에 로그됩니다.

```
autoscaling
cloudformation
ec2
identitymanagement
```

이는 `import` 문에 사용된 다음 패키지 이름 각각이 한 번 이상 발생했음을 나타냅니다. 이 목적에 따라 개별 클래스 이름은 중요하지 않습니다. 사용되는 SERVICE\$1ID를 찾기만 하면 됩니다.

```
com.amazonaws.services.autoscaling.*
com.amazonaws.services.cloudformation.*
com.amazonaws.services.ec2.*
com.amazonaws.services.identitymanagement.*
```

### 3. v1 가져오기 문에서 v2 Maven 종속성 확인
<a name="migration-steps-example-step3"></a>

2단계에서 격리한 v1용 SERVICE\$1ID를 예로 들면 `autoscaling` 및 `cloudformation`은 대부분 동일한 v2 SERVICE\$1ID에 매핑할 수 있습니다. v2 Maven artifactId는 대부분의 경우 SERVICE\$1ID와 일치하므로 POM 파일에 종속성 블록을 추가하는 데 필요한 정보가 포함됩니다.

다음 테이블은 v2 종속성을 확인하는 방법을 보여줍니다.


| v1 SERVICE\$1ID는 ...에 매핑됩니다.패키지 이름 | v2 SERVICE\$1ID는 ...에 매핑됩니다.패키지 이름 | v2 Maven 종속성 | 
| --- | --- | --- | 
|  **ec2** `com.amazonaws.services.ec2.*`  |  **ec2** `software.amazon.awssdk.services.ec2.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>ec2</artifactId><br /></dependency></pre>  | 
|  **Autoscaling** `com.amazonaws.services.autoscaling.*`  |  **Autoscaling** `software.amazon.awssdk.services.autoscaling.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>autoscaling</artifactId><br /></dependency></pre>  | 
| cloudformation`com.amazonaws.services.cloudformation.*` | cloudformation`software.amazon.awssdk.cloudformation.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>cloudformation</artifactId><br /></dependency></pre>  | 
| identitymanagement\$1`com.amazonaws.services.identitymanagement.*` | iam\$1`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\$1 `iam` 매핑에 대한 `identitymanagement`는 SERVICE\$1ID가 버전 간에 다른 예외입니다. Maven 또는 Gradle이 v2 종속성을 해결할 수 없는 경우 [Maven artifactId 매핑에 대한 패키지 이름](#migration-serviceid-artifactid-mapping) 예외는 섹션을 참조하세요.

### 4. POM 파일에 v2 종속성 요소 추가
<a name="migration-steps-example-step4"></a>

3단계에서는 POM 파일에 추가해야 하는 4개의 종속성 블록을 확인했습니다. 1단계에서 BOM을 지정했으므로 버전을 추가할 필요가 없습니다. 가져오기가 추가되면 POM 파일에 다음과 같은 종속성 요소가 포함됩니다.

```
    ...
  <dependencies>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>autoscaling</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>iam</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>cloudformation</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>ec2</artifactId>
    </dependency>
    ...
  </dependencies>
    ...
```

### 5. Java 파일에서 v1 클래스를 v2 클래스로 점진적으로 변경합니다.
<a name="migration-steps-example-step5"></a>

마이그레이션하는 메서드에서 다음을 확인합니다.
+ `com.amazonaws.services.ec2.AmazonEC2Client`의 EC2 서비스 클라이언트입니다.
+ 여러 EC2 모델 클래스가 사용됩니다. 예: `DescribeInstancesRequest` 및 `DescribeInstancesResult`

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds)
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
...
```

목표는 모든 v1 가져오기를 v2 가져오기로 대체하는 것입니다. 한 번에 하나의 클래스를 진행합니다.

#### a. 가져오기 문 또는 클래스 이름 교체
<a name="migration-example-step5-substep1"></a>

`describeRunningInstances` 메서드의 첫 번째 파라미터는 v1 `AmazonEC2Client` 인스턴스입니다. 다음 중 하나를 수행하세요.
+ `com.amazonaws.services.ec2.AmazonEC2Client`에 대한 가져오기를 `software.amazon.awssdk.services.ec2.Ec2Client`로 대체하고 `AmazonEC2Client`를 `Ec2Client`로 변경합니다.
+ 파라미터 유형을 `Ec2Client`로 변경하고 IDE가 올바른 가져오기를 표시하도록 합니다. 클라이언트 이름이 `AmazonEC2Client` 및 `Ec2Client`와 다르기 때문에 IDE는 v2 클래스를 가져오라는 메시지를 표시합니다. 클래스 이름이 두 버전에서 동일한 경우에는 이 접근 방식이 작동하지 않습니다.

#### b. v1 모델 클래스를 v2와 동등한 클레스로 교체
<a name="migration-example-step5-substep2"></a>

v2 `Ec2Client`를 변경한 후 IDE를 사용하면 다음 문에 컴파일 오류가 표시됩니다.

```
                    result = ec2.describeInstances(request);
```

컴파일 오류는 v1의 `DescribeInstancesRequest` 인스턴스를 v2 `Ec2Client` `describeInstances` 메서드의 파라미터로 사용하여 발생합니다. 수정하려면 다음의 대체 또는 가져오기 문을 만듭니다.


| 대체 | with | 
| --- | --- | 
|  <pre>import com.amazonaws.services.ec2.model.DescribeInstancesRequest</pre>  |  <pre>import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest</pre>  | 

#### c. v1 생성자를 v2 빌더로 변경합니다.
<a name="migration-example-step5-substep3"></a>

[v2 클래스에 생성자가 없기](migration-whats-different.md#immutable-classes) 때문에 컴파일 오류가 계속 표시됩니다. 수정하려면 다음 변경 사항을 적용합니다.


| 변경 | to | 
| --- | --- | 
|  <pre>final DescribeInstancesRequest request = new DescribeInstancesRequest()<br />        .withInstanceIds(instanceIdsCopy);</pre>  |  <pre>final DescribeInstancesRequest request = DescribeInstancesRequest.builder()<br />        .instanceIds(instanceIdsCopy)<br />        .build();</pre>  | 

#### d. v1 `*Result` 응답 객체를 v2 `*Response`에 상응하는 객체로 교체
<a name="migration-example-step5-substep4"></a>

v1과 v2의 일관된 차이점은 [v2의 모든 응답 객체가 `*Result` 대신 `*Response`로 끝나는 것](migration-whats-different.md#model-classname-changes)입니다. v1 `DescribeInstancesResult` 가져오기를 v2 가져오기인 `DescribeInstancesResponse`로 교체합니다.

#### d. API 변경 사항 적용
<a name="migration-example-step5-substep5"></a>

다음 문은 몇 가지 변경 사항이 필요합니다.

```
request.setNextToken(result.getNextToken());
```

v2에서 [setter 메서드](migration-whats-different.md#setter-getter-methods)는 `set`를 사용하거나 `prefix`와 함께 사용하지 않습니다. 또한 접두사가 `get`인 getter 메서드는 SDK for Java 2.x에서 삭제됩니다.

`request` 인스턴스 등의 모델 클래스는 v2에서 변경할 수 없으므로 빌더로 새 `DescribeInstancesRequest`를 만들어야 합니다.

v2에서 문은 다음과 같습니다.

```
request = DescribeInstancesRequest.builder()
        .nextToken(result.nextToken())
        .build();
```

#### d. 메서드가 v2 클래스로 컴파일될 때까지 반복합니다.
<a name="migration-example-step5-substep6"></a>

나머지 코드를 계속 진행합니다. v1 가져오기를 v2 가져오기로 교체하고 컴파일 오류를 수정합니다. [v2 API 참조](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html) 및 필요에 따라 [다른 참조](migration-whats-different.md)를 참고합니다.

이 단일 메서드를 마이그레이션하면 다음의 v2 코드가 포함됩니다.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;

import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.Reservation;
...
private static List<Instance> getRunningInstances(Ec2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
        try {
            DescribeInstancesRequest request = DescribeInstancesRequest.builder()
                    .instanceIds(instanceIds)
                    .build();
            DescribeInstancesResponse result;
            do {
                // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
                result = ec2.describeInstances(request);
                request = DescribeInstancesRequest.builder()   // Prepare request for next page.
                        .nextToken(result.nextToken())
                        .build();
                for (final Reservation r : result.reservations()) {
                    for (final Instance instance : r.instances()) {
                        // if instance is in a running state, add it to runningInstances list.
                        if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                            runningInstances.add(instance);
                        }
                    }
                }
            } while (result.nextToken() != null);
        } catch (final Ec2Exception exception) {
            // if instance isn't found, assume its terminated and continue.
            if (exception.awsErrorDetails().errorCode().equals(NOT_FOUND_ERROR_CODE)) {
                    LOGGER.info("Instance probably terminated; moving on.");
            } else {
                throw exception;
            }
        }
        return runningInstances;
    }
...
```

8가지 메서드로 Java 파일의 단일 메서드를 마이그레이션하기 때문에 파일을 작업할 때 v1과 v2 가져오기가 혼합되어 있습니다. 단계를 수행할 때 마지막 6개의 가져오기 문을 추가했습니다.

모든 코드를 마이그레이션하면 더 이상 v1 가져오기 문이 없습니다.

### 6. POM에서 v1 Maven 종속성 제거 및 파일에서 v1 가져오기
<a name="migration-steps-example-step6"></a>

파일의 모든 v1 코드를 마이그레이션하면 다음과 같은 v2 SDK 가져오기 문이 있습니다.

```
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.CreateTagsRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.InstanceStateName;
import software.amazon.awssdk.services.ec2.model.Reservation;
import software.amazon.awssdk.services.ec2.model.Tag;
import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest;
```

애플리케이션의 *모든* 파일을 마이그레이션하면 더 이상 POM 파일에 v1 종속성이 필요하지 않습니다. 모든 v1 종속성 블록을 사용하는 경우 `dependencyManagement` 섹션에서 v1 BOM을 제거합니다.

### 7. v2 API 개선 사항을 사용하도록 코드 리팩터링
<a name="migration-steps-example-step7"></a>

마이그레이션 중인 코드 조각의 경우 v2 페이지 매김 도구를 필요에 따라 사용하고 SDK가 더 많은 데이터에 대한 토큰 기반 요청을 관리하도록 할 수 있습니다.

전체 `do`절을 다음으로 교체할 수 있습니다.

```
                DescribeInstancesIterable responses = ec2.describeInstancesPaginator(request);

                responses.reservations().stream()
                        .forEach(reservation -> reservation.instances()
                                .forEach(instance -> {
                                    if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                                        runningInstances.put(instance.instanceId(), instance);
                                    }
                                }));
```

## Maven artifactId 매핑에 대한 패키지 이름
<a name="migration-serviceid-artifactid-mapping"></a>

Maven 또는 Gradle 프로젝트를 SDK for Java의 v1에서 v2로 마이그레이션할 때 빌드 파일에 추가할 종속성을 파악해야 합니다. [마이그레이션에 대한 단계별 설명(예제 포함)](#migration-steps)(3단계)에 설명된 접근 방식은 가져오기 문의 패키지 이름을 시작점으로 사용하여 빌드 파일에 추가할 종속성(artifactId)을 결정합니다.

이 주제의 정보를 사용하여 v1 패키지 이름을 v2 artifactId로 매핑합니다.

### 패키지 이름 및 Maven artifactId에 사용되는 일반적인 이름 지정 규칙
<a name="migration-naming-convention"></a>

다음 테이블에는 SDK가 주어진 SERVICE\$1ID에 사용하는 일반적인 이름 지정 규칙이 나와 있습니다. SERVICE\$1ID는의 고유 식별자입니다 AWS 서비스. 예를 들어 Amazon S3 서비스의 SERVICE\$1ID는 `s3`이고 `cognitoidentity`는 Amazon Cognito 자격 증명의 SERVICE\$1ID입니다.


| v1 패키지 이름(가져오기 문) | v1 artifactId | v2 artifactId | v2 패키지 이름(가져오기 문) | 
| --- | --- | --- | --- | 
| com.amazonaws.services.SERVICE\$1ID | aws-java-sdk-SERVICE\$1ID | SERVICE\$1ID | software.amazon.awssdk.services.SERVICE\$1ID | 
|   | 
| Amazon Cognito 자격 증명의 예(SERVICE\$1ID: cognitoidentity) | 
| com.amazonaws.services.cognitoidentity | aws-java-sdk-cognitoidentity | cognitoidentity | software.amazon.awssdk.services.cognitoidentity | 

### SERVICE\$1ID 차이점
<a name="migration-serviceid-diffs"></a>

#### v1 내
<a name="migration-serviceid-diffs-withinv1"></a>

경우에 따라 SERVICE\$1ID는 패키지 이름과 동일한 서비스의 artifactId 간에 다릅니다. 예를 들어 다음 테이블의 CloudWatch Metrics 행은 `metrics`이 패키지 이름의 SERVICE\$1ID이지만 `cloudwatchmetrics`은 artifactId의 SERVICE\$1ID임을 보여줍니다.

#### v2 내
<a name="migration-serviceid-diffs-withinv2"></a>

패키지 이름 및 artifactId에 사용되는 SERVICE\$1ID에는 차이가 없습니다.

#### v1 및 v2 차이
<a name="migration-serviceid-diffs-btwv1v2"></a>

대부분의 서비스에서 v2의 SERVICE\$1ID는 패키지 이름과 artifactId 모두에서 v1의 SERVICE\$1ID와 동일합니다. 이전 테이블과 같이 `cognitoedentity` SERVICE\$1ID를 예로 들 수 있습니다. 그러나 다음 테이블과 같이 일부 SERVICE\$1ID는 SDK 간에 다릅니다.

v1 열 중 하나에 있는 **boldface SERVICE\$1ID**는 v2에 사용된 SERVICE\$1ID와 다르다는 것을 나타냅니다.


| 서비스 이름 | v1 패키지 이름 | v1 artifactId | v2 artifactId | v2 패키지 이름 | 
| --- | --- | --- | --- | --- | 
|  |  모든 패키지 이름은 첫 번째 행에 표시된 대로 `com.amazonaws.services`로 시작합니다.  |  모든 artifactId는 첫 번째 행과 같이 태그로 묶입니다.  |  모든 artifactId는 첫 번째 행과 같이 태그로 묶입니다.  |  모든 패키지 이름은 첫 번째 행에 표시된 대로 `software.amazon.awssdk`로 시작합니다.  | 
|  | 
| API Gateway | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk-api-gateway</artifactId> | <artifactId>apigateway</artifactId> | software.amazon.awssdk.services.apigateway | 
| 앱 레지스트리 | appregistry | appregistry | servicecatalogappregistry | servicecatalogappregistry | 
| Application Discovery | applicationdiscovery | discovery | applicationdiscovery | applicationdiscovery | 
| 증강형 AI 런타임 | augmentedairuntime | augmentedairuntime | sagemakera2iruntime | sagemakera2iruntime | 
| Certificate Manager | certificatemanager | acm | acm | acm | 
| CloudControl API | cloudcontrolapi | cloudcontrolapi | cloudcontrol | cloudcontrol | 
| cloudsearch | cloudsearchv2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch 도메인 | cloudsearchdomain | cloudsearch | cloudsearchdomain | cloudsearchdomain | 
| CloudWatch Events | cloudwatchevents | 이벤트 | cloudwatchevents | cloudwatchevents | 
| CloudWatch Evidently | cloudwatchevidently | cloudwatchevidently | evidently | evidently | 
| CloudWatch Logs | 로그 | 로그 | cloudwatchlogs | cloudwatchlogs | 
| CloudWatch 지표 | 지표 | cloudwatchmetrics | cloudwatch | cloudwatch | 
| CloudWatch Rum | cloudwatchrum | cloudwatchrum | rum | rum | 
| Cognito 자격 증명 공급자 | cognitoidp | cognitoidp | cognitoidentityprovider | cognitoidentityprovider | 
| 캠페인 연결 | connectcampaign | connectcampaign | connectcampaigns | connectcampaigns | 
| Wisdom 연결 | connectwisdom | connectwisdom | wisdom | wisdom | 
| Database Migration Service | databasemigrationservice | dms | databasemigration | databasemigration | 
| DataZone | datazone | datazoneexternal | datazone | datazone | 
| DynamoDB | dynamodbv2 | dynamodb | dynamodb | dynamodb | 
| Elastic File System | elasticfilesystem | efs | efs | efs | 
| Elastic Map Reduce | elasticmapreduce | emr | emr | emr | 
| Glue DataBrew | gluedatabrew | gluedatabrew | databrew | databrew | 
| IAM Roles Anywhere | iamrolesanywhere | iamrolesanywhere | rolesanywhere | rolesanywhere | 
| 자격 증명 관리 | identitymanagement | iam | iam | iam | 
| IoT 데이터 | iotdata | iot | iotdataplane | iotdataplane | 
| Kinesis Analytics | kinesisanalytics | kinesis | kinesisanalytics | kinesisanalytics | 
| Kinesis Firehose | kinesisfirehose | kinesis | firehose | firehose | 
| Kinesis 비디오 신호 채널 | kinesisvideosignalingchannels | kinesisvideosignalingchannels | kinesisvideosignaling | kinesisvideosignaling | 
| Lex | lexruntime | 어휘 | lexruntime | lexruntime | 
| Lookout For Vision | lookoutforvision | lookoutforvision | lookoutvision | lookoutvision | 
| Mainframe Modernization | mainframemodernization | mainframemodernization | m2 | m2 | 
| Marketplace Metering | marketplacemetering | marketplacemeteringservice | marketplacemetering | marketplacemetering | 
| 관리형 Grafana | managedgrafana | managedgrafana | grafana | grafana | 
| Mechanical Turk | mturk | mechanicalturkrequester | mturk | mturk | 
| Migration Hub Strategy Recommendations | migrationhubstrategyrecommendations | migrationhubstrategyrecommendations | migrationhubstrategy | migrationhubstrategy | 
| Nimble Studio | nimblestudio | nimblestudio | nimble | nimble | 
| Private 5G | private5g | private5g | privatenetworks | privatenetworks | 
| Prometheus | prometheus | prometheus | amp | amp | 
| 휴지통 | recyclebin | recyclebin | rbin | rbin | 
| Redshift 데이터 API | redshiftdataapi | redshiftdataapi | redshiftdata | redshiftdata | 
| Route 53 | route53domains | route53 | route53domains | route53domains | 
| Sage Maker Edge Manager | sagemakeredgemanager | sagemakeredgemanager | sagemakeredge | sagemakeredge | 
| 보안 토큰 | securitytoken | sts | sts | sts | 
| 서버 마이그레이션 | servermigration | servermigration | sms | sms | 
| 간단한 이메일 | simpleemail | ses | ses | ses | 
| 간단한 이메일 V2 | simpleemailv2 | sesv2 | sesv2 | sesv2 | 
| Simple Systems Management | simplesystemsmanagement | ssm | ssm | ssm | 
| 단순 워크플로 | simpleworkflow | simpleworkflow | swf | swf | 
| 단계 함수 | stepfunctions | stepfunctions | sfn | sfn | 