DynamoDB의 테이블 작업 - AWS SDK for Java 1.x

AWS SDK for Java 1.x는 2024년 7월 31일부터 유지 관리 모드로 전환되었으며 2025년 12월 31일에 지원 종료될 예정입니다. 새로운 기능, 가용성 개선 및 보안 업데이트를 계속 받으려면 AWS SDK for Java 2.x로 마이그레이션하는 것이 좋습니다.

DynamoDB의 테이블 작업

테이블은 DynamoDB 데이터베이스에 있는 모든 항목의 컨테이너입니다. DynamoDB에 데이터를 추가하거나 삭제하기 전에 먼저 테이블을 만들어야 합니다.

각 테이블마다 다음을 정의해야 합니다.

  • 계정 및 리전에 고유한 테이블 이름

  • 모든 값이 고유한 기본 키. 테이블의 두 항목에 동일한 기본 키 값을 지정할 수 없습니다.

    기본 키는 단일 파티션(HASH) 키로 이루어진 단순형이거나, 파티션과 정렬(RANGE) 키로 이루어진 복합형일 수 있습니다.

    각 키 값에는 ScalarAttributeType 클래스에 의해 열거되는 관련 데이터 유형이 있습니다. 키 값은 이진(B), 숫자(N) 또는 문자열(S)일 수 있습니다. 자세한 정보는 Amazon DynamoDB 개발자 안내서의 명명 규칙과 데이터 유형을 참조하세요.

  • 테이블에 대해 예약된 읽기/쓰기 용량 단위를 정의하는 프로비저닝된 처리량

    참고

    Amazon DynamoDB요금은 테이블에 대해 설정하는 프로비저닝된 처리량 값을 기준으로 하므로 테이블에 대해 필요한 만큼의 용량만 예약하세요.

언제라도 테이블의 프로비저닝된 처리량을 수정할 수 있으므로 변경이 필요할 경우 용량을 조정할 수 있습니다.

표 생성

DynamoDB 클라이언트createTable 메서드를 사용하여 새 DynamoDB 테이블을 만듭니다. 테이블 속성과 테이블 스키마를 구성해야 하며, 이 두 가지 요소 모두 테이블의 기본 키를 식별하는 데 사용됩니다. 또한 프로비저닝된 초기 처리량 값과 테이블 이름도 지정해야 합니다. DynamoDB 테이블 생성 시 키 테이블 속성만 정의합니다.

참고

선택한 이름의 테이블이 이미 있는 경우 AmazonServiceException이 발생합니다.

가져옵니다.

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; import com.amazonaws.services.dynamodbv2.model.CreateTableResult; import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; import com.amazonaws.services.dynamodbv2.model.KeyType; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;

단순형 기본 키를 사용하여 테이블 생성

이 코드는 단순형 기본 키("Name")를 사용하여 테이블을 만듭니다.

코드

CreateTableRequest request = new CreateTableRequest() .withAttributeDefinitions(new AttributeDefinition( "Name", ScalarAttributeType.S)) .withKeySchema(new KeySchemaElement("Name", KeyType.HASH)) .withProvisionedThroughput(new ProvisionedThroughput( new Long(10), new Long(10))) .withTableName(table_name); final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); try { CreateTableResult result = ddb.createTable(request); System.out.println(result.getTableDescription().getTableName()); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

GitHub의 전체 예제를 참조하세요.

복합형 기본 키를 사용하여 테이블 생성

다른 AttributeDefinitionKeySchemaElementCreateTableRequest에 추가합니다.

코드

CreateTableRequest request = new CreateTableRequest() .withAttributeDefinitions( new AttributeDefinition("Language", ScalarAttributeType.S), new AttributeDefinition("Greeting", ScalarAttributeType.S)) .withKeySchema( new KeySchemaElement("Language", KeyType.HASH), new KeySchemaElement("Greeting", KeyType.RANGE)) .withProvisionedThroughput( new ProvisionedThroughput(new Long(10), new Long(10))) .withTableName(table_name);

GitHub의 전체 예제를 참조하세요.

테이블 나열

DynamoDB 클라이언트listTables 메서드를 호출하여 특정 리전의 테이블을 나열할 수 있습니다.

참고

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져옵니다.

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.ListTablesRequest; import com.amazonaws.services.dynamodbv2.model.ListTablesResult;

코드

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); ListTablesRequest request; boolean more_tables = true; String last_name = null; while(more_tables) { try { if (last_name == null) { request = new ListTablesRequest().withLimit(10); } else { request = new ListTablesRequest() .withLimit(10) .withExclusiveStartTableName(last_name); } ListTablesResult table_list = ddb.listTables(request); List<String> table_names = table_list.getTableNames(); if (table_names.size() > 0) { for (String cur_name : table_names) { System.out.format("* %s\n", cur_name); } } else { System.out.println("No tables found!"); System.exit(0); } last_name = table_list.getLastEvaluatedTableName(); if (last_name == null) { more_tables = false; }

기본적으로 호출당 최대 100개의 테이블이 반환됩니다. 반환된 ListTablesResult 객체에 getLastEvaluatedTableName를 사용하여 마지막으로 평가된 테이블을 가져올 수 있습니다. 이 값을 사용하여 이전 목록의 마지막으로 반환된 값 다음에 이어지는 목록을 시작할 수 있습니다.

GitHub의 전체 예제를 참조하세요.

테이블 설명(테이블에 대한 정보 가져오기)

DynamoDB 클라이언트describeTable 메서드를 호출합니다.

참고

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져옵니다.

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputDescription; import com.amazonaws.services.dynamodbv2.model.TableDescription;

코드

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); try { TableDescription table_info = ddb.describeTable(table_name).getTable(); if (table_info != null) { System.out.format("Table name : %s\n", table_info.getTableName()); System.out.format("Table ARN : %s\n", table_info.getTableArn()); System.out.format("Status : %s\n", table_info.getTableStatus()); System.out.format("Item count : %d\n", table_info.getItemCount().longValue()); System.out.format("Size (bytes): %d\n", table_info.getTableSizeBytes().longValue()); ProvisionedThroughputDescription throughput_info = table_info.getProvisionedThroughput(); System.out.println("Throughput"); System.out.format(" Read Capacity : %d\n", throughput_info.getReadCapacityUnits().longValue()); System.out.format(" Write Capacity: %d\n", throughput_info.getWriteCapacityUnits().longValue()); List<AttributeDefinition> attributes = table_info.getAttributeDefinitions(); System.out.println("Attributes"); for (AttributeDefinition a : attributes) { System.out.format(" %s (%s)\n", a.getAttributeName(), a.getAttributeType()); } } } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

GitHub의 전체 예제를 참조하세요.

테이블 수정(업데이트)

DynamoDB 클라이언트updateTable 메서드를 호출하여 언제라도 테이블의 프로비저닝된 처리량 값을 수정할 수 있습니다.

참고

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져옵니다.

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; import com.amazonaws.AmazonServiceException;

코드

ProvisionedThroughput table_throughput = new ProvisionedThroughput( read_capacity, write_capacity); final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); try { ddb.updateTable(table_name, table_throughput); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

GitHub의 전체 예제를 참조하세요.

테이블 삭제

DynamoDB 클라이언트deleteTable 메서드를 호출하고 테이블의 이름을 이 메서드에 전달합니다.

참고

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져옵니다.

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;

코드

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); try { ddb.deleteTable(table_name); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

GitHub의 전체 예제를 참조하세요.

추가 정보