

# SDK for Java 1.x를 사용하여 글로벌 보조 인덱스 쿼리
<a name="DAX.client.QueryGSI.java-sdk-v1"></a>

Amazon DynamoDB Accelerator(DAX)를 사용하면 DynamoDB [프로그래밍 인터페이스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.SDKs.Interfaces.html)를 사용하여 [글로벌 보조 인덱스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html)를 쿼리할 수 있습니다.

다음 예에서는 DAX를 사용하여 [예: AWS SDK for Java 문서 API를 사용하는 글로벌 보조 인덱스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSIJavaDocumentAPI.Example.html)에서 생성된 `CreateDateIndex` 글로벌 보조 인덱스를 쿼리하는 방법을 설명합니다.

`DAXClient` 클래스는 DynamoDB 프로그래밍 인터페이스와 상호 작용하는 데 필요한 클라이언트 객체를 인스턴스화합니다.

```
import com.amazon.dax.client.dynamodbv2.AmazonDaxClientBuilder;
import software.amazon.dynamodb.datamodeling.DynamoDBMapper;
import software.amazon.dynamodb.document.DynamoDB;
import com.amazonaws.util.EC2MetadataUtils;
import software.amazon.dynamodb.AmazonDynamoDB;

public class DaxClient {

	private static final String region = EC2MetadataUtils.getEC2InstanceRegion();

	DynamoDB getDaxDocClient(String daxEndpoint) {
		System.out.println("Creating a DAX client with cluster endpoint " + daxEndpoint);
		AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard();

		daxClientBuilder.withRegion(region).withEndpointConfiguration(daxEndpoint);
		AmazonDynamoDB client = daxClientBuilder.build();

		return new DynamoDB(client);
	}

	DynamoDBMapper getDaxMapperClient(String daxEndpoint) {
		System.out.println("Creating a DAX client with cluster endpoint " + daxEndpoint);
		AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard();

		daxClientBuilder.withRegion(region).withEndpointConfiguration(daxEndpoint);
		AmazonDynamoDB client = daxClientBuilder.build();

		return new DynamoDBMapper(client);
	}
}
```

다음 방법으로 글로벌 보조 인덱스를 쿼리할 수 있습니다.
+ 다음 예제에서 정의된 `queryIndex` 클래스의 `QueryIndexDax` 메서드를 사용합니다. `QueryIndexDax`는 `getDaxDocClient` 클래스의 `DaxClient` 메서드에서 반환된 클라이언트 객체를 파라미터로 사용합니다.
+ [객체 지속성 인터페이스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.SDKs.Interfaces.Mapper.html)를 사용하고 있는 경우 다음 예제에서 정의된 `QueryIndexDax` 클래스의 `queryIndexMapper` 메서드를 사용합니다. `queryIndexMapper`는 `getDaxMapperClient` 클래스에 정의된 `DaxClient` 메서드에서 반환된 클라이언트 객체를 파라미터로 사용합니다.

```
import java.util.Iterator;
import software.amazon.dynamodb.datamodeling.DynamoDBMapper;
import java.util.List;
import software.amazon.dynamodb.datamodeling.DynamoDBQueryExpression;
import software.amazon.dynamodb.model.AttributeValue;
import java.util.HashMap;
import software.amazon.dynamodb.document.Item;
import software.amazon.dynamodb.document.utils.ValueMap;
import software.amazon.dynamodb.document.spec.QuerySpec;
import software.amazon.dynamodb.document.QueryOutcome;
import software.amazon.dynamodb.document.ItemCollection;
import software.amazon.dynamodb.document.Index;
import software.amazon.dynamodb.document.Table;
import software.amazon.dynamodb.document.DynamoDB;

public class QueryIndexDax {

	//This is used to query Index using the low-level interface.
	public static void queryIndex(DynamoDB client, String tableName, String indexName) {
		Table table = client.getTable(tableName);

		System.out.println("\n***********************************************************\n");
		System.out.print("Querying index " + indexName + "...");

		Index index = table.getIndex(indexName);

		ItemCollection<QueryOutcome> items = null;

		QuerySpec querySpec = new QuerySpec();

		if (indexName == "CreateDateIndex") {
			System.out.println("Issues filed on 2013-11-01");
			querySpec.withKeyConditionExpression("CreateDate = :v_date and begins_with(IssueId, :v_issue)")
					.withValueMap(new ValueMap().withString(":v_date", "2013-11-01").withString(":v_issue", "A-"));
			items = index.query(querySpec);
		} else {
			System.out.println("\nNo valid index name provided");
			return;
		}

		Iterator<Item> iterator = items.iterator();

		System.out.println("Query: printing results...");

		while (iterator.hasNext()) {
			System.out.println(iterator.next().toJSONPretty());
		}

	}

	//This is used to query Index using the high-level mapper interface.
	public static void queryIndexMapper(DynamoDBMapper mapper, String tableName, String indexName) {
		HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
		eav.put(":v_date", new AttributeValue().withS("2013-11-01"));
		eav.put(":v_issue", new AttributeValue().withS("A-"));
		DynamoDBQueryExpression<CreateDate> queryExpression = new DynamoDBQueryExpression<CreateDate>()
				.withIndexName("CreateDateIndex").withConsistentRead(false)
				.withKeyConditionExpression("CreateDate = :v_date and begins_with(IssueId, :v_issue)")
				.withExpressionAttributeValues(eav);

		List<CreateDate> items = mapper.query(CreateDate.class, queryExpression);
		Iterator<CreateDate> iterator = items.iterator();

		System.out.println("Query: printing results...");

		while (iterator.hasNext()) {
			CreateDate iterObj = iterator.next();
			System.out.println(iterObj.getCreateDate());
			System.out.println(iterObj.getIssueId());
		}
	}
}
```

아래의 클래스 정의는 Issues 테이블을 나타내며 `queryIndexMapper` 메서드에서 사용됩니다.

```
import software.amazon.dynamodb.datamodeling.DynamoDBTable;
import software.amazon.dynamodb.datamodeling.DynamoDBIndexHashKey;
import software.amazon.dynamodb.datamodeling.DynamoDBIndexRangeKey;
import software.amazon.dynamodb.datamodeling.DynamoDBHashKey;

@DynamoDBTable(tableName = "Issues")
public class CreateDate {
	private String createDate;
	@DynamoDBHashKey(attributeName = "IssueId")
	private String issueId;

	@DynamoDBIndexHashKey(globalSecondaryIndexName = "CreateDateIndex", attributeName = "CreateDate")
	public String getCreateDate() {
		return createDate;
	}

	public void setCreateDate(String createDate) {
		this.createDate = createDate;
	}

	@DynamoDBIndexRangeKey(globalSecondaryIndexName = "CreateDateIndex", attributeName = "IssueId")
	public String getIssueId() {
		return issueId;
	}

	public void setIssueId(String issueId) {
		this.issueId = issueId;
	}
}
```