

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

# Apache 기반 HTTP 클라이언트 설정
<a name="http-configuration-apache"></a>

의 동기 서비스 클라이언트는 기본적으로 Apache 기반 HTTP 클라이언트인 [ApacheHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html)를 AWS SDK for Java 2.x 사용합니다. SDK의 `ApacheHttpClient`는 Apache [HTTPClient](https://hc.apache.org/httpcomponents-client-4.5.x/index.html)를 기반으로 합니다.

SDK는 로드 속도가 더 빠르지만 기능은 더 적은 [UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)를 제공합니다. `UrlConnectionHttpClient` 구성에 대한 내용은 [URL 연결 기반 HTTP 클라이언트 구성](http-configuration-url.md)을 참조하세요.

`ApacheHttpClient`에서 사용할 수 있는 구성 옵션 전체를 보려면 [ApacheHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html) 및 [ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html)를 참조하세요.

## `ApacheHttpClient` 액세스
<a name="http-apache-dependency"></a>

대부분의 경우 명시적인 구성 없이 `ApacheHttpClient`를 사용합니다. 서비스 클라이언트를 선언하면 SDK가 표준 값으로 `ApacheHttpClient`를 구성합니다.

`ApacheHttpClient`를 명시적으로 구성하거나 여러 서비스 클라이언트와 함께 사용하려면 구성에 사용할 수 있도록 해야 합니다.

### 구성 불필요
<a name="http-config-apache-no-config"></a>

Maven에서 서비스 클라이언트에 대한 종속성을 선언하면 SDK가 `apache-client` 아티팩트에 *런타임* 종속성을 추가합니다. 이렇게 하면 런타임에는 `ApacheHttpClient` 코드에서 클래스를 사용할 수 있지만 컴파일 타임에는 사용할 수 없습니다. Apache 기반 HTTP 클라이언트를 구성하지 않는 경우 종속성을 지정하지 않아도 됩니다.

Maven `pom.xml` 파일의 다음 XML 코드 조각에서 `<artifactId>s3</artifactId>`로 선언된 종속성은 자동적으로 Apache 기반 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>
<dependencies>
    <!-- The s3 dependency automatically adds a runtime dependency on the ApacheHttpClient-->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
    </dependency>
</dependencies>
```

이러한 종속성을 사용하면 `ApacheHttpClient` 라이브러리가 런타임 클래스 경로에만 있으므로 HTTP 구성을 변경할 수 없습니다.

### 구성 필요
<a name="http-config-apache-yes-config"></a>

`ApacheHttpClient`를 구성하려면 *컴파일* 때 `apache-client` 라이브러리에 대한 종속성을 추가해야 합니다.

`ApacheHttpClient`를 구성하려면 다음 Maven `pom.xml` 파일 예제를 참조하세요.

```
    <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>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
        <!-- By adding the apache-client dependency, ApacheHttpClient will be added to 
             the compile classpath so you can configure it. -->
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>apache-client</artifactId>
        </dependency>
    </dependencies>
```

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

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

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

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

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

다음 예제에서는 `S3Client` 인스턴스를 생성하고 `maxConnections` 및 `connectionTimeout` 값과 함께 `ApacheHttpClient`의 내장 인스턴스를 구성합니다. HTTP 인스턴스는 `S3Client.Builder`의 `httpClientBuilder` 메서드를 사용하여 생성됩니다.

 **가져오기** 

```
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

 **코드** 

```
S3Client s3Client = S3Client   // Singleton: Use the s3Client for all requests.
    .builder()
    .httpClientBuilder(ApacheHttpClient.builder()
        .maxConnections(100)
        .connectionTimeout(Duration.ofSeconds(5))
    ).build();

// Perform work with the s3Client.

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

### 대안 접근 방식: `ApacheHttpClient` 인스턴스 공유
<a name="http-config-apache-alt"></a>

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

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

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

**가져오기**

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
```

 **코드** 

```
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
        .maxConnections(100).build();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(apacheHttpClient).build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(apacheHttpClient).build();

// Perform work with the s3Client and dynamoDbClient.

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

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

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

```
SdkHttpClient apacheHttpClient = ApacheHttpClient.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 = ApacheHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

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

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