

# DynamoDB의 파티션 및 데이터 배포
<a name="HowItWorks.Partitions"></a>

Amazon DynamoDB는 데이터를 파티션에 저장합니다. *파티션*은 SSD(Solid State Drive)로 백업되는 테이블용 스토리지 할당으로, AWS 리전 내의 여러 가용 영역에 자동으로 복제됩니다. 파티션 관리는 DynamoDB에서 전적으로 처리하므로 사용자가 파티션을 직접 관리할 필요가 없습니다.

테이블을 생성할 때 테이블 초기 상태는 `CREATING`입니다. 이 단계 동안, DynamoDB는 테이블에 충분한 파티션을 할당하여 프로비저닝된 처리량 요구 사항을 만족할 수 있도록 합니다. 테이블 상태가 `ACTIVE`로 전환되면 테이블 데이터를 쓰거나 읽을 수 있습니다.

DynamoDB는 다음과 같은 상황에서 테이블에 추가 파티션을 할당합니다.
+ 기존 파티션이 지원할 수 있는 한도를 초과하여 테이블의 할당된 처리량 설정을 늘리는 경우.
+ 기존 파티션 용량이 다 차서 추가 스토리지 공간이 필요한 경우.

파티션 관리는 백그라운드에서 자동으로 이루어지므로 애플리케이션에는 표시되지 않습니다. 테이블은 사용 가능한 처리량을 유지하며 프로비저닝된 처리량 요구 사항을 완전히 지원합니다.

자세한 내용은 [파티션 키 설계](bp-partition-key-design.md) 섹션을 참조하세요.

DynamoDB의 글로벌 보조 인덱스도 파티션으로 구성됩니다. 글로벌 보조 인덱스의 데이터는 기본 테이블의 데이터와 별도로 저장되지만 인덱스 파티션은 테이블 파티션과 동일한 방식으로 동작합니다.

## 데이터 배포: 파티션 키
<a name="HowItWorks.Partitions.SimpleKey"></a>

테이블이 단순 기본 키를 가질 경우(파티션 키만 있음) DynamoDB가 파티션 키 값을 기준으로 각 항목을 저장하고 검색합니다.

테이블에 항목을 쓰기 위해 DynamoDB는 내부 해시 함수에 대한 입력으로 파티션 키 값을 사용합니다. 해시 함수 출력 값은 항목을 저장할 파티션을 결정합니다.

테이블에서 항목을 읽으려면 항목의 파티션 키 값을 지정해야 합니다. DynamoDB는 이 값을 해당 해시 함수의 입력으로 사용하여 항목을 찾을 수 있는 파티션을 결정합니다.

다음 다이어그램은 여러 파티션에 걸쳐 데이터가 저장된 *Pets*라는 테이블을 보여줍니다. 테이블의 기본 키는*AnimalType*입니다(이 키 속성만 표시됨). DynamoDB는 해시 함수를 사용하여 새 항목을 저장할 위치를 결정합니다. 이 경우 문자열 *Dog*의 해시 값이 기준으로 사용됩니다. 항목은 정렬 순서대로 저장되지 않습니다. 각 항목의 위치는 파티션 키의 해시 값으로 결정됩니다.

![\[파티션 키 해시 값에 기반한 DynamoDB의 파티션 간 테이블 항목 배포.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/HowItWorksPartitionKey.png)


**참고**  
DynamoDB는 파티션 수와 상관없이 항목을 테이블의 파티션에 균일하게 분배하는 데 최적화되어 있습니다. 테이블 항목 수에 비해 많은 수의 고유 값을 가질 수 있는 파티션 키를 선택할 것을 권장합니다.

## 데이터 배포: 파티션 키 및 정렬 키
<a name="HowItWorks.Partitions.CompositeKey"></a>

테이블에 복합 기본 키(파티션 키 및 정렬 키)가 있는 경우 [데이터 배포: 파티션 키](#HowItWorks.Partitions.SimpleKey)에 설명된 동일한 방식으로 DynamoDB에서 파티션 키의 해시 값을 계산합니다. 하지만 파티션 키 값이 같은 항목을 서로 가깝게 유지하고 정렬 키 속성 값을 기준으로 정렬하는 경향이 있습니다. 동일한 파티션 키 속성 값을 가진 항목 세트를 항목 모음이라고 합니다. 항목 모음은 모음 내 항목 범위를 효율적으로 검색할 수 있도록 최적화되어 있습니다. 테이블에 로컬 보조 인덱스가 없는 경우 DynamoDB는 데이터를 저장하고 읽기 및 쓰기 처리량을 제공하는 데 필요한 만큼의 파티션으로 항목 모음을 자동으로 분할합니다.

테이블에 항목을 기록하기 위해 DynamoDB는 파티션 키의 해시 값을 계산하여 항목을 저장할 파티션을 결정합니다. 해당 파티션에서는 여러 항목이 동일한 파티션 키 값을 가질 수 있습니다. 따라서 DynamoDB에서 동일한 파티션 키의 다른 항목 간에 정렬 키에 의해 오름차순으로 항목을 저장합니다.

테이블에서 항목을 읽으려면 항목의 파티션 키 값과 정렬 키 값을 지정해야 합니다. DynamoDB는 파티션 키의 해시 값을 계산하여 항목을 찾을 수 있는 파티션을 결정합니다.

원하는 항목이 동일한 파티션 키 값을 가질 경우 단일 작업(`Query`)으로 테이블에서 여러 항목을 읽을 수 있습니다. DynamoDB는 해당 파티션 키 값을 갖는 모든 항목을 반환합니다. 특정 값 범위의 항목만 반환되도록 정렬 키에 조건을 적용할 수 있습니다(선택 사항).

*Pets* 테이블이 *AnimalType*(파티션 키)와 *Name*(정렬 키)으로 구성된 복합 기본 키를 가진다고 가정하겠습니다. 다음 다이어그램에서는 DynamoDB가 파티션 키 값 *Dog*와 정렬 키 값 *Fido*를 사용하여 항목을 씁니다.

![\[DynamoDB는 복합 파티션 키가 있는 항목을 저장하고 정렬 키 속성 값을 사용하여 항목을 정렬합니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/HowItWorksPartitionKeySortKey.png)


*Pets* 테이블에서 동일한 항목을 읽기 위해 DynamoDB는 *Dog*의 해시 값을 계산하여 이들 항목이 저장된 파티션을 알아냅니다. 그런 다음 DynamoDB는 *Fido*를 찾을 때까지 정렬 키 속성 값을 스캔합니다.

*AnimalType*이 *Dog*인 항목을 모두 읽으려면 정렬 키 조건을 지정하지 않고 `Query` 작업을 실행합니다. 기본적으로 항목은 정렬 순서대로, 즉 정렬 키 기준 오름차순으로 반환됩니다. 선택 사항으로 내림차순을 요청할 수 있습니다.

일부 *Dog* 항목만 쿼리하려면 정렬 키에 조건을 적용할 수 있습니다(예: *Name*이 `A`\$1`K` 범위 내 문자로 시작하는 *Dog* 항목만).

**참고**  
DynamoDB 테이블에서 파티션 키 값당 고유 정렬 키 값의 수는 상한이 없습니다. *Pets* 테이블에서 수십억 개의 *Dog* 항목을 저장해야 하는 경우 DynamoDB는 충분한 스토리지를 할당하여 이 요구 사항을 자동으로 처리합니다.