티스토리 뷰

개요

  • Spring Boot 기반 프로젝트에서 DynamoDB를 사용하기 위한 @DynamoDbBean 클래스를 작성하는 방법을 정리하였다.

사전 요구 지식

@DynamoDbBean 빈 설계 예

  • @DynamoDbBeanJPA@Entity와 동일한 역할을 수행하는 빈을 작성할 때 명시한다. 실제 DynamoDB의 물리 테이블을 맵핑하는 역할을 해준다. 따라서 실제 테이블에 설계된 Primary KeySecondary Index가 정확하게 반영되어야 한다. 아래는 환율과 국가 코드에 따른 일간 환율 정보를 저장하는 테이블에 맵핑되는 빈의 작성 예이다.
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.*
import java.math.BigDecimal

@DynamoDbBean
data class Currency(

    // KSUID
    @get:DynamoDbAttribute("id")
    var id: String = "",

    // Primary Key
    // pk-currencyCode-contryCode-sk-timestamp
    @get:DynamoDbPartitionKey
    @get:DynamoDbAttribute("PK")
    var pk: String = "",

    @get:DynamoDbAttribute("currency_code")
    @get:DynamoDbSecondaryPartitionKey(indexNames = ["gsi-pk-currency-code-sk-timestamp"])
    var currencyCode: String = "",

    @get:DynamoDbAttribute("contry_code")
    var contryCode: String = "",

    @get:DynamoDbAttribute("value")
    var value: BigDecimal = BigDecimal.ZERO,

    @get:DynamoDbSortKey
    @get:DynamoDbAttribute("timestamp")
    @get:DynamoDbSecondarySortKey(indexNames = ["gsi-pk-currency-code-sk-timestamp"])
    var timestamp: String = ""
)
  • DynamoDB의 엔티티 클래스에는 @DynamoDbBean을 명시한다.
  • 각 애트리뷰트와 필드를 맵핑하기 위한 정보로서 @DynamoDbAttribute을 명시할 수 있다. 이를 통해 물리적인 애트리뷰트의 이름과 필드명을 다르게 할 수 있다.
  • Primary Key(PK)Partition Key(PK)에 해당하는 필드에는 @DynamoDbPartitionKey를 명시한다. 마찬가지로 Primary Key(PK)Sort Key(SK)에 해당하는 필드에는 @DynamoDbSortKey를 명시한다.
  • GSI에는 앞서 PK와 유사하게 @DynamoDbSecondaryPartitionKey@DynamoDbSecondarySortKey를 명시한다.

Instant 날짜/시간 타입 애트리뷰트

  • UTC+0 기준의 timestamp 정보를 저장하는 Instant 타입은 자동으로 DynamoDBString 타입으로 변환된다. (Instant 타입의 toString() 값인 ISO 8601 형식의 문자열이 그대로 저장된다.) 따라서 만약, Instant 타입을 PKSK로 사용할 경우 테이블 생성 시점에 반드시 String 타입으로 생성해야 한다.

참고 글

댓글
댓글쓰기 폼