아무거나

[DynamoDB] Java 에서 BatchGetItem 사용 (WHERE IN) 본문

Infra/AWS

[DynamoDB] Java 에서 BatchGetItem 사용 (WHERE IN)

전봉근 2023. 5. 2. 20:34
반응형
  • BatchGetItem (WHERE IN)
    • 정의
      • 다수의 테이블 아이템을 hashkey, rangedkey 를 지정해서 가져올 수 있으나 결과값이 100개로 제한된다, 특정 rangedkey 로 다수의 아이템 검색이 필요하면 query 과 권장된다.
      • BatchGetItem 은 조건식을 사용할 수 없고 쿼리 결과를 수정할 수 없기 때문에 상황에 따라 GetItem 과 적절하게 선택하여 사용하는것이 좋다.
      • WHERE IN 절과 비슷하게 사용할 수 있다.
    • 사용법(SDK)
      [build.gradle]
      ...
      implementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.239'    
      ...
      
      [DynamoDBConfig.java]
      ...
      import com.amazonaws.services.dynamodbv2.document.DynamoDB;
      
      ...
      
      @Bean
      public DynamoDB dynamoDB() {
          return new DynamoDB(buildAmazonDynamoDB());
      }
      
      @Bean
      public AmazonDynamoDB buildAmazonDynamoDB() {
          return AmazonDynamoDBClientBuilder
              .standard()
              .withEndpointConfiguration(
                  new AwsClientBuilder.EndpointConfiguration("dynamodb.ap-northeast-2.amazonaws.com", Regions.AP_NORTHEAST_2.getName())
              )
              .withCredentials(awsCredentialsProvider())
              .build();
      }
      
      ...
      
      [Test.java]
      ...
      
      import com.amazonaws.services.dynamodbv2.document.BatchGetItemOutcome;
      import com.amazonaws.services.dynamodbv2.document.DynamoDB;
      import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes;
      import com.amazonaws.services.dynamodbv2.model.ReturnConsumedCapacity;
      
      ...
      
      @RequiredArgsConstructor
      @Repository
      public class DdbTest {
          ...
          private final DynamoDB dynamoDB;
      
          ...
          public void getTest() {
              // testdb: 테이블명
              TableKeysAndAttributes tableKeysAndAttributes = new TableKeysAndAttributes("testdb");
              tableKeysAndAttributes.addHashAndRangePrimaryKey("hk", "test1");  // hash key
              tableKeysAndAttributes.addHashAndRangePrimaryKey("sk", "test2");  // ranged key
      
              BatchGetItemOutcome outcome = dynamoDB.batchGetItem(ReturnConsumedCapacity.TOTAL, tableKeysAndAttributes);      
              if (!outcome.getTableItems().isEmpty()) {
                  for (String tableName : outcome.getTableItems().keySet()) {
                      System.out.println("Items in table " + tableName);
                      List<Item> items = outcome.getTableItems().get(tableName);
                      for (Item item : items) {
                          System.out.println(item);
                      }
                  }
              }
          }
          ...
      }
      
반응형
Comments