

# DynamoDB에 큰 항목과 속성 저장 모범 사례
<a name="bp-use-s3-too"></a>

Amazon DynamoDB는 테이블에 저장하는 각 항목의 크기를 400KB로 제한합니다([항목 크기](Constraints.md#limits-items-size) 참조). 애플리케이션이 DynamoDB 크기 제한보다 많은 데이터를 항목에 저장해야 하는 경우, 하나 이상의 라지 속성을 압축하거나, 항목을 여러 개(정렬 키로 효율적으로 인덱싱된)로 나눌 수 있습니다. 또한 항목을 Amazon Simple Storage Service(Amazon S3)에 객체로 저장하고 Amazon S3 객체 식별자를 DynamoDB 항목에 저장할 수도 있습니다.

가장 좋은 방법은 항목을 작성할 때 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/ReturnConsumedCapacity.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/ReturnConsumedCapacity.html) 파라미터를 활용하여 최대 400KB의 항목 크기 한도에 근접하는 항목 크기를 모니터링하고 이에 대해 경고하는 것입니다. 최대 항목 크기를 초과하면 쓰기 시도가 실패합니다. DynamoDB는 [ValidationException 오류](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html)를 반환합니다. 애플리케이션에 영향을 미치기 전에 항목 크기를 모니터링하고 경고하여 항목 크기 문제를 완화할 수 있습니다.

## 큰 속성 값 압축
<a name="bp-use-s3-too-or-compress"></a>

라지 속성 값을 압축하면 DynamoDB의 항목 제한에 맞출 수 있고, 스토리지 비용을 절감할 수 있습니다. GZIP 또는 LZO와 같은 압축 알고리즘은 이진 출력을 생성하며, 이를 항목 내의 `Binary` 속성 유형에 저장할 수 있습니다.

포럼 사용자가 작성한 메시지를 저장하는 테이블을 예로 들어 보겠습니다. 이러한 메시지에는 압축하기에 적합한 긴 텍스트 문자열이 포함되는 경우가 많습니다. 압축하면 항목 크기를 줄일 수 있지만, 압축된 속성 값은 필터링에 유용하지 않다는 단점이 있습니다.

DynamoDB에서 긴 메시지를 압축하는 방법을 보여주는 샘플 코드는 다음을 참조하세요.
+ [예: AWS SDK for Java 문서 API를 사용하여 이진 형식 속성 처리](JavaDocumentAPIBinaryTypeExample.md)
+ [예: AWS SDK for .NET 하위 수준 API를 사용하여 이진 형식 속성 처리](LowLevelDotNetBinaryTypeExample.md)

## 수직 파티셔닝
<a name="bp-use-s3-too-vertical-partitioning"></a>

큰 항목을 처리하는 또 다른 방법은 항목을 더 작은 데이터 청크로 나누고 모든 관련 항목을 파티션 키 값을 기준으로 연결하는 것입니다. 그런 다음 정렬 키 문자열을 사용하여 정렬 키 문자열과 함께 저장된 관련 정보를 식별할 수 있습니다. 이 방법을 사용하고 여러 항목을 동일한 파티션 키 값으로 그룹화하면 [**항목 모음](WorkingWithItemCollections.md)이 생성됩니다.

이 방법에 대한 자세한 정보는 다음을 참조하세요.
+ [Use vertical partitioning to scale data efficiently in Amazon DynamoDB](https://aws.amazon.com/blogs/database/use-vertical-partitioning-to-scale-data-efficiently-in-amazon-dynamodb/) 
+ [Implement vertical partitioning in Amazon DynamoDB using AWS Glue](https://aws.amazon.com/blogs/database/implement-vertical-partitioning-in-amazon-dynamodb-using-aws-glue/) 

## Amazon S3에 큰 속성 값 저장
<a name="bp-use-s3-too-large-values"></a>

앞에서 언급한 것처럼 Amazon S3을 사용하여 DynamoDB 항목에 맞지 않는 라지 속성 값을 저장할 수도 있습니다. 이를 Amazon S3에 객체로 저장한 후, 객체 식별자를 DynamoDB 항목에 저장할 수 있습니다.

또한 Amazon S3의 객체 메타데이터 지원을 사용하여 DynamoDB의 상위 항목에 링크를 다시 제공할 수 있습니다. 항목의 기본 키 값을 Amazon S3 객체의 Amazon S3 메타데이터로 저장합니다. 이렇게 하면 Amazon S3 객체를 유지 관리할 때 도움을 받을 수 있습니다.

예를 들어 `ProductCatalog` 테이블을 고려해 보세요. 이 테이블의 항목은 항목 가격, 설명, 책의 저자 및 여러 제품의 규격에 대한 정보를 저장합니다. 항목에 맞지 않을 정도로 큰 제품 이미지를 저장하고 싶다면, DynamoDB 대신 Amazon S3에 이미지를 저장할 수 있습니다.

이 전략을 구현할 때는 다음을 염두에 두세요.
+ DynamoDB는 Amazon S3 및 DynamoDB를 교차하는 트랜잭션을 지원하지 않습니다. 따라서 애플리케이션이 분리된 Amazon S3 객체를 정리하는 등 실패를 처리할 수 있어야 합니다.
+ Amazon S3는 객체 식별자의 길이를 제한합니다. 따라서 길이가 지나치게 긴 객체 식별자를 생성하지 않거나 기타 Amazon S3 제약을 위반하지 않는 방식으로 데이터를 구성해야 합니다.

Amazon S3를 사용하는 방법에 대한 자세한 내용은 [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)를 참조하세요.