제어 속성 변환
기본적으로 테이블 스키마는 AttributeConverterProvider 인터페이스의 기본 구현을 통해 많은 공통 Java 유형에 대한 변환기를 제공합니다. 사용자 지정 AttributeConverterProvider 구현으로 전체 기본 동작을 변경할 수 있습니다. 단일 속성의 변환기를 변경할 수도 있습니다.
사용 가능한 컨버터 목록은 AttributeConverter
사용자 정의 속성 변환기 공급자 제공
@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();
단일 속성의 매핑 재정의
단일 속성이 매핑되는 방식을 재정의하려면 속성에 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();
예시
이 예제는 java.net.HttpCookieAttributeConverterProvider 구현을 보여줍니다.
다음 SimpleUser 클래스에는 HttpCookie의 인스턴스인 이름이 lastUsedCookie로 지정된 속성이 들어 있습니다.
@DynamoDbBean 주석의 매개 변수에는 변환기를 제공하는 두 AttributeConverterProvider 클래스가 나열되어 있습니다.
다음 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); } }
전환 코드
다음 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; } }