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 다운로드.

관련 예제

참고 자료

위에 링크된 공식 AWS 문서를 기준으로 2026-07-28에 마지막으로 검증했습니다.

Console 없이 DynamoDB 작업하기

DynamoDB로는 실행할 수 없는 진짜 SQL(JOINs, GROUP BY, 집계)을 실행하는 빠른 DynamoDB 데스크톱 클라이언트. 시각적 편집과 여러분 자신의 Bedrock 키로 동작하는 AI 에이전트를 제공합니다.

30일 무료 체험, 신용카드 불필요 — 이후 기간 제한 없는 무료 요금제.