DynamoDB - Java DateType & Annotation


Date :

Category : ,


DynamoDB & Java

  • 저수준의 Java 용 AWS SDK 를 사용하여 DynamoDB 작업을 수행할 수도 있다. 하지만 객체와 테이블 데이터 간 매핑에 불편함이 있어 고수준의 추상화를 갖춘 DynamoDBMapper 클래스를 지원해준다.
  • 객체와 테이블을 매핑해주는 전용 Annotation 과 객체 메서드를 제공해주어 객체 중심으로 개발이 가능하다.

데이터 타입

  • DynamoDB 데이터와 매핑을 지원해주는 Java 타입

    • String

      • 2.0 AWS SDK 부터 empty string 허용
    • java 의 primitive type & boxing type

    • Date, Calendar (ISO_8601)

    • BigDemical, BigInteger

    • Collections

      • List, Set, Map

        Java 형식 DynamoDB 유형
        Number N
        String S
        Bool BOOL, 0 또는 1
        ByteBuffer B
        날짜 S
        Set(집합) 컬렉션 형식 SS(문자열 집합), NS(숫자 집합), BS(이진수 집합)

임의 데이터 매핑

  • 매핑을 제공하는 기본 타입이 아닌 경우 DynamoDBTypeConverter interface 를 구현하여 Java Type <-> DynamoDB Type 간 변환을 처리할 수 있다.
public class LocalDateTimeConverter implements DynamoDBTypeConverter<Date, LocalDateTime> {
    @Override
    public Date convert(final LocalDateTime object) {
        return Date.from(object.toInstant(UTC));
    }

    @Override
    public LocalDateTime unconvert(final Date object) {
        return object.toInstant().atZone(TimeZone.getDefault().toZoneId()).toLocalDateTime();
    }
}
@DynamoDBAttribute(attributeName = "crtDt")
@DynamoDBTypeConverted(converter = LocalDateTimeConverter.class)
private LocalDateTime createdAt;

DynamoDB Annotation

DynamoDBTable
  • 테이블 매핑
  • 상속, 재정의 가능
DynamoDBAttribute
  • 필드를 테이블 속성과 매핑
  • 클래스의 field 와 getter 메서드에 작성 가능.
DynamoDBDocument
  • JSON Document 를 Map(M) 유형의 DynamoDB Attribute 로 매핑하려는 경우
  • (JPA 의 Embedded, Embeddable 과 다르다. 객체지향적으로 엔티티를 매핑하는 Embedded 와 다르게 DynamoDBDocument 는 단지 JSON 을 매핑해주는 역할만한다. DynamoDB 에서는 객체지향적으로 매핑하는 방법은 따로 없는 것 같다.)
DynamoDBTypeConverted
  • DynamoDB 에서 지원하는 타입이 아닌 개발자가 만든 타입으로 convert 해주는 주석
  • DynamoDBTypeConverter interface 를 상속받는 클래스를 구현해서 annotation 의 속성 값으로 넣어야 동작한다.
  • JPA 의 Embedded, Embeddable 처럼 여러 속성을 하나의 class 로 매핑하는 것은 아니고, 하나의 속성을 하나의 class 로 매핑하는 것이다. 유사하지만 조금 다르다.
DynamoDBVersionAttribute
  • 버전 번호를 이용한 낙관적 잠금
    • @DynamoDBVersionAttribute
    • 처음 객체를 저장할때 DynamoDBMapper 가 번호를 자동으로 저장하고, 업데이트할 때 번호가 일정하게 올라간다. 업데이트나 삭제할 때 번호가 일치해야만 쿼리가 수행된다.

⚠️ 주의

Setter, Default constructor 필수
  • setter 와 default constructor 를 필수로 선언해야 한다.
    • Setter 를 필수적으로 작성해야하고, 기본 생성자의 경우 PROTECTED 가 아닌 PUBLIC 으로 접근 제한자를 열어야 한다.
getter 선언 주의
  • DynamoDB 의 Attribute 로 매핑되는 필드가 아닌 일반적인 기능 메서드를 getXXX 로 네이밍하면 DynamoDB 가 attribute 로 인식하여 Annotation 이 없다는 예외가 런타임에 발생한다.
    • prefix 를 다른 네이밍으로 변경하던지, @DynamoDBIgnore annotation 을 붙여야 한다.

참고