티스토리 뷰

최근에 여러 일이 겹쳐 오랜만에 포스팅한다.

 

현재 담당하고 서비스의 개발은 대부분 RDB를 사용한다.

 

때문에 NoSQL DB를 접할 일이 많이 없었다.

 

이번에 이벤트성으로 개발할 일이 생겼는데, 이 개발에는 AWS DynamoDB를 사용해보자고 했다.

 

선택에는 별 다른 이유는 없었는데, 이벤트성 사용하고 치울 데이터를 메인 RDB에 저장할 필요가 없다고 느껴서였다.

 

그러나 저런 단순한 이유를 차치하더라도, AWS DynamoDB는 충분히 좋은 DB이다.

 

어떤 특성이 있는지 알아보자.

 

DynamoDB란?

Amazon DynamoDB는 키 값과 문서 데이터 모델을 지원하는 서버리스 NoSQL 데이터베이스 서비스의 일종입니다. 개발자는 Amazon DynamoDB를 사용하여 소규모로 시작하여 전 세계로 규모를 조정할 수 있는 최신 서버리스 애플리케이션을 구축할 수 있습니다. Amazon DynamoDB는 자동화된 수평 스케일링을 통해 거의 모든 크기의 테이블을 지원하도록 규모를 조정합니다.
- AWS

 

AWS에서 반복적으로 언급하는건 가용성, 내구성 및 내결함성이다.

 

쉽게 이야기하면 편리한 오토스케일링, 스케일 업 기능, 자동 로깅 및 백업, 일관된 10ms read 성능을 보장한다.

 

간단히 AWS Dynamo DB에 대해 알아봤으니 사용법을 알아보자.

 

Dynamo DB 설정하기

일단 Dynamo DB를 사용하려면 테이블을 만들어야한다.

 

우측의 테이블 생성을 누르거나 좌측 메뉴의 테이블 > 주황색 테이블 생성 버튼 클릭

 

 

이번 예제에는 정렬 키는 따로 사용하지 않을 것이다.

 

그리고 테스트용으로 사용할 것이니 온디맨드로 설정한다.

 

온디맨드와 프로비저닝은 쓴만큼 낼지 vs 사용량을 정해놓고 쓸지이다.

 

프로비저닝은 저장용량을 사전에 지정해놓은만큼 비용이 부과된다. 사용량이 적을 경우는 온디맨드를 추천한다.

 

설정은 여기서 끝이다. 테이블 생성을 클릭하면 테이블이 생성된다.

생성 중.. 생성 완료되면 상태가 활성으로 변경된다.

이제 스프링 부트에서 사용해보자.

 

스프링 부트에서 사용하기

build.gradle

implementation platform('software.amazon.awssdk:bom:2.20.56')
implementation("software.amazon.awssdk:dynamodb")
implementation("software.amazon.awssdk:dynamodb-enhanced")

platform으로 관리안하고 버전을 바로 붙여서도 사용 가능하다.

 

configuration

@Configuration
public class DynamoDBConfig {

    @Bean
    public DynamoDbEnhancedClient dynamoDbEnhancedClient() {

        return DynamoDbEnhancedClient.builder()
                .build();
    }
}

클라이언트는 aws 디폴트 설정을 가져가도록 했다.

 

설정방법은 여기서 확인

 

객체 설정

@Data
@Builder
@DynamoDbBean
@NoArgsConstructor
@AllArgsConstructor
public class DynamoDBEntity {
    private String id;
    private Integer maxToken;
    private String sortKey;
    private String model;
    private String prompt;
    private Boolean stream;
    private float temperature;

    @DynamoDbPartitionKey
    public String getId() {
        return this.id;
    }

    @DynamoDbSortKey
    public String getSortKey() {
        return this.sortKey;
    }
}

사실 여기서부터 자바랑은 좀 안맞나? 란 생각을 했다.

 

NoSQL의 장점 중 하나는 스키마리스(Schemaless) 또는 유연한 스키마(Flexible Schema) 라고 하는 유연한 데이터 모델인데, 자바에선 이 부분을 전혀 살리지 못하고 있어 보였다.

 

고정적인 객체를 사용해서 데이터를 주고 받아야하니까..

 

자유도를 위해 스트링으로 json 만들고 json을 객체로 재설정하면서 쓰기엔 자바는 너무 불편하다.

 

이제 데이터를 저장/조회 해보자.

 

데이터 저장하기

 

java sdk 1.x 버전에서는 dynamoMapper란 클래스를 DI 받아 사용했었다.

 

java sdk 2.x 버전부터는 DynamoDbEnhancedClient를 사용한다.

private final DynamoDbEnhancedClient dynamoDbEnhancedClient;

// 엔티티 정보 불러오기
DynamoDbTable<DynamoDBEntity> dynamoTable = dynamoDbEnhancedClient.table("dynamo-test", TableSchema.fromBean(DynamoDBEntity.class));

DynamoDBEntity dynamoDBEntity = DynamoDBEntity.builder()
                                              .id(UUID.randomUUID().toString())
                                              .maxToken(2000)
                                              .model("GPT-4")
                                              .prompt("hello world")
                                              .stream(true)
                                              .temperature(0.3f)
                                              .build();

dynamoTable.putItem(dynamoDBEntity);

저장 요청을 보낸 후 테이블명 클릭 > 표 항목 탐색으로 들어가면 데이터가 저장된 것을 확인 가능하다.

 

데이터 조회하기

GetItemEnhancedRequest request = GetItemEnhancedRequest.builder().key(Key.builder()
                                                                            .partitionValue("111")
                                                                            .build()).build();
DynamoDBEntity entity = dynamoTable.getItem(request);

조회도 간단하다. 하지만 조회 가능한 값은 파티션 키와 정렬 키 뿐이니 설정에 유의해야 할 것 같다.

 

마치며

AWS DynamoDB의 기본 기능을 소개해봤다.

 

이번 개발에는 CRUD만 사용했기 때문에 딱히 세부적인 기능을 사용하진 않았다.

 

개발 및 운영에 용이하다는 장점이 눈에 띄는 장점이 있지만, 언제나 비용이 걸림돌이다...

 

그리고 개인적인 생각이지만 객체지향 언어인 자바랑은 NoSQL은 그닥 잘 어울리지 않는 것 같다.

 

NodeJs에서 MongoDB를 써볼 때는 이런 생각이 별로 안들었었다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함