

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

# AWS SDK for Java 2.x에서 클라이언트 엔드포인트 구성
<a name="endpoint-config"></a>

SDK for Java 2.x는 서비스 엔드포인트를 구성하는 다양한 방법을 제공합니다. 엔드포인트는 SDK가 AWS 서비스에 대한 API 호출을 만드는 데 사용되는 URL입니다. 기본적으로 SDK는 구성한 AWS 리전에 따라 각 서비스에 적절한 엔드포인트를 자동으로 결정합니다. 그러나 이러한 엔드포인트를 사용자 지정하거나 재정의해야 하는 시나리오가 있습니다.
+ 로컬 또는 서드 파티 서비스 구현 작업(예: LocalStack)
+ 프록시 또는 VPC 엔드포인트를 통해 AWS 서비스에 연결
+ 베타 또는 시험판 서비스 엔드포인트에 대한 테스트

## 엔드포인트 구성 옵션
<a name="endpoint-configuration-options"></a>

 AWS SDK for Java 2.x는 엔드포인트를 구성하는 몇 가지 방법을 제공합니다.
+ 서비스 클라이언트 빌더를 사용한 코드 내 구성
+ 환경 변수를 사용한 외부 구성
+ JVM 시스템 속성을 사용한 외부 구성
+ 공유 AWS 구성 파일을 사용한 외부 구성

## 코드 내 엔드포인트 구성
<a name="in-code-endpoint-configuration"></a>

### `endpointOverride` 사용하기
<a name="endpoint-override"></a>

 엔드포인트를 구성하는 가장 직접적인 방법은 서비스 클라이언트 빌더에서 `endpointOverride` 메서드를 사용하는 것입니다. 이 메서드는 사용자 지정 엔드포인트 URL을 나타내는 `URI` 객체를 허용합니다.

**Example Amazon S3 클라이언트에 대한 사용자 지정 엔드포인트 설정**  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import java.net.URI;

S3Client s3 = S3Client.builder()
        .region(Region.US_WEST_2)
        .endpointOverride(URI.create("https://my-custom-s3-endpoint.example.com"))
        .build();
```

`endpointOverride`를 사용할 때 엔드포인트가 명시적으로 설정되더라도 클라이언트의 리전을 지정해야 합니다. 리전은 요청에 서명하는 데 사용됩니다.

### 엔드포인트 검색
<a name="endpoint-discovery"></a>

일부 AWS 서비스는 SDK가 사용할 최적의 엔드포인트를 자동으로 검색할 수 있는 엔드포인트 검색을 지원합니다. 서비스 클라이언트 빌더에서 `endpointDiscoveryEnabled` 메서드를 사용하여 이 기능을 사용하거나 사용 해제할 수 있습니다.

**Example DynamoDB 클라이언트에 대한 엔드포인트 검색 사용**  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

DynamoDbClient dynamoDb = DynamoDbClient.builder()
        .region(Region.US_WEST_2)
        .endpointDiscoveryEnabled(true)
        .build();
```

## 요청 수준 엔드포인트 구성
<a name="request-level-endpoint-configuration"></a>

경우에 따라 기본 엔드포인트가 있는 다른 요청에 동일한 클라이언트를 사용하는 동안 특정 요청에 대해 엔드포인트를 재정의해야 할 수 있습니다. AWS SDK for Java 2.x는 요청 재정의를 통해 이를 지원합니다.

**Example 특정 요청에 대한 엔드포인트 재정의**  

```
import software.amazon.awssdk.core.SdkRequest;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.http.SdkHttpRequest;

S3Client s3 = S3Client.builder()
        .region(Region.US_WEST_2)
        .build();

// Create a request
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
        .bucket("amzn-s3-demo-bucket")
        .key("my-key")
        .overrideConfiguration(c -> c.putHeader("Host", "custom-endpoint.example.com"))
        .build();

// Execute the request with the custom endpoint
s3.getObject(getObjectRequest);
```

요청 수준 엔드포인트 재정의는 제한되며 일부 서비스 또는 시나리오에서는 작동하지 않을 수 있습니다. 대부분의 경우 클라이언트 수준 엔드포인트 구성을 사용하는 것이 좋습니다.

## 외부 엔드포인트 구성
<a name="external-endpoint-configuration"></a>

### 환경 변수 사용
<a name="environment-variables-for-endpoints"></a>

환경 변수를 사용하여 엔드포인트를 구성합니다. SDK는 `AWS_ENDPOINT_URL_[SERVICE]` 형식의 환경 변수를 통해 서비스별 엔드포인트 구성을 지원하며, 여기서 `[SERVICE]`는 대문자 서비스 식별자입니다.

**Example 환경 변수를 사용한 S3 엔드포인트 설정**  

```
# For Linux/macOS
export AWS_ENDPOINT_URL_S3=https://my-custom-s3-endpoint.example.com

# For Windows
set AWS_ENDPOINT_URL_S3=https://my-custom-s3-endpoint.example.com
```

 또는 다음 환경 변수를 사용하여 글로벌 엔드포인트 URL 접두사 또는 접미사를 설정할 수 있습니다.
+ `AWS_ENDPOINT_URL` - 모든 서비스에 대한 글로벌 엔드포인트를 설정합니다.
+ `AWS_ENDPOINT_URL_PREFIX` - 모든 서비스 엔드포인트에 접두사를 추가합니다.
+ `AWS_ENDPOINT_URL_SUFFIX` - 모든 서비스 엔드포인트에 접미사를 추가합니다.

### JVM 시스템 속성 사용
<a name="jvm-system-properties-for-endpoints"></a>

 또한 JVM 시스템 속성을 사용하여 엔드포인트를 구성할 수 있습니다. 형식은 환경 변수와 비슷하지만 다른 이름 지정 규칙을 사용합니다.

**Example JVM 시스템 속성을 사용하여 S3 엔드포인트 설정**  

```
java -Daws.endpointUrl.s3=https://my-custom-s3-endpoint.example.com -jar your-application.jar
```

 또한 글로벌 엔드포인트 구성은 시스템 속성을 통해서 사용할 수 있습니다.
+ `aws.endpointUrl` - 모든 서비스에 대한 글로벌 엔드포인트를 설정합니다.
+ `aws.endpointUrl.prefix` - 모든 서비스 엔드포인트에 접두사를 추가합니다.
+ `aws.endpointUrl.suffix` - 모든 서비스 엔드포인트에 접미사를 추가합니다.

### 공유 AWS 구성 파일 사용
<a name="aws-config-file-for-endpoints"></a>

 또한 AWS SDK for Java 2.x는 일반적으로 `~/.aws/config`(Linux/macOS) 또는 `%USERPROFILE%\.aws\config`(Windows)에 있는 공유 AWS 구성 파일을 통해 엔드포인트 구성을 지원합니다. 자세한 내용과 예제는 [AWS SDK 및 도구 참조 안내서](https://docs.aws.amazon.com/sdkref/latest/guide/feature-ss-endpoints.html#ss-endpoints-config)를 참조하세요.

## 구성 우선 순위
<a name="endpoint-configuration-precedence"></a>

 여러 엔드포인트 구성이 있는 경우 SDK는 다음 우선순위(가장 높음에서 가장 낮음)를 따릅니다.

1. 요청 수준 재정의(해당하는 경우)

1. `endpointOverride`를 통한 클라이언트 수준 구성

1. 환경 변수

1. JVM 시스템 속성

1. 공유 AWS 구성 파일

1. 구성된 AWS 리전을 기반으로 하는 기본 엔드포인트

## 서비스별 엔드포인트 구성
<a name="service-specific-endpoint-configuration"></a>

 일부 AWS 서비스에는 해당 서비스와 관련된 추가 엔드포인트 구성 옵션이 있습니다. 다음은 몇 가지 예입니다.

### Amazon S3 엔드포인트 구성
<a name="s3-endpoint-configuration"></a>

 Amazon S3는 `S3Configuration` 클래스를 통해 여러 엔드포인트 구성을 지원합니다.
+ `dualstackEnabled` - IPv6 지원 사용
+ `accelerateModeEnabled` - S3 Transfer Acceleration 사용
+ `pathStyleAccessEnabled` - 가상 호스팅식 대신 경로식 액세스 사용
+ `useArnRegionEnabled` - 크로스 리전 요청에 ARN의 리전 사용
+ `fipsModeEnabled` - 요청을 FIPS 준수 엔드포인트로 라우팅

**Example S3별 엔드포인트 옵션 구성**  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;

S3Client s3 = S3Client.builder()
        .region(Region.US_WEST_2)
        .serviceConfiguration(S3Configuration.builder()
                .accelerateModeEnabled(true)
                .dualstackEnabled(true)
                .pathStyleAccessEnabled(false)
                .fipsModeEnabled(true)
                .build())
        .build();
```

### DynamoDB 엔드포인트 구성
<a name="dynamodb-endpoint-configuration"></a>

 DynamoDB의 경우 엔드포인트 검색을 사용하거나 [DynamoDB 로컬](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html)에 연결하여 테스트할 수 있습니다.

**Example DynamoDB 로컬에 연결**  

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import java.net.URI;

DynamoDbClient dynamoDb = DynamoDbClient.builder()
        .endpointOverride(URI.create("http://localhost:8000"))
        // The region is meaningless for DynamoDB local but required for the client builder.
        .region(Region.US_WEST_2)
        .build();
```

또한 DynamoDB는 코드에서 구성하거나 외부 설정을 사용하여 구성할 수 있는 [계정 기반 엔드포인트](https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html) 사용을 지원합니다. 다음 예제에서는 클라이언트를 만들 때 코드에서 계정 기반 엔드포인트 사용을 사용 해제하는 방법을 보여줍니다(기본 설정: *선호*).

```
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
    .region(Region.US_EAST_1)
    .accountIdEndpointMode(AccountIdEndpointMode.DISABLED)
    .build();
```

## 모범 사례
<a name="endpoint-configuration-best-practices"></a>

 AWS SDK for Java 2.x에서 엔드포인트를 구성할 때 다음 모범 사례를 고려하세요.
+  *환경별 엔드포인트에 외부 구성 사용* - 환경 변수, 시스템 속성 또는 환경(개발, 테스트, 프로덕션) 간에 다른 엔드포인트에 AWS 구성 파일을 사용합니다.
+  *애플리케이션별 엔드포인트에 코드 내 구성 사용* - 애플리케이션의 설계에 맞는 엔드포인트에 클라이언트 빌더의 `endpointOverride` 메서드를 사용합니다.
+  *항상 리전 지정* - 엔드포인트를 재정의할 때도 항상 요청 서명에 사용되는 리전을 지정합니다.
+  *글로벌 엔드포인트 재정의에 주의* - 글로벌 엔드포인트 재정의는 모든 서비스에 영향을 미칠 수 있으며, 이는 의도한 것과 다를 수 있습니다.
+  *보안 영향 고려* - 사용자 지정 엔드포인트를 사용할 경우 특히 프로덕션 워크로드에 적절한 보안 조치가 있는지 확인합니다.