JAVA 프로그래밍/AWS DynamoDB

DymamoDB Model

한디벨 2019. 9. 23. 19:11

 

테스트모델.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
@ToString(callSuper = true)
@SuppressWarnings("serial")
@DynamoDBTable(tableName="TEST_DDB")
public class 테스트모델 extends 공통모델 {
 
    @DynamoDBHashKey(attributeName="hash_key")
    @Getter@Setter
    private String hk;
 
    @DynamoDBRangeKey(attributeName="sort_key")
    @Getter@Setter
    private String sk;
 
    // GSI Partition Key 선언
    @DynamoDBIndexHashKey(attributeName="GSI01_HK", globalSecondaryIndexName = "GSI_01")
    @Getter@Setter
    private String gsi01Hk;
 
    // GSI Sort Key 선언
    @DynamoDBIndexRangeKey(attributeName="GSI01_SK", globalSecondaryIndexName = "GSI_01")
    @Getter@Setter
    private String gsi01Sk;
 
    @DynamoDBAttribute(attributeName="mall_nm")
    @Getter@Setter
    private String mallNm;
 
    @DynamoDBAttribute(attributeName="mdia_cd")
    @Getter@Setter
    private String mdiaCd;
 
    @DynamoDBAttribute(attributeName = "prir_rnkg")
    @Getter@Setter
    private String prirRnkg;
 
    @DynamoDBAttribute(attributeName = "tgt_scn_typ_cd")
    @Getter@Setter
    private String tgtScnTypCd;
 
    @DynamoDBAttribute(attributeName="dp_strt_dttm")
    @Setter@Getter(onMethod_= {@DynamoDBTypeConverted( converter = DDBTimestampConverter.class )})
    private Timestamp dpStrtDttm;
 
    @DynamoDBAttribute(attributeName="dp_end_dttm")
    @Setter@Getter(onMethod_= {@DynamoDBTypeConverted( converter = DDBTimestampConverter.class )})
    private Timestamp dpEndDttm;
 
}
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

공통모델.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
@SuppressWarnings("serial")
@DynamoDBDocument
public class 공통모델 implements Serializable {
 
    
    @DynamoDBAttribute(attributeName="reg_dttm")
    private Timestamp regDttm;
    
    @DynamoDBAttribute(attributeName="regr_id")
    private String regrId;
 
    @DynamoDBAttribute(attributeName="mod_dttm")
    private Timestamp modDttm;
    
    @DynamoDBAttribute(attributeName="modr_id")
    private String modrId;
 
    public String getRegrStDvsCd() {
        return regrStDvsCd;
    }
 
    public void setRegrStDvsCd(String regrStDvsCd) {
        this.regrStDvsCd = regrStDvsCd;
    }
 
    @DynamoDBTypeConverted( converter = DDBTimestampConverter.class )
    public Timestamp getRegDttm() {
        return regDttm;
    }
    
    public void setRegDttm(Timestamp regDttm) {
        this.regDttm = regDttm;
    }
    
    public String getRegrId() {
        return regrId;
    }
 
    public void setRegrId(String regrId) {
        this.regrId = regrId;
    }
 
    public String getModrStDvsCd() {
        return modrStDvsCd;
    }
 
    public void setModrStDvsCd(String modrStDvsCd) {
        this.modrStDvsCd = modrStDvsCd;
    }
    
    @DynamoDBTypeConverted( converter = DDBTimestampConverter.class )
    public Timestamp getModDttm() {
        return modDttm;
    }
    
    public void setModDttm(Timestamp modDttm) {
        this.modDttm = modDttm;
    }
    
    public String getModrId() {
        return modrId;
    }
 
    public void setModrId(String modrId) {
        this.modrId = modrId;
    }
 
    @Override
    public String toString() {
        return "[regrId=" + regrId + ", regDttm=" + regDttm
                + ", modrId=" + modrId + ", modDttm=" + modDttm + "]";
    }
    
}
 
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

위 소스는 DynamoDB(줄여서 DDB)의 VO 의 소스코드입니다.

테스트모델.java 는 공통모델.java 를 extends 하고 있으며, 공통모델.java 에서는 여러 모델들에서 쓰일 등록자id, 등록일자 등의

공통 어트리뷰트를 정의하고 있습니다.

모델들에는 @SuppressWarning("serial") 어노테이션을 사용해 컴파일 시에 직렬화 가능 클래스에 대한 누락된 serialVersionUID 필드와

관련된 경고를 억제합니다.

또한 테스트모델에서는 게터와 세터 및 투스트링을 편하게 쓰기 위해 lombok 을 임포트하여 사용하고 있습니다.

따라서 @Getter 와 @Setter 어노테이션을 사용하였습니다.

 

눈여겨 볼 점은 각 어트리뷰트에 붙어있는 어노테이션의 의미입니다.

@DynamoDBHashKey(attributeName="hash_key") : DDB의 해쉬키에 해당하는 어트리뷰트에 붙이는 어노테이션입니다. 괄호안은 DDB 테이블의 어트리뷰트명 입니다. 각 모델에 필수로 존재하여야 합니다.

@DynamoDBRangeKey(attributeName="sort_key") : DDB의 정렬키에 해당하는 어트리뷰트에 붙이는 어노테이션입니다. 괄호안은 정렬키(소트키) 명 입니다. 정렬키를 따로 쓰지 않아도 되지만 쿼리 검색 시에 성능을 위해 사용해 줍시다. (범위 지정을 통해 쿼리 가능)

@DynamoDBAttribute(attributeName="mall_nm") : DDB의 어트리뷰트에 붙이는 어노테이션입니다. 괄호안은 어트리뷰트명 입니다.

 

다음은 GSI(글로벌 세컨더리 인덱스)와 관련된 어트리뷰트에서 사용하는 어노테이션입니다.

@DynamoDBIndexHashKey(attributeName="GSI01_HK", globalSecondaryIndexName = "GSI_01") : GSI 의 해쉬키에 붙이는 어노테이션 입니다. 첫번째 파라미터는 해쉬키의 어트리뷰트명, 두번째 파라미터는 어떤 인덱스를 사용할지 명시하는 GSI 명입니다.

@DynamoDBIndexRangeKey(attributeName="GSI01_SK", globalSecondaryIndexName = "GSI_01") : GSI 의 정렬키에 붙이는 어노테이션 입니다. 첫번째 파라미터는 정렬키의 어트리뷰트명, 두번째 파라미터는 어떤 인덱스를 사용할지 명시하는 GSI 명입니다.

 

그 외에도 유용하게 사용되는 어노테이션은 다음과 같습니다.

@DynamoDBDocument : @DynamoDBTable 과 유사한 기능을 가진 어노테이션입니다. 이 어노테이션이 붙은 클래스는 DDB 의 문서로 나타낼 수 있습니다. @DynamoDBTable 과의 차이점은 테이블명을 기재하지 않아도 된다는 점입니다. 때문에 공통모델에 사용되는 어노테이션입니다.

@DynamoDBTypeConverted( converter = DDBTimestampConverter.class ) : AWS DDB JDK 에서 제공하는 DynamoDBTypeConverter 를 DDBTimestampConverter 를 임플리먼트하여 제공하는 어노테이션입니다.

converter 에 설정해주는 클래스에 따라서 임의로 데이터 매핑을 시켜줍니다.

아래는 DDBTimestampConverter.java 의 코드입니다. 이 클래스를 이용해서 문자열을 타임스탬프로,  타임스탬프를 문자열로 바꿔줄 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DDBTimestampConverter implements DynamoDBTypeConverter<String, Timestamp> {
 
    @Override
    public String convert(Timestamp object) {
        return object.toString();
    }
 
    @Override
    public Timestamp unconvert(String object) {
        return Timestamp.valueOf(object);
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs