

 AWS SDK for Java 1.x는 2025년 12월 31일에 end-of-support되었습니다. 새로운 기능, 가용성 개선 및 보안 업데이트를 계속 받으려면 [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html)로 마이그레이션하는 것이 좋습니다.

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

# 사용 AWS SDK for Java
<a name="basics"></a>

이 섹션에서는 SDK에서 사용할 수 AWS SDK for Java 있는 모든 서비스에 적용되는를 사용한 프로그래밍에 대한 중요한 일반 정보를 제공합니다.

서비스별 프로그래밍 정보 및 예제( Amazon EC2 Amazon S3용 Amazon SWF등)는 [AWS SDK for Java 코드 예제](prog-services.md)를 참조하세요.

**Topics**
+ [를 사용한 AWS 개발 모범 사례 AWS SDK for Java](best-practices.md)
+ [서비스 클라이언트 생성](creating-clients.md)
+ [임시 자격 증명 제공](credentials.md)
+ [AWS 리전 선택](java-dg-region-selection.md)
+ [예외 처리](java-dg-exceptions.md)
+ [비동기 프로그래밍](basics-async.md)
+ [AWS SDK for Java 통화 로깅](java-dg-logging.md)
+ [클라이언트 구성](section-client-configuration.md)
+ [액세스 제어 정책](java-dg-access-control.md)
+ [DNS 이름 조회를 위한 JVM TTL 설정](jvm-ttl-dns.md)
+ [에 대한 지표 활성화 AWS SDK for Java](generating-sdk-metrics.md)

# 를 사용한 AWS 개발 모범 사례 AWS SDK for Java
<a name="best-practices"></a>

다음 모범 사례는를 사용하여 AWS 애플리케이션을 개발할 때 문제나 문제를 방지하는 데 도움이 될 수 있습니다 AWS SDK for Java. 모범 사례를 서비스별로 정리했습니다.

## S3
<a name="s3"></a>

### ResetExceptions 방지
<a name="s3-avoid-resetexception"></a>

스트림(`AmazonS3`클라이언트 또는를 통해`TransferManager`)을 사용하여 Amazon S3 에 객체를 업로드하면 네트워크 연결 또는 제한 시간 문제가 발생할 수 있습니다. 기본적으로는 전송 시작 전에 입력 스트림을 표시한 다음 AWS SDK for Java 다시 시도하기 전에 재설정하여 전송 실패를 재시도합니다.

스트림에서 표시 및 재설정을 지원하지 않는 경우 일시적인 실패가 있고 재시도가 활성화될 때 SDK에서 [ResetException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ResetException.html)이 발생합니다.

 **모범 사례** 

표시 및 재설정 작업을 지원하는 스트림을 사용하는 것이 좋습니다.

[ResetException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ResetException.html)을 방지하는 가장 신뢰할 수 있는 방법은 [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 또는 FileInputStream을 사용하여 데이터를 제공하는 것입니다. File 또는 [FileInputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/FileInputStream.html)은 표시 및 재설정 제한으로 제한되지 않고에서 처리할 AWS SDK for Java 수 있습니다.

스트림이 [FileInputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/FileInputStream.html)은 아니지만 표시 및 재설정을 지원하는 경우 [RequestClientOptions](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/RequestClientOptions.html)의 `setReadLimit` 메서드를 사용하여 표시 제한을 설정할 수 있습니다. 기본값은 128KB입니다. 읽기 제한 값을 *스트림 크기보다 1바이트 크게* 설정하면 [ResetException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ResetException.html)을 확실하게 방지할 수 있습니다.

예를 들어 스트림의 최대 예상 크기가 100,000바이트이면 읽기 제한을 100,001(100,000 \$1 1)바이트로 설정합니다. 표시 및 재설정은 항상 100,000바이트 이하에 대해서만 작동합니다. 이렇게 하면 일부 스트림의 경우 바이트 수가 메모리로 버퍼링될 수도 있습니다.

# 서비스 클라이언트 생성
<a name="creating-clients"></a>

요청을 하려면 Amazon Web Services먼저 서비스 클라이언트 객체를 생성합니다. 권장 방법은 서비스 클라이언트 빌더를 사용하는 것입니다.

각 AWS 서비스 에는 서비스 API의 각 작업에 대한 메서드가 있는 서비스 인터페이스가 있습니다. 예를 들어 DynamoDB의 서비스 인터페이스 이름은 [AmazonDynamoDBClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/AmazonDynamoDBClient.html)입니다. 각 서비스 인터페이스마다 서비스 인터페이스의 구현을 생성하는 데 사용할 수 있는 해당하는 클라이언트 빌더가 있습니다. 에 대한 클라이언트 빌더 클래스의 이름은 [AmazonDynamoDBClientBuilder](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDBClientBuilder.html) DynamoDB 입니다.

## 클라이언트 빌더 가져오기
<a name="obtaining-a-client-builder"></a>

클라이언트 빌더의 인스턴스를 가져오려면 다음 예에서처럼 정적 팩토리 메서드인 `standard`를 사용합니다.

```
AmazonDynamoDBClientBuilder builder = AmazonDynamoDBClientBuilder.standard();
```

빌더가 있으면 빌더 API에서 여러 유용한 setter를 사용하여 클라이언트의 속성을 사용자 지정할 수 있습니다. 예를 들면 다음과 같이 사용자 지정 리전 및 사용자 지정 자격 증명 공급자를 설정할 수 있습니다.

```
AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard()
                        .withRegion(Regions.US_WEST_2)
                        .withCredentials(new ProfileCredentialsProvider("myProfile"))
                        .build();
```

**참고**  
유용한 `withXXX` 메서드는 `builder` 객체를 반환하므로 보다 읽기 쉽고 편리하도록 메서드 호출을 묶을 수 있습니다. 원하는 속성을 구성한 후에는 `build` 메서드를 호출하여 클라이언트를 생성할 수 있습니다. 클라이언트는 한 번 생성되고 나면 변경할 수 없으며 `setRegion` 또는 `setEndpoint` 호출이 실패합니다.

빌더는 동일한 구성을 사용하여 여러 클라이언트를 생성할 수 있습니다. 애플리케이션을 작성할 때는 빌더가 변경 가능하며 스레드 세이프가 아님에 주의해야 합니다.

다음 코드에서는 빌더가 클라이언트 인스턴스의 팩토리로 사용됩니다.

```
public class DynamoDBClientFactory {
    private final AmazonDynamoDBClientBuilder builder =
        AmazonDynamoDBClientBuilder.standard()
            .withRegion(Regions.US_WEST_2)
            .withCredentials(new ProfileCredentialsProvider("myProfile"));

    public AmazonDynamoDB createClient() {
        return builder.build();
    }
}
```

빌더는 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html) 및 [RequestMetricCollector](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/metrics/RequestMetricCollector.html)의 유용한 setter와, [RequestHandler2](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/handlers/RequestHandler2.html)의 사용자 지정 목록도 표시합니다.

다음은 모든 구성 가능한 속성을 재정의하는 전체 예제입니다.

```
AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard()
        .withRegion(Regions.US_WEST_2)
        .withCredentials(new ProfileCredentialsProvider("myProfile"))
        .withClientConfiguration(new ClientConfiguration().withRequestTimeout(5000))
        .withMetricsCollector(new MyCustomMetricsCollector())
        .withRequestHandlers(new MyCustomRequestHandler(), new MyOtherCustomRequestHandler)
        .build();
```

## 비동기 클라이언트 생성
<a name="creating-async-clients"></a>

 AWS SDK for Java 에는 모든 서비스(제외)에 대한 비동기(또는 비동기 Amazon S3) 클라이언트와 모든 서비스에 해당하는 비동기 클라이언트 빌더가 있습니다.

### 기본 ExecutorService를 사용하여 비동기 DynamoDB 클라이언트를 생성하려면
<a name="w3aab9c13b9b5"></a>

```
AmazonDynamoDBAsync ddbAsync = AmazonDynamoDBAsyncClientBuilder.standard()
        .withRegion(Regions.US_WEST_2)
        .withCredentials(new ProfileCredentialsProvider("myProfile"))
        .build();
```

동기(또는 동기화) 클라이언트 빌더가 지원하는 구성 옵션 외에도, 비동기 클라이언트를 사용할 때 사용자 지정 [ExecutorFactory](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/client/builder/ExecutorFactory.html)를 설정하여 비동기 클라이언트가 사용하는 `ExecutorService`을 변경할 수 있습니다. `ExecutorFactory`는 함수형 인터페이스이므로 Java 8 Lambda 표현식 및 메서드 참조와 상호 운용됩니다.

### 사용자 지정 executor를 사용하여 비동기 클라이언트를 생성하려면
<a name="w3aab9c13b9b9"></a>

```
AmazonDynamoDBAsync ddbAsync = AmazonDynamoDBAsyncClientBuilder.standard()
            .withExecutorFactory(() -> Executors.newFixedThreadPool(10))
            .build();
```

## DefaultClient 사용
<a name="using-defaultclient"></a>

동기 및 비동기 클라이언트 빌더에는 모두 `defaultClient`라는 또 다른 팩토리 메서드가 있습니다. 이 메서드는 기본 구성을 사용하여 서비스 클라이언트를 생성하며, 기본 공급자 체인을 사용하여 자격 증명 및 AWS 리전을 로드합니다. 자격 증명 또는 리전을 애플리케이션이 실행 중인 환경에서 확인할 수 없으면 `defaultClient` 호출이 실패합니다. 자격 [AWS 증명 및 리전 결정 방법에 대한 자세한 내용은 자격 증명 및 선택 작업을 참조하세요](credentials.md). [AWS 리전](java-dg-region-selection.md) 

### 기본 서비스 클라이언트를 생성하려면
<a name="w3aab9c13c11b5"></a>

```
AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();
```

## 클라이언트 수명 주기
<a name="client-lifecycle"></a>

SDK의 서비스 클라이언트는 스레드 세이프이며, 성능을 최대화하려면 서비스 클라이언트를 수명이 긴 객체로 다루어야 합니다. 각 클라이언트마다 고유한 연결 풀 리소스가 있습니다. 더 이상 필요하지 않은 경우 리소스 누수를 방지하기 위해 클라이언트를 명시적으로 종료하십시오.

클라이언트를 명시적으로 종료하려면 `shutdown` 메서드를 호출합니다. `shutdown`을 호출한 후에는 모든 클라이언트 리소스가 해제되고 클라이언트를 사용할 수 없습니다.

### 클라이언트를 종료하려면
<a name="w3aab9c13c13b7"></a>

```
AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();
ddb.shutdown();
// Client is now unusable
```

# 에 임시 자격 증명 제공 AWS SDK for Java
<a name="credentials"></a>

에 요청하려면가 서비스를 호출 AWS SDK for Java 할 때 사용할 AWS 임시 자격 증명을 제공해야 Amazon Web Services합니다. 다음과 같은 방법으로 추가가 가능합니다.
+ 기본 자격 증명 공급자 체인*(권장)*을 사용합니다.
+ 특정 자격 증명 공급자 또는 공급자 체인을 사용합니다(또는 직접 생성).
+ 임시 자격 증명 정보를 코드로 직접 제공하세요.

## 기본 자격 증명 공급자 체인 사용
<a name="credentials-default"></a>

인수를 제공하지 않고 새 서비스 클라이언트를 초기화하면는 [DefaultAWSCredentialsProviderChain](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html) 클래스에서 구현한 *기본 자격 증명 공급자 체인을 사용하여 임시 자격 증명을* 찾으려고 AWS SDK for Java 시도합니다. 기본 자격 증명 공급자 체인은 다음 순서대로 자격 증명을 찾습니다.

1.  **환경 변수**-`AWS_ACCESS_KEY_ID`, `AWS_SECRET_KEY`, `AWS_SECRET_ACCESS_KEY` 및 `AWS_SESSION_TOKEN`입니다. 는 [EnvironmentVariableCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/EnvironmentVariableCredentialsProvider.html) 클래스를 AWS SDK for Java 사용하여 이러한 자격 증명을 로드합니다.

1.  **Java 시스템 속성**-`aws.accessKeyId`, `aws.secretKey`(`aws.secretAccessKey`는 아님) 및 `aws.sessionToken`입니다. AWS SDK for Java 는 [SystemPropertiesCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/SystemPropertiesCredentialsProvider.html)를 사용하여 이 자격 증명을 로드합니다.

1.  환경 또는 컨테이너의 **웹 자격 증명 토큰 자격 증명**

1.  **기본 자격 증명 프로필 파일은** 일반적으로에 위치하며`~/.aws/credentials`(위치는 플랫폼마다 다를 수 있음), 많은 AWS SDKs 및에서 공유합니다 AWS CLI. 는 [ProfileCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/profile/ProfileCredentialsProvider.html)를 AWS SDK for Java 사용하여 이러한 자격 증명을 로드합니다.

   에서 제공하는 `aws configure` 명령을 사용하여 자격 증명 파일을 생성 AWS CLI하거나 텍스트 편집기로 파일을 편집하여 생성할 수 있습니다. 자격 증명 파일 형식에 대한 자세한 내용은 [AWS 자격 증명 파일 형식](#credentials-file-format)을 참조하세요.

1.  **Amazon ECS 컨테이너 자격 증명**은 환경 변수 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`가 설정되면 Amazon ECS에서 로드됩니다. 는 [ContainerCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/ContainerCredentialsProvider.html)를 AWS SDK for Java 사용하여 이러한 자격 증명을 로드합니다. 이 값에 대한 IP 주소를 지정할 수 있습니다.

1.  **인스턴스 프로파일 자격 증명** - EC2 인스턴스에서 사용되며 Amazon EC2 메타데이터 서비스를 통해 전달됩니다. 는 [InstanceProfileCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/InstanceProfileCredentialsProvider.html)를 AWS SDK for Java 사용하여 이러한 자격 증명을 로드합니다. 이 값에 대한 IP 주소를 지정할 수 있습니다.
**참고**  
인스턴스 프로파일 자격 증명은 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`가 설정되지 않은 경우에만 사용됩니다. 자세한 내용은 [EC2ContainerCredentialsProviderWrapper](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/EC2ContainerCredentialsProviderWrapper.html)를 참조하십시오.

### 임시 자격 증명 설정
<a name="setting-credentials"></a>

 AWS 임시 자격 증명을 사용하려면 이전 위치 중 *하나 이상*에 설정해야 합니다. 자격 증명 설정에 대한 자세한 내용은 다음 주제를 참조하십시오.
+ *환경*이나 기본 *자격 증명 프로필 파일*에서 자격 증명을 지정하려면 [임시 자격 증명 설정](setup-credentials.md#setup-credentials-setting)을 참조하세요.
+ Java *시스템 속성*을 설정하려면 공식 *Java Tutorials* 웹 사이트에서 [시스템 속성](http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html) 자습서를 참조하세요.
+ EC2 *인스턴스에서 인스턴스 프로파일 자격 증명을* 설정하고 사용하려면 [IAM 역할을 사용하여 AWS 리소스에 대한 액세스 권한 부여를 Amazon EC2](java-dg-roles.md) 참조하세요.

### 대체 자격 증명 프로필 설정
<a name="setting-an-alternate-credentials-profile"></a>

는 기본적으로 *기본* 프로필을 AWS SDK for Java 사용하지만 자격 증명 파일에서 소싱되는 프로필을 사용자 지정하는 방법이 있습니다.

 AWS 프로필 환경 변수를 사용하여 SDK에서 로드한 프로필을 변경할 수 있습니다.

예를 들어 Linux, macOS, 또는 Unix에서는 다음 명령을 실행하여 프로필을 *myProfile*로 변경합니다.

```
export AWS_PROFILE="myProfile"
```

Windows에서는 다음을 사용합니다.

```
set AWS_PROFILE="myProfile"
```

`AWS_PROFILE` 환경 변수를 설정하면 공식적으로 지원되는 모든 AWS SDKs 및 도구( AWS CLI 및 포함)의 자격 증명 로드에 영향을 미칩니다 AWS Tools for Windows PowerShell. Java 애플리케이션용 프로필만 변경하려면 대신에 시스템 속성인 `aws.profile`을 사용할 수 있습니다.

**참고**  
이 환경 변수는 이 시스템 속성보다 우선합니다.

### 대체 자격 증명 파일 위치 설정
<a name="setting-an-alternate-credentials-file-location"></a>

는 기본 자격 증명 파일 위치에서 AWS 임시 자격 증명을 자동으로 AWS SDK for Java 로드합니다. 하지만 자격 증명 파일의 전체 경로를 사용하여 `AWS_CREDENTIAL_PROFILES_FILE` 환경 변수를 설정함으로써 이 위치를 지정할 수도 있습니다.

이 기능을 사용하여가 자격 증명 파일을 AWS SDK for Java 찾는 위치를 일시적으로 변경할 수 있습니다(예: 명령줄로이 변수를 설정). 또는 사용자 또는 시스템 환경에서 환경 변수를 설정하여 사용자 또는 시스템 수준에서 변경할 수도 있습니다.

#### 기본 자격 증명 파일 위치를 재정의하려면
<a name="w3aab9c15b9c11b7b1"></a>
+ `AWS_CREDENTIAL_PROFILES_FILE` 환경 변수를 AWS 자격 증명 파일의 위치로 설정합니다.
  + Linux, macOS 또는 Unix에서는 다음을 사용하세요.

    ```
    export AWS_CREDENTIAL_PROFILES_FILE=path/to/credentials_file
    ```
  + Windows에서는 다음을 사용합니다.

    ```
    set AWS_CREDENTIAL_PROFILES_FILE=path/to/credentials_file
    ```

### `Credentials` 파일 형식
<a name="credentials-file-format"></a>

이 안내서의 [기본 설정에 있는 지침](signup-create-iam-user.md#setup-temp-creds)을 따르면 자격 증명 파일은 다음과 같은 기본 형식을 가져야 합니다.

```
[default]
aws_access_key_id=<value from AWS access portal>
aws_secret_access_key=<value from AWS access portal>
aws_session_token=<value from AWS access portal>

[profile2]
aws_access_key_id=<value from AWS access portal>
aws_secret_access_key=<value from AWS access portal>
aws_session_token=<value from AWS access portal>
```

프로필 이름은 대괄호에 지정되며(예: `[default]`), 그 뒤에는 해당 프로필의 구성 가능한 필드가 키-값 페어로 이어집니다. `credentials` 파일에 여러 프로필을 지정할 수 있으며, `aws configure --profile PROFILE_NAME `을 사용하여 이러한 프로필을 편집하거나 추가하여 구성할 프로필을 선택할 수 있습니다.

`metadata_service_timeout` 및 `metadata_service_num_attempts`와 같은 추가 필드를 지정할 수 있습니다. CLI에서는 구성할 수 없습니다. 사용하려면 파일을 직접 편집해야 합니다. 구성 파일 및 사용 가능한 필드에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서의 [구성을 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html) 참조하세요.

### 자격 증명 로드
<a name="loading-credentials"></a>

임시 자격 증명을 설정한 후에는 SDK에서 기본 자격 증명 공급자 체인을 사용하여 로드할 수 있습니다.

이렇게 하려면 다음과 같이 빌더에 자격 증명을 명시적으로 제공하지 않고 AWS 서비스 클라이언트를 인스턴스화합니다.

```
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                       .withRegion(Regions.US_WEST_2)
                       .build();
```

## 자격 증명 공급자 또는 공급자 체인 지정
<a name="credentials-specify-provider"></a>

클라이언트 빌드를 사용하여 *기본* 자격 증명 공급자 체인과 다른 자격 증명 공급자를 지정할 수 있습니다.

[AWSCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/AWSCredentialsProvider.html) 인터페이스를 입력으로 사용하는 클라이언트 빌더에 자격 증명 공급자나 공급자 체인의 인스턴스를 제공합니다. 다음 예제는 특별히 *환경* 자격 증명을 사용하는 방법을 보여줍니다.

```
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                       .withCredentials(new EnvironmentVariableCredentialsProvider())
                       .build();
```

 AWS SDK for Java제공된 자격 증명 공급자 및 공급자 체인의 전체 목록은 [AWSCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/AWSCredentialsProvider.html)에서 **알려진 모든 구현 클래스**를 참조하세요.

**참고**  
이 기술을 활용하면 `AWSCredentialsProvider` 인터페이스를 구현하는 고유의 자격 증명 공급자를 사용하거나 [AWSCredentialsProviderChain](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/AWSCredentialsProviderChain.html) 클래스를 하위 클래스로 분류하여 자신이 생성하는 자격 증명 공급자 또는 공급자 체인을 제공할 수 있습니다.

## 임시 자격 증명을 명시적으로 지정
<a name="credentials-explicit"></a>

기본 자격 증명 체인이나 특정/사용자 지정 공급자 또는 공급자 체인이 코드에서 작동하지 않는 경우 명시적으로 제공하는 자격 증명을 설정할 수 있습니다. 를 사용하여 임시 자격 증명을 검색한 경우이 방법을 AWS STS사용하여 AWS 액세스를 위한 자격 증명을 지정합니다.

1. [BasicSessionCredentials](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/BasicSessionCredentials.html) 클래스를 인스턴스화하고 SDK가 연결에 사용할 액세스 키, AWS 비밀 키 및 AWS 세션 토큰을 제공합니다 AWS .

1. `AWSCredentials` 객체를 사용하여 [AWSStaticCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/AWSStaticCredentialsProvider.html)를 생성합니다.

1. `AWSStaticCredentialsProvider`를 사용하여 클라이언트 빌더를 구성하고 클라이언트를 빌드합니다.

다음은 예입니다.

```
BasicSessionCredentials awsCreds = new BasicSessionCredentials("access_key_id", "secret_key_id", "session_token");
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                        .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                        .build();
```

## 추가 정보
<a name="more-info"></a>
+  [IAM 사용자 가입 AWS 및 생성](signup-create-iam-user.md) 
+  [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md) 
+  [IAM 역할을 사용하여의 AWS 리소스에 대한 액세스 권한 부여 Amazon EC2](java-dg-roles.md) 

# AWS 리전 선택
<a name="java-dg-region-selection"></a>

리전을 사용하면 특정 지리적 영역에 물리적으로 상주하는 AWS 서비스에 액세스할 수 있습니다. 이는 중복성은 물론, 데이터와 애플리케이션을 고객과 고객의 사용자가 액세스할 위치에 가까운 곳에서 실행 상태로 유지하는 데도 유용할 수 있습니다.

## 리전에서 서비스 가용성 확인
<a name="region-selection-query-service"></a>

리전에서 특정를 AWS 서비스 사용할 수 있는지 확인하려면 사용하려는 리전에서 `isServiceSupported` 메서드를 사용합니다.

```
Region.getRegion(Regions.US_WEST_2)
    .isServiceSupported(AmazonDynamoDB.ENDPOINT_PREFIX);
```

지정할 수 있는 리전에 대한 [Regions](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/regions/Regions.html) 클래스 설명서를 참조하고, 쿼리할 서비스의 엔드포인트 접두사를 사용합니다. 각 서비스의 엔드포인트 접두사는 서비스 인터페이스에 정의되어 있습니다. 예를 들어 DynamoDB 엔드포인트 접두사는 [AmazonDynamoDB](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDB.html)에 정의됩니다.

## 리전 선택
<a name="region-selection-choose-region"></a>

버전 1.4부터 리전 이름을 지정 AWS SDK for Java하면 SDK가 자동으로 적절한 엔드포인트를 선택합니다. 엔드포인트를 직접 선택하려면 [Choosing a Specific Endpoint](#region-selection-choose-endpoint) 단원을 참조하십시오.

리전을 명시적으로 설정하려면 [Regions](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/regions/Regions.html) 열거형을 사용하는 것이 좋습니다. 이 열거형은 공개적으로 사용 가능한 모든 리전의 열거 값입니다. 열거형의 리전을 사용하여 클라이언트를 생성하려면 다음 코드를 사용합니다.

```
AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard()
                    .withRegion(Regions.US_WEST_2)
                    .build();
```

사용할 리전이 `Regions` 열거형에 없으면 리전 이름을 나타내는 *문자열*을 사용하여 리전을 설정할 수 있습니다.

```
AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard()
                    .withRegion("{region_api_default}")
                    .build();
```

**참고**  
빌더를 사용하여 클라이언트를 빌드한 후에는 클라이언트가 *변경 불가능*하며 리전을 *변경할 수 없습니다*. 동일한 서비스에 AWS 리전 대해 여러를 사용하는 경우 리전당 하나씩 여러 클라이언트를 생성해야 합니다.

## 특정 엔드포인트 선택
<a name="region-selection-choose-endpoint"></a>

 AWS 클라이언트를 생성할 때 `withEndpointConfiguration` 메서드를 호출하여 리전 내의 *특정 엔드포인트*를 사용하도록 각 클라이언트를 구성할 수 있습니다.

예를 들어 유럽(아일랜드) 리전을 사용하도록 Amazon S3 클라이언트를 구성하려면 다음 코드를 사용합니다.

```
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
     .withEndpointConfiguration(new EndpointConfiguration(
          "https://s3.eu-west-1.amazonaws.com",
          "eu-west-1"))
     .withCredentials(CREDENTIALS_PROVIDER)
     .build();
```

현재 [리전 목록과](https://docs.aws.amazon.com/general/latest/gr/rande.html) 모든 AWS 서비스에 해당하는 엔드포인트는 리전 및 엔드포인트를 참조하세요.

## 환경에서 리전을 자동으로 결정
<a name="automatically-determine-the-aws-region-from-the-environment"></a>

**중요**  
이 섹션은 [클라이언트 빌더](creating-clients.md)를 사용하여 AWS 서비스에 액세스하는 경우에만 적용됩니다. AWS 클라이언트 생성자를 사용하여 생성된 클라이언트는 환경에서 리전을 자동으로 결정하지 않고 대신 *기본* SDK 리전(USEast1)을 사용합니다.

 Amazon EC2 또는 Lambda에서 실행할 때 코드가 실행 중인 리전과 동일한 리전을 사용하도록 클라이언트를 구성할 수 있습니다. 이렇게 하면 실행 중인 환경에서 코드가 분리되므로 낮은 지연 시간과 중복성을 위해 손쉽게 애플리케이션을 여러 리전에 배포할 수 있습니다.

 *코드를 실행 중인 리전을 SDK에서 자동으로 검색하도록 하려면 클라이언트 빌더를 사용해야 합니다.*

기본 자격 증명/리전 공급자 체인을 사용하여 환경에서 리전을 결정하려면 클라이언트 빌더의 `defaultClient` 메서드를 사용합니다.

```
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();
```

이렇게 하면 `standard` 뒤에 `build`를 사용할 때와 똑같이 작동합니다.

```
AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard()
                    .build();
```

`withRegion` 메서드를 사용하여 리전을 명시적으로 설정하지 않는 경우 SDK에서는 기본 리전 공급자 체인을 조회하여 사용할 리전을 시도 및 결정합니다.

### 기본 리전 공급자 체인
<a name="default-region-provider-chain"></a>

 **다음은 리전 조회 프로세스입니다.**

1. 빌더 자체에 대해 `withRegion` 또는 `setRegion`을 사용하여 설정한 명시적 리전을 다른 어떤 것보다 우선합니다.

1. `AWS_REGION` 환경 변수를 확인합니다. 설정한 경우 클라이언트를 구성하는 데 해당 리전이 사용됩니다.
**참고**  
이 환경 변수는 Lambda 컨테이너에 의해 설정됩니다.

1. SDK는 AWS 공유 구성 파일(일반적으로에 위치)을 확인합니다`~/.aws/config`. *region* 속성이 있으면 SDK가 이 속성을 사용합니다.
   + `AWS_CONFIG_FILE` 환경 변수는 공유 구성 파일의 위치를 사용자 지정하는 데 사용할 수 있습니다.
   + `AWS_PROFILE` 환경 변수 또는 `aws.profile` 시스템 속성을 사용하여 SDK에서 로드하는 프로필을 사용자 지정할 수 있습니다.

1. SDK는 Amazon EC2 인스턴스 메타데이터 서비스를 사용하여 현재 실행 중인 Amazon EC2 인스턴스의 리전을 확인하려고 시도합니다.

1. 이때까지도 SDK에서 여전히 리전을 찾지 못한 경우 클라이언트 생성이 실패하고 예외가 발생합니다.

 AWS 애플리케이션을 개발할 때 일반적인 접근 방식은 *공유 구성 파일*([기본 자격 증명 공급자 체인 사용에서 설명](credentials.md#credentials-default))을 사용하여 로컬 개발을 위한 리전을 설정하고 기본 리전 공급자 체인을 사용하여 AWS 인프라에서 실행할 때 리전을 결정하는 것입니다. 이렇게 하면 클라이언트 생성 작업이 크게 간소화되며 애플리케이션을 이식 가능한 형태로 유지됩니다.

# 예외 처리
<a name="java-dg-exceptions"></a>

에서 예외가 AWS SDK for Java 발생하는 방법과 시기를 이해하는 것은 SDK를 사용하여 고품질 애플리케이션을 구축하는 데 중요합니다. 다음 단원에서는 SDK에서 발생하는 다양한 예외의 경우와 이러한 예외를 적절히 처리하는 방법에 대해 설명합니다.

## 확인되지 않은 예외가 발생하는 이유
<a name="why-unchecked-exceptions"></a>

는 다음과 같은 이유로 확인된 예외 대신 런타임(또는 확인되지 않은) 예외를 AWS SDK for Java 사용합니다.
+ 개발자가 중요하지 않은 예외 경우를 강제로 처리하지 않고 (또한 해당 코드를 상세 표시 모드로 설정하지 않고) 처리하고자 하는 오류에 대해서만 세부적으로 제어할 수 있도록 하기 위해
+ 대규모 애플리케이션에서 확인된 예외 고유의 확장성 문제를 방지하기 위해

일반적으로 확인된 예외는 소규모 애플리케이션에서 잘 작동하는 편이지만, 애플리케이션이 확장되고 복잡해짐에 따라 문제가 될 수도 있습니다.

확인 및 확인되지 않은 예외의 사용에 대한 자세한 내용은 다음을 참조하십시오.
+  [확인되지 않은 예외—논쟁](http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html) 
+  [The Trouble with Checked Exceptions](http://www.artima.com/intv/handcuffs2.html) 
+  [Java’s checked exceptions were a mistake (and here’s what I would like to do about it)](http://radio-weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html) 

## AmazonServiceException (및 관련 하위 클래스)
<a name="amazonserviceexception-and-subclasses"></a>

 [AmazonServiceException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/AmazonServiceException.html)은 AWS SDK for Java사용 시 일반적으로 발생하는 예외입니다. 이 예외는 AWS 서비스의 오류 응답을 나타냅니다. 예를 들어 존재하지 않는 Amazon EC2 인스턴스를 종료하려고 하면 EC2가 오류 응답을 반환하고 해당 오류 응답의 모든 세부 정보가 `AmazonServiceException` 발생한에 포함됩니다. 경우에 따라서는 개발자가 catch 블록을 통해 오류 경우 처리를 세부적으로 제어할 수 있도록 하기 위해 `AmazonServiceException`의 하위 클래스가 발생하기도 합니다.

가 발생하면 요청이 로 성공적으로 전송되었지만 성공적으로 처리할 수 AWS 서비스 없다는 것을 `AmazonServiceException`알 수 있습니다. 이는 요청의 파라미터 오류 또는 서비스 측의 문제로 인해 발생할 수 있습니다.

 `AmazonServiceException`은 다음과 같은 정보를 제공합니다.
+ 반환된 HTTP 상태 코드
+ 반환된 AWS 오류 코드
+ 서비스의 상세 오류 메시지
+  AWS 실패한 요청에 대한 요청 ID

 `AmazonServiceException` 에는 실패한 요청이 호출자의 오류(잘못된 값이 있는 요청)인지 또는 AWS 서비스오류(내부 서비스 오류)인지에 대한 정보도 포함되어 있습니다.

## AmazonClientException
<a name="amazonclientexception"></a>

 [AmazonClientException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/AmazonClientException.html)은 요청을 로 보내려고 하거나 응답을 구문 분석하려고 할 AWS 때 Java 클라이언트 코드 내에서 문제가 발생했음을 나타냅니다 AWS. `AmazonClientException`는 일반적으로 보다 심각`AmazonServiceException`하며 클라이언트가 서비스를 호출하지 못하게 하는 주요 문제를 나타냅니다 AWS . 예를 들어 클라이언트 중 하나에서 작업을 호출하려고 할 때 네트워크 연결을 사용할 수 없는 `AmazonClientException` 경우에서이 AWS SDK for Java 발생합니다.

# 비동기 프로그래밍
<a name="basics-async"></a>

*동기*식 또는 *비동기식* 메서드를 사용하여 AWS 서비스에서 작업을 호출할 수 있습니다. 비동기 메서드는 클라이언트가 서비스로부터 응답을 받을 때까지 스레드의 실행을 차단합니다. 비동기 메서드는 (값을) 즉시 반환하며, 응답을 기다리지 않고 제어 권한을 호출 스레드에 넘겨줍니다.

비동기 메서드는 응답이 제공되기 전에 (값을) 반환하므로 준비되었을 때 응답을 가져올 방법이 필요합니다. 는 *미래 객체*와 *콜백 메*서드라는 두 가지 방법을 AWS SDK for Java 제공합니다.

## Java Future
<a name="basics-async-future"></a>

의 비동기식 메서드는 향후 비동기식 작업의 결과가 포함된 [Future](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/Future.html) 객체를 AWS SDK for Java 반환합니다. ** 

서비스가 아직 응답 객체를 제공하지 않은 경우 `Future` `isDone()` 메서드를 호출합니다. 응답이 준비되면 `Future` `get()` 메서드를 호출하여 응답 객체를 가져올 수 있습니다. 이 메커니즘을 사용하면 애플리케이션이 계속 다른 작업을 수행하는 동안 비동기 작업의 결과를 정기적으로 폴링할 수 있습니다.

다음은 [InvokeResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/InvokeResult.html) 객체를 보유할 수 있는를 수신하여 Lambda 함수를 호출`Future`하는 비동기 작업의 예입니다. `InvokeResult` 객체는 `isDone()`이 `true`가 된 후에만 가져옵니다.

```
import com.amazonaws.services.lambda.AWSLambdaAsyncClient;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
import java.nio.ByteBuffer;
import java.util.concurrent.Future;
import java.util.concurrent.ExecutionException;

public class InvokeLambdaFunctionAsync
{
    public static void main(String[] args)
    {
        String function_name = "HelloFunction";
        String function_input = "{\"who\":\"SDK for Java\"}";

        AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient();
        InvokeRequest req = new InvokeRequest()
            .withFunctionName(function_name)
            .withPayload(ByteBuffer.wrap(function_input.getBytes()));

        Future<InvokeResult> future_res = lambda.invokeAsync(req);

        System.out.print("Waiting for future");
        while (future_res.isDone() == false) {
            System.out.print(".");
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                System.err.println("\nThread.sleep() was interrupted!");
                System.exit(1);
            }
        }

        try {
            InvokeResult res = future_res.get();
            if (res.getStatusCode() == 200) {
                System.out.println("\nLambda function returned:");
                ByteBuffer response_payload = res.getPayload();
                System.out.println(new String(response_payload.array()));
            }
            else {
                System.out.format("Received a non-OK response from {AWS}: %d\n",
                        res.getStatusCode());
            }
        }
        catch (InterruptedException | ExecutionException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        System.exit(0);
    }
}
```

## 비동기 콜백
<a name="basics-async-callback"></a>

Java `Future` 객체를 사용하여 비동기 요청 상태를 모니터링하는 방법 외에도, SDK는 [AsyncHandler](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/handlers/AsyncHandler.html) 인터페이스를 시용하는 클래스를 구현할 수 있습니다. `AsyncHandler`는 요청 완료 방식에 따라 호출되는 `onSuccess` 및 `onError`라는 두 가지 메서드를 제공합니다.

콜백 인터페이스 접근 방법의 주요 장점은 `Future` 객체를 폴링하여 요청 완료 시점을 알아낼 필요가 없다는 점입니다. 대신에 코드에서 다음 활동을 즉시 시작할 수 있으며, SDK에 의존하여 핸들러를 즉시 호출할 수 있습니다.

```
import com.amazonaws.services.lambda.AWSLambdaAsync;
import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
import com.amazonaws.handlers.AsyncHandler;
import java.nio.ByteBuffer;
import java.util.concurrent.Future;

public class InvokeLambdaFunctionCallback
{
    private class AsyncLambdaHandler implements AsyncHandler<InvokeRequest, InvokeResult>
    {
        public void onSuccess(InvokeRequest req, InvokeResult res) {
            System.out.println("\nLambda function returned:");
            ByteBuffer response_payload = res.getPayload();
            System.out.println(new String(response_payload.array()));
            System.exit(0);
        }

        public void onError(Exception e) {
            System.out.println(e.getMessage());
            System.exit(1);
        }
    }

    public static void main(String[] args)
    {
        String function_name = "HelloFunction";
        String function_input = "{\"who\":\"SDK for Java\"}";

        AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient();
        InvokeRequest req = new InvokeRequest()
            .withFunctionName(function_name)
            .withPayload(ByteBuffer.wrap(function_input.getBytes()));

        Future<InvokeResult> future_res = lambda.invokeAsync(req, new AsyncLambdaHandler());

        System.out.print("Waiting for async callback");
        while (!future_res.isDone() && !future_res.isCancelled()) {
            // perform some other tasks...
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                System.err.println("Thread.sleep() was interrupted!");
                System.exit(0);
            }
            System.out.print(".");
        }
    }
}
```

## 모범 사례
<a name="basics-async-tips"></a>

### 콜백 실행
<a name="callback-execution"></a>

`AsyncHandler`의 구현은 비동기 클라이언트가 소유하는 스레드 풀 내부에서 실행됩니다. 단기 실행 코드는 `AsyncHandler` 구현 내부에 적합합니다. 핸들러 메서드 내부에서 장기 실행 또는 차단 코드를 실행하면 비동기 클라이언트에 사용되는 스레드 풀에 대한 경합이 발생하여 클라이언트에서 요청을 실행할 수 없습니다. 콜백에서 시작해야 하는 장기 실행 작업이 있는 경우 콜백이 애플리케이션에 의해 관리되는 스레드 풀이나 새 스레드에서 작업을 실행하도록 하십시오.

### 스레드 풀 구성
<a name="thread-pool-configuration"></a>

의 비동기 클라이언트는 대부분의 애플리케이션에서 작동해야 하는 기본 스레드 풀을 AWS SDK for Java 제공합니다. 사용자 지정 [ExecutorService](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/ExecutorService.html)를 구현하고 AWS SDK for Java 비동기 클라이언트에 전달하여 스레드 풀 관리 방법을 더 잘 제어할 수 있습니다.

예를 들어 사용자 지정 [ThreadFactory](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/ThreadFactory.html)를 사용하여 풀의 스레드 이름 지정 방식을 제어하거나 스레드 사용에 대한 추가 정보를 기록하는 `ExecutorService` 구현을 제공할 수 있습니다.

### 비동기 액세스
<a name="s3-asynchronous-access"></a>

SDK의 [TransferManager](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/TransferManager.html) 클래스는 작업에 대한 비동기 지원을 제공합니다 Amazon S3.는 비동기 업로드 및 다운로드를 `TransferManager` 관리하고, 전송에 대한 자세한 진행 상황 보고를 제공하고, 다양한 이벤트에 대한 콜백을 지원합니다.

# AWS SDK for Java 통화 로깅
<a name="java-dg-logging"></a>

 AWS SDK for Java 는 런타임 시 여러 로깅 시스템 중 하나를 사용할 수 있는 추상화 계층인 [Apache Commons Logging](http://commons.apache.org/proper/commons-logging/guide.html)으로 계측됩니다.

지원되는 로깅 시스템에는 Java Logging Framework와 Apache Log4j 등이 있습니다. 이 주제에서는 Log4j 사용법을 보여줍니다. 애플리케이션 코드를 변경하지 않고 SDK의 로깅 기능을 사용할 수 있습니다.

[Log4j](http://logging.apache.org/log4j/2.x/)에 대해 자세히 알아보려면 [Apache 웹 사이트](http://www.apache.org/)를 참조하십시오.

**참고**  
이 항목에서는 Log4j 1.x에 초점을 맞춰 설명합니다. Log4j2는 Apache Commons Logging을 직접 지원하지 않지만, Apache Commons Logging 인터페이스를 사용하는 Log4j2에 로깅 호출을 자동으로 전달하는 어댑터를 제공합니다. 자세한 내용은 Log4j2 설명서의 [Commons Logging Bridge](https://logging.apache.org/log4j/2.x/log4j-jcl.html)을 참조하십시오.

## Log4J JAR 다운로드
<a name="download-the-log4j-jar"></a>

SDK에서 Log4j를 사용하려면 Apache 웹 사이트에서 Log4j JAR를 다운로드해야 합니다. SDK에는 이 JAR이 포함되지 않습니다. JAR 파일을 classpath의 위치 중 하나로 복사합니다.

Log4j는 구성 파일인 log4j.properties를 사용합니다. 아래에는 예제 구성 파일이 나와 있습니다. 이 구성 파일을 classpath의 디렉터리 중 하나로 복사합니다. Log4j JAR과 log4j.properties 파일이 동일한 디렉터리 안에 있지 않아도 됩니다.

log4j.properties 구성 파일은 [로깅 수준](http://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers), 로깅 출력이 전송될 대상(예를 들면, [파일 또는 콘솔](http://logging.apache.org/log4j/2.x/manual/appenders.html)), [출력 형식](http://logging.apache.org/log4j/2.x/manual/layouts.html) 같은 속성을 지정합니다. 로깅 수준은 로거가 생성되는 출력의 세부 수준입니다. Log4j는 여러 로깅 *계층*의 개념을 지원합니다. 로깅 수준은 각 계층마다 독립적으로 설정됩니다. AWS SDK for Java에서는 다음과 같은 두 가지 로깅 계층을 사용할 수 있습니다.
+ log4j.logger.com.amazonaws
+ log4j.logger.org.apache.http.wire

## Classpath 설정
<a name="sdk-net-logging-classpath"></a>

Log4j JAR 및 log4j.properties 파일 둘 다 classpath에 있어야 합니다. [Apache Ant](http://ant.apache.org/manual/)를 사용 중인 경우 Ant 파일의 `path` 요소에서 classpath를 설정합니다. 다음 예제에서는 SDK에 포함된 Amazon S3 [예제](https://github.com/aws/aws-sdk-java/blob/master/src/samples/AmazonS3/build.xml)에 대한 Ant 파일의 경로 요소를 보여줍니다.

```
<path id="aws.java.sdk.classpath">
  <fileset dir="../../third-party" includes="**/*.jar"/>
  <fileset dir="../../lib" includes="**/*.jar"/>
  <pathelement location="."/>
</path>
```

Eclipse IDE를 사용 중인 경우 메뉴를 열고 **프로젝트** \$1 **속성** \$1 **Java Build 경로**로 이동하여 classpath를 설정할 수 있습니다.

## 서비스 관련 오류 및 경고
<a name="sdk-net-logging-service"></a>

클라이언트 라이브러리의 중요 메시지를 수집할 수 있도록 항상 "com.amazonaws" 로거 계층을 "WARN"로 설정된 상태로 유지하는 것이 좋습니다. 예를 들어 Amazon S3 클라이언트가 애플리케이션이를 제대로 닫지 않았고 리소스가 유출될 `InputStream` 수 있음을 감지하면 S3 클라이언트는 경고 메시지를 통해 이를 로그에 보고합니다. 또한 클라이언트에 요청 또는 응답 처리 문제가 발생하는 경우에도 메시지가 기록됩니다.

다음 log4j.properties 파일에서는 `rootLogger`를 WARN으로 설정하므로 "com.amazonaws"에 있는 모든 로거의 경고 및 오류가 포함됩니다. 또는 com.amazonaws 로거를 WARN으로 명시적으로 설정할 수도 있습니다.

```
log4j.rootLogger=WARN, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c -  %m%n
# Or you can explicitly enable WARN and ERROR messages for the {AWS} Java clients
log4j.logger.com.amazonaws=WARN
```

## 요청/응답 요약 로깅
<a name="sdk-net-logging-request-response"></a>

에 대한 모든 요청은가 요청을 AWS 서비스 처리하는 방식에 문제가 발생할 경우 유용한 고유한 AWS 요청 ID를 AWS 서비스 생성합니다. AWS 요청 IDs는 실패한 서비스 호출에 대해 SDK의 예외 객체를 통해 프로그래밍 방식으로 액세스할 수 있으며 "com.amazonaws.request" 로거의 DEBUG 로그 수준을 통해 보고할 수도 있습니다.

다음 log4j.properties 파일을 사용하면 요청 ID를 포함한 AWS 요청 및 응답을 요약할 수 있습니다. IDs

```
log4j.rootLogger=WARN, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c -  %m%n
# Turn on DEBUG logging in com.amazonaws.request to log
# a summary of requests/responses with {AWS} request IDs
log4j.logger.com.amazonaws.request=DEBUG
```

다음은 로그 출력의 예입니다.

```
2009-12-17 09:53:04,269 [main] DEBUG com.amazonaws.request - Sending
Request: POST https://rds.amazonaws.com / Parameters: (MaxRecords: 20,
Action: DescribeEngineDefaultParameters, SignatureMethod: HmacSHA256,
AWSAccessKeyId: ACCESSKEYID, Version: 2009-10-16, SignatureVersion: 2,
Engine: mysql5.1, Timestamp: 2009-12-17T17:53:04.267Z, Signature:
q963XH63Lcovl5Rr71APlzlye99rmWwT9DfuQaNznkD, ) 2009-12-17 09:53:04,464
[main] DEBUG com.amazonaws.request - Received successful response: 200, {AWS}
Request ID: 694d1242-cee0-c85e-f31f-5dab1ea18bc6 2009-12-17 09:53:04,469
[main] DEBUG com.amazonaws.request - Sending Request: POST
https://rds.amazonaws.com / Parameters: (ResetAllParameters: true, Action:
ResetDBParameterGroup, SignatureMethod: HmacSHA256, DBParameterGroupName:
java-integ-test-param-group-0000000000000, AWSAccessKeyId: ACCESSKEYID,
Version: 2009-10-16, SignatureVersion: 2, Timestamp:
2009-12-17T17:53:04.467Z, Signature:
9WcgfPwTobvLVcpyhbrdN7P7l3uH0oviYQ4yZ+TQjsQ=, )

2009-12-17 09:53:04,646 [main] DEBUG com.amazonaws.request - Received
successful response: 200, {AWS} Request ID:
694d1242-cee0-c85e-f31f-5dab1ea18bc6
```

## 상세 표시 유선 로깅
<a name="sdk-net-logging-verbose"></a>

경우에 따라가 AWS SDK for Java 보내고 받는 정확한 요청과 응답을 확인하는 것이 유용할 수 있습니다. 대용량 요청(예: 업로드되는 파일 Amazon S3) 또는 응답을 쓰면 애플리케이션이 크게 느려질 수 있으므로 프로덕션 시스템에서이 로깅을 활성화해서는 안 됩니다. 실이 정보에 반드시 액세스해야 하는 경우에는 Apache HttpClient 4 로거를 통해 일시적으로 활성화할 수 있습니다. `org.apache.http.wire` 로거에서 DEBUG 수준을 활성화하면 모든 요청 및 응답 데이터에 대한 로깅이 활성화됩니다.

다음 log4j.properties 파일은 Apache HttpClient 4의 전체 유선 로깅을 설정하며 이렇게 할 경우 애플리케이션의 성능에 크게 영향을 줄 수 있으므로 일시적으로만 설정해야 합니다.

```
log4j.rootLogger=WARN, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c -  %m%n
# Log all HTTP content (headers, parameters, content, etc)  for
# all requests and responses. Use caution with this since it can
# be very expensive to log such verbose data!
log4j.logger.org.apache.http.wire=DEBUG
```

## 지연 시간 지표 로깅
<a name="sdk-latency-logging"></a>

문제를 해결하고 어떤 프로세스가 가장 많은 시간이 걸리는지 또는 서버 또는 클라이언트 측에서 더 긴 지연 시간을 가지는지와 같은 지표를 확인하려면 지연 시간 로거가 유용할 수 있습니다. 이 로거를 활성화하려면 `com.amazonaws.latency` 로거를 DEBUG로 설정합니다.

**참고**  
이 로거는 SDK 지표가 활성화된 경우에만 사용할 수 있습니다. SDK 지표 패키지에 대한 자세한 내용은 [AWS SDK for Java를 위한 지표 활성화](generating-sdk-metrics.md)를 참조하세요.

```
log4j.rootLogger=WARN, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c -  %m%n
log4j.logger.com.amazonaws.latency=DEBUG
```

다음은 로그 출력의 예입니다.

```
com.amazonaws.latency - ServiceName=[{S3}], StatusCode=[200],
ServiceEndpoint=[https://list-objects-integ-test-test.s3.amazonaws.com],
RequestType=[ListObjectsV2Request], AWSRequestID=[REQUESTID], HttpClientPoolPendingCount=0,
RetryCapacityConsumed=0, HttpClientPoolAvailableCount=0, RequestCount=1,
HttpClientPoolLeasedCount=0, ResponseProcessingTime=[52.154], ClientExecuteTime=[487.041],
HttpClientSendRequestTime=[192.931], HttpRequestTime=[431.652], RequestSigningTime=[0.357],
CredentialsRequestTime=[0.011, 0.001], HttpClientReceiveResponseTime=[146.272]
```

# 클라이언트 구성
<a name="section-client-configuration"></a>

를 AWS SDK for Java 사용하면 기본 클라이언트 구성을 변경할 수 있으며, 이는 다음을 수행할 때 유용합니다.
+ 프록시를 통해 인터넷에 연결
+ 연결 제한 시간 및 요청 재시도 등 HTTP 전송 설정 변경
+ TCP 소켓 버퍼 크기 힌트 지정

## 프록시 구성
<a name="proxy-configuration"></a>

클라이언트 객체를 생성할 때 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html) 객체(선택 사항)를 전달하여 클라이언트 구성을 사용자 지정할 수 있습니다.

프록시 서버를 통해 인터넷에 연결하는 경우 `ClientConfiguration` 객체를 통해 프록시 서버 설정(프록시 호스트, 포트 및 사용자 이름/암호)을 구성해야 합니다.

## HTTP 전송 구성
<a name="http-transport-configuration"></a>

[ClientConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html) 객체를 사용하여 여러 HTTP 전송 옵션을 구성할 수 있습니다. 새 옵션이 가끔 추가됩니다. 검색하거나 설정할 수 있는 옵션의 전체 목록을 보려면 AWS SDK for Java API 참조를 참조하세요.

**참고**  
각각의 구성 가능한 값마다 기본값이 상수로 정의되어 있습니다. 의 상수 값 목록은 AWS SDK for Java API `ClientConfiguration`참조의 [상수 필드 값을](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/constant-values.html) 참조하세요.

### 최대 연결 수
<a name="maximum-connections"></a>

[ClientConfiguration.setMaxConnections](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html#setMaxConnections-int-) 메서드를 사용하여 허용되는 최대 열린 HTTP 연결 수를 설정할 수 있습니다.

**중요**  
연결 충돌과 성능 저하를 방지하기 위해 최대 연결 수를 동시 트랜잭션 수에 맞게 설정합니다. 기본 최대 연결 값은 AWS SDK for Java API 참조의 [상수 필드 값을](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/constant-values.html) 참조하세요.

### 제한 시간 및 오류 처리
<a name="timeouts-and-error-handling"></a>

HTTP 연결 제한 시간 및 오류 처리와 관련된 옵션을 설정할 수 있습니다.
+  **연결 제한 시간** 

  연결 제한 시간은 HTTP 연결 시 연결 시도를 포기하기 전에 연결이 설정될 때까지 기다리는 시간(밀리초)입니다. 기본값은 10,000ms입니다.

  이 값을 자신이 직접 설정하려면 [ClientConfiguration.setConnectionTimeout](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html#setConnectionTimeout-int-) 메서드를 사용하십시오.
+  **연결 TTL(Time to Live)** 

  기본적으로 SDK에서는 최대한 오랫동안 HTTP 연결을 재사용하려고 합니다. 서비스가 불가능한 서버에 연결이 설정된 실패 상황에서는 유한 TTL을 설정하는 것이 애플리케이션을 복구하는 데 도움이 될 수 있습니다. 예를 들어 TTL을 15분으로 설정하면 문제가 발생한 서버에 연결이 설정된 경우라도 15분 내에 새 서버와의 연결이 다시 설정됩니다.

  HTTP 연결 TTL을 설정하려면 [ClientConfiguration.setConnectionTTL](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html#setConnectionTTL-long-) 메서드를 사용하십시오.
+  **최대 오류 재시도 횟수** 

  재설정 가능한 오류의 기본 최대 재시도 수는 3입니다. [ClientConfiguration.setMaxErrorRetry](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html#setMaxErrorRetry-int-) 메서드를 사용하여 다른 값을 설정할 수 있습니다.

### 로컬 주소
<a name="local-address"></a>

HTTP 클라이언트가 바인딩될 로컬 주소를 설정하려면 [ClientConfiguration.setLocalAddress](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html#setLocalAddress-java.net.InetAddress-)를 사용하십시오.

## TCP 소켓 버퍼 크기 힌트
<a name="tcp-socket-buffer-size-hints"></a>

하위 수준의 TCP 파라미터를 튜닝하려는 고급 사용자는 [ClientConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/ClientConfiguration.html) 객체를 통해 TCP 버퍼 크기 힌트를 추가로 설정할 수 있습니다. 대부분의 사용자는 이러한 값을 변경할 필요가 없으며, 이 기능은 고급 사용자용으로 제공됩니다.

애플리케이션용 TCP 버퍼 크기(선택 사항)는 주로 네트워크와 운영 체제 구성 및 기능에 따라 결정됩니다. 예를 들면, 대부분의 현대식 운영 체제는 TCP 버퍼 크기에 대해 자동 튜닝 논리를 제공하는데, 이는 자동 튜닝을 통해 버퍼 크기를 최적화할 수 있을 만큼 TCP 연결이 충분히 오랫동안 열린 상태로 유지되어야 하므로 TCP 연결성능에 큰 영향을 미칠 수 있습니다.

대형 버퍼 크기(예: 2MB)를 사용하면 운영 체제는 원격 서버에서 해당 정보 수신 여부를 확인할 필요가 없으므로 메모리 더 많은 데이터를 버퍼링할 수 있으며, 이는 네트워크 지연 시간이 긴 경우에 특히 유용합니다.

이 옵션은 *힌트*일 뿐, 운영 체제에서는 인식하지 못할 수도 있습니다. 이 옵션을 사용하는 경우 사용자는 운영 체제의 구성된 제한 및 기본값을 항상 확인해야 합니다. 대부분의 운영 체제에는 최대 TCP 버퍼 크기 제한이 구성되어 있으므로, 최대 TCP 버퍼 크기 제한을 명시적으로 높이지 않는 한 해당 제한을 초과할 수 없습니다.

다음과 같은 여러 리소스는 TCP 버퍼 크기와 운영 체제별 TCP 설정을 구성하는 데 도움이 됩니다.
+  [호스트 튜닝](http://fasterdata.es.net/host-tuning/) 

# 액세스 제어 정책
<a name="java-dg-access-control"></a>

 AWS *액세스 제어 정책을* 사용하면 AWS 리소스에 대한 세분화된 액세스 제어를 지정할 수 있습니다. 액세스 제어 정책은 다음과 같은 형태의 *문* 모음으로 이루어집니다.

 *계정 A*에는 *조건 D*가 적용되는 *리소스 C*에서 *작업 B*를 수행할 권한이 있습니다.

위치:
+  **는 보안 *주체* - AWS 리소스 중 하나에 액세스하거나 리소스 중 하나를 수정하도록 요청하는 AWS 계정 입니다.
+  *B*는 *작업* - Amazon SQS 대기열에 메시지를 보내거나 Amazon S3 버킷에 객체를 저장하는 등 AWS 리소스에 액세스하거나 수정하는 방식입니다.
+  *C*는 *리소스* - Amazon SQS 대기열 또는 저장된 객체와 같이 보안 주체가 액세스하려는 AWS 엔터티입니다 Amazon S3.
+  *D*는 *조건 집합*, 즉 주체가 리소스에 액세스할 수 있도록 허용하거나 거부할 시기를 지정하는 선택적 제약 조건입니다. 여러 표현식 조건을 사용할 수 있는 일부 각 서비스에 국한됩니다. 예를 들면, 날짜 조건을 사용하여 특정 시간 이후 또는 이전에만 리소스에 대한 액세스를 허용할 수 있습니다.

## Amazon S3 예제
<a name="s3-example"></a>

다음 예제는 누구나 버킷의 모든 객체를 읽을 수 있도록 허용하지만 해당 버킷에 객체를 업로드할 수 있는 액세스를 (버킷 소유자의 계정 외에도) 두 개의 특정 AWS 계정로 제한하는 정책을 보여줍니다.

```
Statement allowPublicReadStatement = new Statement(Effect.Allow)
    .withPrincipals(Principal.AllUsers)
    .withActions(S3Actions.GetObject)
    .withResources(new S3ObjectResource(myBucketName, "*"));
Statement allowRestrictedWriteStatement = new Statement(Effect.Allow)
    .withPrincipals(new Principal("123456789"), new Principal("876543210"))
    .withActions(S3Actions.PutObject)
    .withResources(new S3ObjectResource(myBucketName, "*"));

Policy policy = new Policy()
    .withStatements(allowPublicReadStatement, allowRestrictedWriteStatement);

AmazonS3 s3 = AmazonS3ClientBuilder.defaultClient();
s3.setBucketPolicy(myBucketName, policy.toJson());
```

## Amazon SQS 예제
<a name="sqs-example"></a>

정책의 일반적인 사용 중 하나는 Amazon SQS 대기열이 Amazon SNS 주제에서 메시지를 수신하도록 권한을 부여하는 것입니다.

```
Policy policy = new Policy().withStatements(
    new Statement(Effect.Allow)
        .withPrincipals(Principal.AllUsers)
        .withActions(SQSActions.SendMessage)
        .withConditions(ConditionFactory.newSourceArnCondition(myTopicArn)));

Map queueAttributes = new HashMap();
queueAttributes.put(QueueAttributeName.Policy.toString(), policy.toJson());

AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
sqs.setQueueAttributes(new SetQueueAttributesRequest(myQueueUrl, queueAttributes));
```

## Amazon SNS 예제
<a name="sns-example"></a>

일부 서비스는 정책에 사용할 수 있는 추가 조건을 제공합니다. Amazon SNS는 주제 구독 요청의 프로토콜(예: 이메일, HTTP, HTTPS Amazon SQS) 및 엔드포인트(예: 이메일 주소, URL, Amazon SQS ARN)를 기반으로 SNS 주제에 대한 구독을 허용하거나 거부하는 조건을 제공합니다.

```
Condition endpointCondition =
    SNSConditionFactory.newEndpointCondition("*@mycompany.com");

Policy policy = new Policy().withStatements(
    new Statement(Effect.Allow)
        .withPrincipals(Principal.AllUsers)
        .withActions(SNSActions.Subscribe)
        .withConditions(endpointCondition));

AmazonSNS sns = AmazonSNSClientBuilder.defaultClient();
sns.setTopicAttributes(
    new SetTopicAttributesRequest(myTopicArn, "Policy", policy.toJson()));
```

# DNS 이름 조회를 위한 JVM TTL 설정
<a name="jvm-ttl-dns"></a>

Java 가상 머신(JVM)은 DNS 이름 조회를 캐시합니다. JVM은 호스트 이름을 IP 주소로 확인하는 경우 *Time-To-Live*(TTL)라고 하는 지정된 기간 동안 IP 주소를 캐시합니다.

 AWS 리소스는 가끔 변경되는 DNS 이름 항목을 사용하므로 TTL 값이 5초인 JVM을 구성하는 것이 좋습니다. 이렇게 하면 리소스의 IP 주소가 변경될 때 애플리케이션이 DNS를 다시 쿼리하여 리소스의 새 IP 주소를 수신하고 사용할 수 있습니다.

일부 Java 구성에서는 JVM이 다시 시작될 때까지 DNS 항목을 새로 고치지 *않도록* JVM 기본 TTL이 설정되기도 합니다. 따라서 애플리케이션이 실행되는 동안 AWS 리소스의 IP 주소가 변경되면 JVM을 *수동으로 다시* 시작하고 캐시된 IP 정보가 새로 고쳐질 때까지 해당 리소스를 사용할 수 없습니다. 이 경우 캐시된 IP 정보를 정기적으로 새로 고치도록 JVM의 TTL을 설정해야 합니다.

## JVM TTL을 설정하는 방법
<a name="how-to-set-the-jvm-ttl"></a>

JVM의 TTL을 수정하려면 [networkaddress.cache.ttl](https://docs.oracle.com/en/java/javase/17/core/java-networking.html#GUID-A680DADB-C4C1-40F1-B568-D9A97C917F5D) 보안 속성 값을 설정합니다. `networkaddress.cache.ttl`는 시스템 *속성이 아닌 보안* 속성입니다. 즉, `-D` 명령줄 플래그로 설정할 수 없습니다.

### 옵션 1: 애플리케이션에서 프로그래밍 방식으로 설정
<a name="set-ttl-programmatically"></a>

애플리케이션 시작 [https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/security/Security.html](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/security/Security.html) 초기, AWS SDK 클라이언트가 생성되기 전 및 네트워크 요청이 이루어지기 전에를 호출합니다.

```
import java.security.Security;

public class MyApplication {
    public static void main(String[] args) {
        Security.setProperty("networkaddress.cache.ttl", "5");

        // ... create SDK clients and run application
    }
}
```

### 옵션 2: java.security 파일에서 설정
<a name="set-ttl-java-security-file"></a>

Java 8용 `$JAVA_HOME/jre/lib/security/java.security` 파일 또는 Java 11 이상의 `$JAVA_HOME/conf/security/java.security` 파일에서 `networkaddress.cache.ttl` 속성을 설정합니다.

다음은 5초로 설정된 TTL 캐시를 보여주는 `java.security` 파일의 코드 조각입니다.

```
#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
...
networkaddress.cache.ttl=5
...
```

`$JAVA_HOME` 환경 변수로 표시되는 JVM에서 실행되는 모든 애플리케이션은이 설정을 사용합니다.

### 옵션 3: JDK 시스템 속성 대체 사용(명령줄)
<a name="set-ttl-system-property"></a>

보안 구성 또는 코드를 수정할 수 없는 경우 JDK 시스템 속성을 사용할 수 있습니다. 보안 속성이 정의되지 않은 경우 폴백 역할을 합니다.
+ `sun.net.inetaddr.ttl` - 성공적인 조회 제어(긍정 TTL)
+ `sun.net.inetaddr.negative.ttl` - 실패한 조회 제어(음의 TTL)

```
java -Dsun.net.inetaddr.ttl=5 -Dsun.net.inetaddr.negative.ttl=1 -jar myapp.jar
```

**참고**  
이는 "향후 릴리스에서 지원되지 않을 수 있음"이라는 프라이빗 속성으로 [Oracle Java 8 네트워킹 속성](https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html) 참조에 문서화된 JDK 내부 속성입니다. 가능하면 옵션 1-2를 사용합니다.

# 에 대한 지표 활성화 AWS SDK for Java
<a name="generating-sdk-metrics"></a>

는 다음을 측정하는 [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/)를 사용하여 시각화 및 모니터링을 위한 지표를 생성할 AWS SDK for Java 수 있습니다.
+ 에 액세스할 때 애플리케이션의 성능 AWS 
+ 와 함께 사용할 때 JVMs의 성능 AWS 
+ 힙 메모리, 스레드 수 및 열었던 파일 설명자 등 실행 시간 환경 세부 정보

## SDK 지표 생성을 활성화하는 방법
<a name="how-to-enable-sdk-java-metric-generation"></a>

SDK가 지표를 CloudWatch로 전송할 수 있도록 하려면 다음과 같은 Maven 종속성을 추가해야 합니다.

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-bom</artifactId>
      <version>1.12.490*</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-cloudwatchmetrics</artifactId>
    <scope>provided</scope>
  </dependency>
  <!-- Other SDK dependencies. -->
</dependencies>
```

 \$1버전 번호를 [Maven Central](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)에서 사용할 수 있는 최신 버전의 SDK로 교체하세요.

AWS SDK for Java 지표는 *기본적으로 비활성화*되어 있습니다. 로컬 개발 환경에서 활성화하려면 JVM을 시작할 때 AWS 보안 자격 증명 파일을 가리키는 시스템 속성을 포함합니다. 예제:

```
-Dcom.amazonaws.sdk.enableDefaultMetrics=credentialFile=/path/aws.properties
```

SDK에서 향후 분석을 위해 수집된 데이터 포인트를 CloudWatch로 업로드할 수 있도록 자격 증명 파일에 대한 경로를 지정해야 합니다.

**참고**  
 Amazon EC2 인스턴스 메타데이터 서비스를 사용하여 Amazon EC2 인스턴스 AWS 에서에 액세스하는 경우 자격 증명 파일을 지정할 필요가 없습니다. 이 경우에는 다음 항목만 지정하면 됩니다.  

```
-Dcom.amazonaws.sdk.enableDefaultMetrics
```

에서 캡처한 모든 지표 AWS SDK for Java 는 네임스페이스 **AWSSDK/Java** 아래에 있으며 CloudWatch 기본 리전(*us-east-1*)에 업로드됩니다. 리전을 변경하려면 시스템 속성에서 `cloudwatchRegion` 속성을 사용하여 지정합니다. 예를 들어, CloudWatch 지역을 *us-east-1*로 설정하려면 다음을 사용하세요.

```
-Dcom.amazonaws.sdk.enableDefaultMetrics=credentialFile=/path/aws.properties,cloudwatchRegion={region_api_default}
```

기능을 활성화하면 AWS 에서 AWS SDK for Java에 대한 서비스 요청이 있을 때마다 지표 데이터 포인트가 생성되고 통계 요약을 위해 대기열에 추가되며 약 1분마다 CloudWatch에 비동기적으로 업로드됩니다. 지표는 업로드되고 나면 [AWS Management Console](https://console.aws.amazon.com/console/home)을 사용하여 시각화할 수 있으며, 메모리 누출, 파일 설명자 누출 등 잠재적인 문제에 대한 경보를 설정할 수 있습니다.

## 사용 가능한 지표 유형
<a name="available-metric-types"></a>

기본 지표 세트는 세 가지 주요 범주로 나눠집니다.

 AWS 지표 요청  
+ HTTP 요청/응답 지연 시간, 요청 수, 예외 및 재시도 등을 포함합니다.  
![\[RequestMetric 131111\]](http://docs.aws.amazon.com/ko_kr/sdk-for-java/v1/developer-guide/images/RequestMetric-131111.png)

 AWS 서비스 지표  
+ S3 업로드 및 다운로드의 처리량 및 바이트 수와 같은 AWS 서비스특정 데이터를 포함합니다.  
![\[ServiceMetric 131111\]](http://docs.aws.amazon.com/ko_kr/sdk-for-java/v1/developer-guide/images/ServiceMetric-131111.png)

머신 지표  
+ 힙 메모리, 스레드 수 및 열린 파일 설명자 등 실행 시간 환경을 포함합니다.  
![\[MachineMetric 131111\]](http://docs.aws.amazon.com/ko_kr/sdk-for-java/v1/developer-guide/images/MachineMetric-131111.png)

  머신 지표를 제외하려면 `excludeMachineMetrics`를 시스템 속성에 추가합니다.

  ```
  -Dcom.amazonaws.sdk.enableDefaultMetrics=credentialFile=/path/aws.properties,excludeMachineMetrics
  ```

## 추가 정보
<a name="more-information"></a>
+ 미리 정의된 핵심 지표 유형의 전체 목록은 [amazonaws/metrics package summary](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/metrics/package-summary.html)를 참조하십시오.
+ 를 사용한 CloudWatch 예제 AWS SDK for Java 에서 [를 사용한 CloudWatch AWS SDK for Java](examples-cloudwatch.md)작업에 대해 알아봅니다.
+ [복원력 개선을 AWS SDK for Java 위한 조정 블로그 게시물에서 성능 튜닝에](https://aws.amazon.com/blogs/developer/tuning-the-aws-sdk-for-java-to-improve-resiliency) 대해 자세히 알아보세요.