Java(AWS SDK v2)의 DynamoDB GetItem
AWS SDK for Java 2.x는 항목을 불변 빌더로 조립한 Map<String, AttributeValue>로 모델링합니다. 이 SDK의 관례 두 가지는 다른 대부분의 SDK와 다릅니다. 숫자가 문자열로 타이핑되고, 응답 컬렉션은 결코 null이 아닙니다.
요청 자체에는 다른 곳과 마찬가지로 전체 기본 키가 필요합니다.
코드
import java.util.HashMap;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
public class GetItemExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, AttributeValue> key = new HashMap<>();
key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());
Map<String, String> names = new HashMap<>();
names.put("#proj0", "Artist");
names.put("#proj1", "SongTitle");
names.put("#proj2", "AlbumTitle");
names.put("#proj3", "Year");
GetItemRequest request = GetItemRequest.builder()
.tableName("Music")
.key(key)
.projectionExpression("#proj0, #proj1, #proj2, #proj3")
.expressionAttributeNames(names)
.build();
Map<String, AttributeValue> item = ddb.getItem(request).item();
if (item.isEmpty()) {
System.out.println("Item not found");
} else {
System.out.println(item);
}
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}설명
n()은String을 받습니다 —AttributeValue.builder().n(1994)는 컴파일되지 않습니다. Javadoc이 이유를 알려줍니다. "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." 그러니n("1994")이며, 돌려받을 때 파싱하는 것은 여러분 몫입니다.item()은 결코null을 반환하지 않습니다 — 일치하는 항목이 없으면 빈 맵이 나오므로isEmpty()가 검사 방법입니다. "서비스가 아무것도 반환하지 않았다"와 "서비스가 빈 맵을 반환했다"를 구분하려면hasItem()을 호출하세요. SDK가 빈 컬렉션을 자동으로 만들기 때문에 그것을 꿰뚫어 보는 것은hasItem()뿐입니다.- 돌려받은 맵은 불변입니다 — Javadoc은 그것을 수정하면
UnsupportedOperationException이 발생한다고 분명히 밝힙니다. 편집할 계획이라면 먼저HashMap으로 복사하세요. - 별칭 맵을 로컬에서 검증해 주는 것은 없습니다 —
expressionAttributeNames는 평범한Map<String, String>입니다.Year가 예약어이므로 여기서는#proj3이 필요하고, 선언해 놓고 참조하지 않는 별칭은 그 자체로 서비스 측 오류입니다. "Value provided in ExpressionAttributeNames unused in expressions"를 참조하세요. - 애플리케이션 전체에 클라이언트 하나 — AWS는 이렇게 못 박습니다. "Service clients in the AWS SDK for Java 2.x are thread-safe." try-with-resources 블록은 한 번만 실행되는
main에 어울립니다. 오래 실행되는 서비스에서는 시작할 때 클라이언트를 만들고 요청마다 닫지 마세요. .consistentRead(true)— 읽기 비용을 두 배로 만들고 GSI에서는 거부됩니다.AttributeValue맵이 버겁게 느껴진다면, DynamoDB Enhanced Client(software.amazon.awssdk.enhanced.dynamodb)가 동일한 저수준 호출 위에서 항목을 애너테이션이 붙은 빈에 매핑해 줍니다.
시각적으로 해보기
이 읽기가 0.5 용량 단위인지 1 용량 단위인지는 항목이 4 KB 안에 들어가느냐로 갈립니다. 항목 크기 계산기가 붙여 넣은 항목을 그 경계에 대고 측정해 줍니다.
DynoTable은 같은 항목을 평범한 행으로 보여주고, 그리드 뒤의 쿼리를 이 빌더들로 만든 Java 프로그램으로 내보냅니다. DynoTable 다운로드.
관련 예제
- Go의 DynamoDB GetItem — AWS SDK for Go v2로 수행하는 동일한 읽기.
- Java의 DynamoDB Query — 항목 하나 대신 파티션 전체를 읽기.
- DynamoDB 파티션 키의 동작 방식 —
GetItem에 전체 키가 필요한 이유. - DynamoDB ResourceNotFoundException — 여기서 흔한 첫 오류: 잘못된 테이블 이름이나 리전.
- "The provided key element does not match the schema" — 전달한 키가 테이블의 키 스키마와 맞지 않는 경우.
참고 자료
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- GetItemRequest — AWS SDK for Java 2.x API Reference
- Read consistency — Amazon DynamoDB Developer Guide
- Use singleton service client instances with the AWS SDK for Java 2.x
위에 링크된 공식 AWS 문서를 기준으로 2026-07-28에 마지막으로 검증했습니다.