

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

# URL 연결 기반 HTTP 클라이언트 구성
<a name="http-configuration-url"></a>

는 기본와 비교하여 경량 `[UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)` HTTP 클라이언트를 AWS SDK for Java 2.x 제공합니다`ApacheHttpClient`. `UrlConnectionHttpClient`는 Java의 `[URLConnection](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/URLConnection.html)`를 기반으로 합니다.

`UrlConnectionHttpClient`는 Apache 기반 HTTP 클라이언트보다 로드 속도가 빠르지만 기능이 더 적습니다. 로드 속도가 더 빠르기 때문에 Java AWS Lambda 함수에 [적합한 솔루션](lambda-optimize-starttime.md)입니다.

`UrlConnectionHttpClient`에는 액세스할 수 있는 여러 [구성 가능한 옵션](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.Builder.html)이 있습니다.

**참고**  
`UrlConnectionHttpClient`에서는 HTTP PATCH 메서드를 지원하지 않습니다.  
몇 가지 AWS API 작업에는 PATCH 요청이 필요합니다. 이러한 작업 이름은 일반적으로 `Update*`로 시작합니다. 다음은 몇 가지 예제입니다.  
 AWS Security Hub CSPM API의 [여러 `Update*` 작업](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_Operations.html)과 [BatchUpdateFindings](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_BatchUpdateFindings.html) 작업
모든 Amazon API Gateway API [`Update*` 작업](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateAccount.html)
를 사용할 수 있는 경우 `UrlConnectionHttpClient`먼저 사용 AWS 서비스 중인에 대한 API 참조를 참조하세요. 필요한 작업이 PATCH 작업을 사용하는지 확인하세요.

## `UrlConnectionHttpClient` 액세스
<a name="http-url-dependency"></a>

`UrlConnectionHttpClient`를 구성하고 사용하려면 `pom.xml` 파일의 `url-connection-client` Maven 아티팩트에 대한 종속성을 선언해야 합니다.

`ApacheHttpClient`와 달리 `UrlConnectionHttpClient`는 프로젝트에 자동으로 추가되지 않으므로 사용자는 이를 구체적으로 선언해야 합니다.

`pom.xml` 파일의 다음 예제는 HTTP 클라이언트를 사용하고 구성하는 데 필요한 종속성을 보여줍니다.

```
<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>

<!-- other dependencies such as s3 or dynamodb -->

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>url-connection-client</artifactId>
    </dependency>
</dependencies>
```

## `UrlConnectionHttpClient` 사용 및 구성
<a name="http-url-config"></a>

서비스 클라이언트 구축과 함께 `UrlConnectionHttpClient`의 인스턴스를 구성하거나 여러 서비스 클라이언트에서 공유하도록 단일 인스턴스를 구성할 수 있습니다.

어느 방법을 사용하든 [URLConnectionHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.Builder.html)를 사용하여 URLConnection 기반 HTTP 클라이언트의 속성을 구성합니다.

### 모범 사례: 서비스 클라이언트 전용 `UrlConnectionHttpClient` 인스턴스 지정
<a name="http-config-url-one-client"></a>

`UrlConnectionHttpClient`의 인스턴스를 구성해야 하는 경우 전용 `UrlConnectionHttpClient` 인스턴스를 구축하는 것이 좋습니다. 서비스 클라이언트 빌더의 `httpClientBuilder` 메서드를 사용하면 됩니다. 이렇게 하면 SDK에서 HTTP 클라이언트의 수명 주기를 관리하므로 더 이상 필요하지 않을 때 `UrlConnectionHttpClient` 인스턴스를 종료하지 않을 경우 잠재적인 메모리 누수를 방지할 수 있습니다.

다음 예제에서는 `S3Client` 인스턴스를 생성하고 `socketTimeout` 및 `proxyConfiguration` 값과 함께 `UrlConnectionHttpClient`의 내장 인스턴스를 구성합니다. 이 `proxyConfiguration` 메서드는 ` Consumer<[ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/ProxyConfiguration.Builder.html)>` 유형의 Java 람다 표현식을 사용합니다.

 **가져오기** 

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import java.net.URI;
import java.time.Duration;
```

 **코드** 

```
// Singleton: Use the s3Client for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClientBuilder(UrlConnectionHttpClient.builder()
                    .socketTimeout(Duration.ofMinutes(5))
                    .proxyConfiguration(proxy -> proxy.endpoint(URI.create("http://proxy.mydomain.net:8888"))))
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .build();

// Perform work with the s3Client.

s3Client.close();   // Requests completed: Close the s3client.
```

### 대안 접근 방식: `UrlConnectionHttpClient` 인스턴스 공유
<a name="http-config-url-multi-clients"></a>

애플리케이션의 리소스 및 메모리 사용량을 낮추려면 `UrlConnectionHttpClient`를 구성하고 여러 서비스 클라이언트에서 공유할 수 있습니다. HTTP 연결 풀이 공유되므로 리소스 사용량이 줄어듭니다.

**참고**  
`UrlConnectionHttpClient` 인스턴스를 공유한 경우 폐기할 준비가 되면 인스턴스를 닫아야 합니다. SDK는 서비스 클라이언트가 닫힐 때 인스턴스를 닫지 않습니다.

다음 예제는 두 서비스 클라이언트가 사용하는 URLConnection 기반 HTTP 클라이언트를 구성합니다. 구성된 `UrlConnectionHttpClient` 인스턴스는 각 빌더의 `httpClient` 메서드로 전달됩니다. 서비스 클라이언트와 HTTP 클라이언트가 더 이상 필요하지 않으면 코드가 명시적으로 닫습니다. 코드는 HTTP 클라이언트를 마지막으로 닫습니다.

**가져오기**

```
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.ProxyConfiguration;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.net.URI;
import java.time.Duration;
```

 **코드** 

```
SdkHttpClient urlHttpClient = UrlConnectionHttpClient.create();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(urlHttpClient)
            .defaultsMode(DefaultsMode.IN_REGION)
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(urlHttpClient)
                  .defaultsMode(DefaultsMode.IN_REGION)
                  .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                  .build();

// Perform work with the s3Client and dynamoDbClient.

// Requests completed: Close all service clients.
s3Client.close();
dynamoDbClient.close();
urlHttpClient.close();
```

#### `URLConnectionHttpClient`를 `ApacheHttpClient`와 함께 사용
<a name="http-config-url-caveat"></a>

애플리케이션에서 `UrlConnectionHttpClient`를 사용하는 경우 서비스 클라이언트 빌더의 `httpClientBuilder` 메서드를 사용하여 각 서비스 클라이언트에 `URLConnectionHttpClient` 인스턴스 또는 `ApacheHttpClient` 인스턴스를 제공해야 합니다.

프로그램에서 여러 서비스 클라이언트를 사용하고 다음 두 가지 조건을 모두 만족할 때 예외가 발생합니다.
+ 한 서비스 클라이언트가 `UrlConnectionHttpClient` 인스턴스를 사용하도록 구성되어 있습니다.
+ 다른 서비스 클라이언트는 `httpClient()` 또는 `httpClientBuilder()` 메서드로 명시적으로 빌드하지 않고 기본값 `ApacheHttpClient`을 사용합니다.

예외는 클래스 경로에서 여러 HTTP 구현이 발견되었음을 나타냅니다.

다음 예제 코드 조각은 예외로 이어집니다.

```
// The dynamoDbClient uses the UrlConnectionHttpClient
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
        .httpClient(UrlConnectionHttpClient.create())
        .build();

// The s3Client below uses the ApacheHttpClient at runtime, without specifying it.
// An SdkClientException is thrown with the message that multiple HTTP implementations were found on the classpath.
S3Client s3Client = S3Client.create();

// Perform work with the s3Client and dynamoDbClient.

dynamoDbClient.close();
s3Client.close();
```

`S3Client`를 `ApacheHttpClient`로 명시적으로 구성하여 예외를 방지하세요.

```
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
        .httpClient(UrlConnectionHttpClient.create())
        .build();

S3Client s3Client = S3Client.builder()
        .httpClient(ApacheHttpClient.create())    // Explicitly build the ApacheHttpClient.
        .build();

// Perform work with the s3Client and dynamoDbClient.

dynamoDbClient.close();
s3Client.close();
```

**참고**  
`ApacheHttpClient`를 명시적으로 만들려면 Maven 프로젝트 파일의 `apache-client`아티팩트에 대한 [종속성을 추가](http-configuration-apache.md#http-apache-dependency)해야 합니다.

## 프록시 구성 예제
<a name="http-configuration-url-proxy-conf-ex"></a>

다음 코드 조각은 [URL 연결 HTTP 클라이언트용 프록시 구성 빌더](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/ProxyConfiguration.Builder.html)를 사용합니다.

```
SdkHttpClient urlHttpClient = UrlConnectionHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .endpoint(URI.create("http://example.com:1234"))
                        .username("username")
                        .password("password")
                        .addNonProxyHost("localhost")
                        .addNonProxyHost("host.example.com")
                        .build())
                .build();
```

프록시 구성에 해당하는 Java 시스템 속성은 다음 명령줄 코드 조각에 나와 있습니다.

```
$ java -Dhttp.proxyHost=example.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=username \
-Dhttp.proxyPassword=password -Dhttp.nonProxyHosts=localhost|host.example.com -cp ... App
```

환경 변수를 사용하는 것과 동등한 설정은 다음과 같습니다.

```
// Set the following environment variables.
// $ export HTTP_PROXY="http://username:password@example.com:1234"
// $ export NO_PROXY="localhost|host.example.com"

// Set the 'useSystemPropertyValues' to false on the proxy configuration.
SdkHttpClient apacheHttpClient = UrlConnectionHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

// Run the application.
// $ java -cp ... App
```

**참고**  
URL 연결 기반 HTTP 클라이언트는 현재 HTTPS 프록시 시스템 속성이나 HTTPS\$1PROXY 환경 변수를 지원하지 않습니다.