

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

# Netty 기반 HTTP 클라이언트를 구성
<a name="http-configuration-netty"></a>

에서 비동기 작업을 위한 기본 HTTP 클라이언트는 Netty 기반 [NettyNioAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html) AWS SDK for Java 2.x 입니다. Netty 기반 클라이언트는 [Netty 프로젝트](https://netty.io/)의 비동기 이벤트 기반 네트워크 프레임워크를 기반으로 합니다.

대체 HTTP 클라이언트로서 새 [AWS CRT 기반 HTTP 클라이언트](http-configuration-crt.md)를 사용할 수 있습니다. 이 항목에서는 `NettyNioAsyncHttpClient`를 구성하는 방법을 보여 줍니다.

## `NettyNioAsyncHttpClient` 액세스
<a name="http-config-netty-access"></a>

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

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

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

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

Maven `pom.xml` 파일의 다음 XML 코드 조각에서 `<artifactId>dynamodb-enhanced</artifactId>`로 선언된 종속성은 전이적으로 Netty 기반 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>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>dynamodb-enhanced</artifactId>
    </dependency>
</dependencies>
```

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

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

`NettyNioAsyncHttpClient`를 구성하려면 *컴파일* 때 `netty-nio-client` 아티팩트에 대한 종속성을 추가해야 합니다.

`NettyNioAsyncHttpClient`를 구성하려면 다음 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>dynamodb-enhanced</artifactId>
        </dependency>
        <!-- By adding the netty-nio-client dependency, NettyNioAsyncHttpClient will be 
             added to the compile classpath so you can configure it. -->
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>netty-nio-client</artifactId>
        </dependency>
    </dependencies>
```

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

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

어느 방법을 사용하든 [NettyNIOAsynchttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.Builder.html)를 사용하여 Netty 기반 HTTP 클라이언트 인스턴스의 속성을 구성합니다.

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

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

다음 예시에서는 `DynamoDbEnhancedAsyncClient` 인스턴스에서 사용되는 `DynamoDbAsyncClient` 인스턴스를 만듭니다. `DynamoDbAsyncClient` 인스턴스에는 `connectionTimeout` 및 `maxConcurrency` 값이 있는 `NettyNioAsyncHttpClient` 인스턴스가 포함됩니다. HTTP 인스턴스는 `DynamoDbAsyncClient.Builder`의 `httpClientBuilder` 메서드를 사용하여 생성됩니다.

 **가져오기** 

```
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient;
import software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import java.time.Duration;
```

 **코드** 

```
// DynamoDbAsyncClient is the lower-level client used by the enhanced client.
DynamoDbAsyncClient dynamoDbAsyncClient = 
    DynamoDbAsyncClient
        .builder()
            .httpClientBuilder(NettyNioAsyncHttpClient.builder()
            .connectionTimeout(Duration.ofMillis(5_000))
            .maxConcurrency(100)
            .tlsNegotiationTimeout(Duration.ofMillis(3_500)))
        .defaultsMode(DefaultsMode.IN_REGION)
        .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
        .build();

// Singleton: Use dynamoDbAsyncClient and enhancedClient for all requests.
DynamoDbEnhancedAsyncClient enhancedClient = 
    DynamoDbEnhancedAsyncClient
        .builder()
        .dynamoDbClient(dynamoDbAsyncClient)
        .extensions(AutoGeneratedTimestampRecordExtension.create())
        .build();

// Perform work with the dynamoDbAsyncClient and enhancedClient.

// Requests completed: Close dynamoDbAsyncClient.
dynamoDbAsyncClient.close();
```

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

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

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

다음 예제는 두 서비스 클라이언트가 사용하는 Netty 기반 HTTP 클라이언트를 구성합니다. 구성된 `NettyNioAsyncHttpClient` 인스턴스는 각 빌더의 `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;
```

 **코드** 

```
// Create a NettyNioAsyncHttpClient shared instance.
SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.builder().maxConcurrency(100).build();

// Singletons: Use the s3AsyncClient, dbAsyncClient, and enhancedAsyncClient for all requests.
S3AsyncClient s3AsyncClient = 
    S3AsyncClient.builder()
                 .httpClient(nettyHttpClient)
                 .build();

DynamoDbAsyncClient dbAsyncClient = 
    DynamoDbAsyncClient.builder()
                       .httpClient(nettyHttpClient)
                       .defaultsMode(DefaultsMode.IN_REGION)
                       .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                       .build();

DynamoDbEnhancedAsyncClient enhancedAsyncClient = 
    DynamoDbEnhancedAsyncClient.builder()
                               .dynamoDbClient(dbAsyncClient)
                               .extensions(AutoGeneratedTimestampRecordExtension.create())
                               .build();

// Perform work with s3AsyncClient, dbAsyncClient, and enhancedAsyncClient.

// Requests completed: Close all service clients.
s3AsyncClient.close();
dbAsyncClient.close()
nettyHttpClient.close();  // Explicitly close nettyHttpClient.
```

## ALPN 프로토콜 협상 구성
<a name="http-netty-config-alpn"></a>

ALPN(Application-Layer Protocol Negotiation)은 애플리케이션 계층에서 추가 왕복을 방지하고 더 나은 성능을 제공하는 방식으로 보안 연결을 통해 수행해야 하는 프로토콜을 협상할 수 있는 TLS 확장 프로그램입니다.

Netty 기반 HTTP 클라이언트가 ALPN을 사용하도록 설정하려면 다음 코드 조각과 같이 빌더 메서드를 직접적으로 호출합니다.

```
import software.amazon.awssdk.http.Protocol;
import software.amazon.awssdk.http.ProtocolNegotiation;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.services.transcribestreaming.TranscribeStreamingAsyncClient;


// Configure the Netty-based HTTP client to use the ALPN protocol.
SdkAsyncHttpClient nettyClient = NettyNioAsyncHttpClient.builder()
                                                        .protocol(Protocol.HTTP2)
                                                        .protocolNegotiation(ProtocolNegotiation.ALPN)
                                                        .build();
// Use the Netty-based HTTP client with a service client.
TranscribeStreamingAsyncClient transcribeClient = TranscribeStreamingAsyncClient.builder()
                                                                                .httpClient(nettyClient)
                                                                                .build();
```

ALPN 프로토콜 협상은 현재 이전 코드 조각과 같이 HTTP/2 프로토콜에서만 작동합니다.

## 프록시 구성 예제
<a name="http-config-netty-proxy-ex"></a>

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

```
SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .scheme("https")
        .host("myproxy")
        .port(1234)
        .username("username")
        .password("password")
        .nonProxyHosts(Set.of("localhost", "host.example.com"))
        .build())
    .build();
```

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

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

**중요**  
HTTPS 프록시 시스템 속성을 사용하려면 코드에서 `scheme` 속성을 `https`로 설정해야 합니다. 스키마 속성이 코드에 설정되지 않은 경우 스키마는 HTTP로 기본 설정되며 SDK는 `http.*` 시스템 속성만 찾습니다.

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

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

// Set the 'useSystemPropertyValues' to false on the proxy configuration.
SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .useSystemPropertyValues(Boolean.FALSE)
        .build())
    .build();

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