

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

# 제어 속성 변환
<a name="ddb-en-client-adv-features-conversion"></a>

기본적으로 테이블 스키마는 `[AttributeConverterProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverterProvider.html)` 인터페이스의 기본 구현을 통해 많은 공통 Java 유형에 대한 변환기를 제공합니다. 사용자 지정 `AttributeConverterProvider` 구현으로 전체 기본 동작을 변경할 수 있습니다. 단일 속성의 변환기를 변경할 수도 있습니다.

사용 가능한 컨버터 목록은 [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html) 인터페이스 Java 문서를 참조하세요.

## 사용자 정의 속성 변환기 공급자 제공
<a name="ddb-en-client-adv-features-conversion-prov"></a>

`@DynamoDbBean` `(converterProviders = {…})`주석을 통해 정렬된 단일 `AttributeConverterProvider` 또는 순서로 정리된 `AttributeConverterProvider`의 체인을 제공할 수 있습니다. 모든 사용자 지정 `AttributeConverterProvider`은 `AttributeConverterProvider` 인터페이스를 확장해야 합니다.

자체 특성 변환기 공급자 체인을 제공하는 경우 기본 변환기 공급자 `DefaultAttributeConverterProvider`가 재정의됨을 유의하세요. `DefaultAttributeConverterProvider`의 기능을 사용하려면 이 기능을 체인에 포함해야 합니다.

빈 배열 `{}`로 Bean에 주석을 달 수도 있습니다. 이렇게 하면 기본값을 포함하여 모든 특성 변환기 공급자의 사용이 비활성화됩니다. 이 경우 매핑할 모든 속성에는 고유한 속성 변환기가 있어야 합니다.

다음 코드 조각은 단일 변환기 제공자를 보여줍니다.

```
@DynamoDbBean(converterProviders = ConverterProvider1.class)
public class Customer {

}
```

다음 코드 조각은 변환기 제공자 체인의 사용을 보여줍니다. SDK 기본값은 마지막에 제공되므로 우선순위가 가장 낮습니다.

```
@DynamoDbBean(converterProviders = {
   ConverterProvider1.class, 
   ConverterProvider2.class,
   DefaultAttributeConverterProvider.class})
public class Customer {

}
```

정적 테이블 스키마 빌더에는 동일한 `attributeConverterProviders()` 방식으로 작동하는 메서드가 있습니다. 이는 다음 예제와 같습니다.

```
private static final StaticTableSchema<Customer> CUSTOMER_TABLE_SCHEMA =
  StaticTableSchema.builder(Customer.class)
    .newItemSupplier(Customer::new)
    .addAttribute(String.class, a -> a.name("name")
                                     a.getter(Customer::getName)
                                     a.setter(Customer::setName))
    .attributeConverterProviders(converterProvider1, converterProvider2)
    .build();
```

## 단일 속성의 매핑 재정의
<a name="ddb-en-client-adv-features-conversion-single"></a>

단일 속성이 매핑되는 방식을 재정의하려면 속성에 `AttributeConverter`을 제공하세요. 이 추가 기능은 테이블 스키마의 `AttributeConverterProviders`에서 제공하는 모든 변환기를 재정의합니다. 이렇게 하면 해당 속성에만 사용자 지정 변환기가 추가됩니다. 동일한 유형의 속성이라 할지라도, 다른 속성은 해당 속성에 대해 명시적으로 지정되지 않는 한 해당 변환기를 사용하지 않습니다.

`@DynamoDbConvertedBy` 주석은 다음 코드 조각과 같이 사용자 지정 `AttributeConverter` 클래스를 지정하는 데 사용됩니다.

```
@DynamoDbBean
public class Customer {
    private String name;

    @DynamoDbConvertedBy(CustomAttributeConverter.class)
    public String getName() { return this.name; }
    public void setName(String name) { this.name = name;}
}
```

정적 스키마용 빌더에는 동일한 속성 빌더 `attributeConverter()` 메서드가 있습니다. 이 메서드는 다음과 같이 `AttributeConverter`의 인스턴스를 사용합니다.

```
private static final StaticTableSchema<Customer> CUSTOMER_TABLE_SCHEMA =
  StaticTableSchema.builder(Customer.class)
    .newItemSupplier(Customer::new)
    .addAttribute(String.class, a -> a.name("name")
                                     a.getter(Customer::getName)
                                     a.setter(Customer::setName)
                                     a.attributeConverter(customAttributeConverter))
    .build();
```

## 예제
<a name="ddb-en-client-adv-features-conversion-example"></a>

이 예제는 [https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpCookie.html](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpCookie.html) 객체의 속성 변환기를 제공하는 `AttributeConverterProvider` 구현을 보여줍니다.

다음 `SimpleUser` 클래스에는 `HttpCookie`의 인스턴스인 이름이 `lastUsedCookie`로 지정된 속성이 들어 있습니다.

`@DynamoDbBean` 주석의 매개 변수에는 변환기를 제공하는 두 `AttributeConverterProvider` 클래스가 나열되어 있습니다.

------
#### [ Class with annotations ]

```
    @DynamoDbBean(converterProviders = {CookieConverterProvider.class, DefaultAttributeConverterProvider.class})
    public static final class SimpleUser {
        private String name;
        private HttpCookie lastUsedCookie;

        @DynamoDbPartitionKey
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public HttpCookie getLastUsedCookie() {
            return lastUsedCookie;
        }

        public void setLastUsedCookie(HttpCookie lastUsedCookie) {
            this.lastUsedCookie = lastUsedCookie;
        }
```

------
#### [ Static table schema ]

```
    private static final TableSchema<SimpleUser> SIMPLE_USER_TABLE_SCHEMA =
            TableSchema.builder(SimpleUser.class)
                    .newItemSupplier(SimpleUser::new)
                    .attributeConverterProviders(CookieConverterProvider.create(), AttributeConverterProvider.defaultProvider())
                    .addAttribute(String.class, a -> a.name("name")
                            .setter(SimpleUser::setName)
                            .getter(SimpleUser::getName)
                            .tags(StaticAttributeTags.primaryPartitionKey()))
                    .addAttribute(HttpCookie.class, a -> a.name("lastUsedCookie")
                            .setter(SimpleUser::setLastUsedCookie)
                            .getter(SimpleUser::getLastUsedCookie))
                    .build();
```

------

다음 `CookieConverterProvider` 예제에서는 `HttpCookeConverter`의 인스턴스를 제공합니다.

```
    public static final class CookieConverterProvider implements AttributeConverterProvider {
        private final Map<EnhancedType<?>, AttributeConverter<?>> converterCache = ImmutableMap.of(
                // 1. Add HttpCookieConverter to the internal cache.
                EnhancedType.of(HttpCookie.class), new HttpCookieConverter());

        public static CookieConverterProvider create() {
            return new CookieConverterProvider();
        }

        // The SDK calls this method to find out if the provider contains a AttributeConverter instance
        // for the EnhancedType<T> argument.
        @SuppressWarnings("unchecked")
        @Override
        public <T> AttributeConverter<T> converterFor(EnhancedType<T> enhancedType) {
            return (AttributeConverter<T>) converterCache.get(enhancedType);
        }
    }
```

### 전환 코드
<a name="ddb-en-client-adv-features-conversion-example-code"></a>

다음 `HttpCookieConverter` 클래스의 `transformFrom()` 메서드에서 코드는 `HttpCookie` 인스턴스를 수신하여 속성으로 저장되는 DynamoDB 맵으로 변환합니다.

`transformTo()` 메서드는 DynamoDB 맵 파라미터를 수신한 다음 이름과 값이 필요한 생성자를 `HttpCookie` 호출합니다.

```
    public static final class HttpCookieConverter implements AttributeConverter<HttpCookie> {

        @Override
        public AttributeValue transformFrom(HttpCookie httpCookie) {

            return AttributeValue.fromM(
            Map.of ("cookieName", AttributeValue.fromS(httpCookie.getName()),
                    "cookieValue", AttributeValue.fromS(httpCookie.getValue()))
            );
        }

        @Override
        public HttpCookie transformTo(AttributeValue attributeValue) {
            Map<String, AttributeValue> map = attributeValue.m();
            return new HttpCookie(
                    map.get("cookieName").s(),
                    map.get("cookieValue").s());
        }

        @Override
        public EnhancedType<HttpCookie> type() {
            return EnhancedType.of(HttpCookie.class);
        }

        @Override
        public AttributeValueType attributeValueType() {
            return AttributeValueType.M;
        }
    }
```