본문 바로가기

IT/Spring

[Spring boot] AWS DynamoDB와 Spring을 이용한 CRUD API 설계(1)

최근 졸업작품을 위해 Dynamo DB가 필요하다고 생각했고 

이제부터 진행상황을 노션에 정리하는 게 아닌 블로그에 정리하려 한다.

 

첫 스텝부터 천천히 밟아보자 

왜? Dynamo DB와 Spring?

AWS에서는 많은 데이터 베이스 서비스를 제공한다.

RDS DynamoDB Redshift ElastiCache 등등 다양한 서비스가 존재한다.

이 중 나는 RDS와 Dynamo DB를 써봤고 Redshift와 ElastiCache는 대용량 처리를 위한 데이터 베이스라 사용해 본 적이 없다. 그럼 RedShift와 ElastiCache를 제외한 두 가지 서비스 중에 내가 만드는 작품에는 어느 게 더 효율적인지 생각해봤다.

 

내가 만드려고 하는 작품은 하드웨어적인 요소가 어느 정도 가미되어있고 일반적인 웹 애플리케이션에서 필요한 관계형 데이터베이스가 필요한 게 아니었다. 또한 단순한 데이터들만을 가지고 처리하고 Lambda을 이용할 예정이었고 백업보다는 지연이 없기를 바랬다.

그래서 Dynamo DB를 골랐다.

 

보통 Spring을 쓰는 이유는  DI, AOP , Test 때문이라고 하는데 나는 해당 내용을 다 이해할 정도로 Spring을 배우지 않아서 해당 이유는 아니다.

Spring은 선택한 이유는 취업을 준비해야 하는 막 학기로 기업 공고들을 보면서 Spring을 배워야 한다고 생각했다.

뉴비중에 뉴비지만 프로젝트 먼저 만들어 보려고 Spring을 선택했다.

 

 

Spring과 DynamoDB을 이용하기 위한 방법을 알아보자.

 

Dynamo DB 설정

 

다들 아시겠지만 IAM user의 생성이 필요하다.

User name 필드에 원하는 이름을 설정한다.

 

다음으로 넘어가 본인이 원하는 정책을 넣는다 본인은 Dynamo DB가 필요하기 때문에 Dynamo DB와 여러 가지 다른 정책을 넣었다.(대충 넣어도 상관없다 나중에 변경 가능하다 ㅎㅎ)

그다음은 그냥 쑹쑹 넘어가도 상관없고 주의해야 할 점은 맨 마지막 페이지에 Access key secert key를 잘 가지고 있고 노출해서도 안된다. 가급적이면 Download.csv를 통해 키들을 잘 가지고 있자!!

 

본인은 예전에 잘못하고 git에 access key와 secret key을 올렸다가 외국에서 전화가 오고 진행하고 있던 공모전에서도 전화가 왔던 적이 있다.ㅠ

맨 마지막 페이지

그렇다면 이제 완료!! DynamoDB를 위한 설정은 끝!😚

 

그런 다음에 spring에서 DynamoDB을 쓸 수 있도록 한다!

일단 나는 Java도 존못(응...존X 못함) 프레임워크인 spring도 같은 처지였기 때문에 reference가 필요했다.

서칭 중 유튜브에서 원하는 자료를 찾았고 자료를 따라 했다.

 

Spring 설정 

 

intellij(2020.03)와 Spring Boot(2.4.4)을 사용했다.

Maven을 이용하고 Java는 11 버전 이름은 원하는 이름으로 설정한다.

Dependency 설정은 위와 같이 해주면 된다. (Lambok, Web)

 

이후 추가로 Dependency 설정을 해야 한다.

pom.xml에 aws Dynamodb dependency을 추가해야 한다.

 

pom.xml

   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
 //------------------------------------------------------------------------       
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-dynamodb</artifactId>
            <version>1.11.857</version>
        </dependency>
 //-----------------------------해당 부분을 추가함.-------------------
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

 

아마 에러가 발생할 수도 있는데 그럴 때는 아래 포스팅을 따라 하면 된다.

 

[Spring boot] Spring boot aws Dependency 에러 고치는 법 (Dependency 'com.amazonaws:aws-java-sdk-dynamodb:1.11.857' not fou

Dynamodb 하나 가져오는 탈도 많고 힘들다;;😢 문제 상황 pom.xml에 Aws Dynamodb에 관한 Dependency를 추가하려는 와중에 해당 구문을 쓰면 com.amazonaws aws-java-sdk-dynamodb 1.11.857 위와 같이 빨간 줄(에..

eun-dolphin.tistory.com

run을 눌러 정상적으로 작동이 된다면 패키지를 만들어주자 

패키지는 자기 맘대로 만들어 줘도 된다 자기 맘대로 하자

처음 config 패키지부터 시작해보면 해당 패키지는 Dynamo DB 사용을 위한 설정을 한다.

 

config 패키지에다 DynamoDBConfiguration.java 클래스를 만들고 아래 내용을 본인의 DynamoDB에 맞게 수정해준다.

 

DynamoDBConfiguration.java

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.acmpca.AWSACMPCAClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DynamoDBConfiguration {

    @Bean
    public DynamoDBMapper dynamoDBMapper(){
        return new DynamoDBMapper(buildAmazonDynamoDB());
    }
    private AmazonDynamoDB buildAmazonDynamoDB(){
        return AmazonDynamoDBClientBuilder
                .standard()
                .withEndpointConfiguration(
                        new AwsClientBuilder.EndpointConfiguration(
                                "dynamodb.us-east-1.amazonaws.com",//endpoint
                                "us-east-1"//Region
                        )
                )
                .withCredentials(
                        new AWSStaticCredentialsProvider(
                                new BasicAWSCredentials(
                                        "access key",//access key
                                        "secert key"//secret key
                                )

                        )
                )
                .build();

    }
}

 

그다음은 Database을 위한 entry 패키지를 만들기로 한다.

해당 패키지에는 Dynamo DB에 필요한 속성을(칼럼 역할) 설정하는 클래스이다. 말 그대로 DynamoDB에 어떤 값들을 설정할 것인지 정하는 파일이다.

 

employee.java

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@DynamoDBTable(tableName="DynamoDB 테이블 이름")//DynamoDB table name
public class employee {
    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    private String id;

    @DynamoDBAttribute
    private String date;

    @DynamoDBAttribute
    private String name;


}

 

 

어노테이션들은 굉장히 많은데 각각의 의미를 얘기하자면

 

@DynamoDBAttribute

속성들을 DynamoDB 테이블 속성과 매핑하는 역할.

@DynamoDBAutoGeneratedKey

파티션 키 속성을 자동 생성되는 것을 말한다. Create 시 파티션 키(DynamoDB의 기본키 개념)를 적지 않아도 자동적으로 파티션 키의 값이 UUID 값으로 생성하는 역할을 한다.(String만 가능)

@DynamoDBHashKey

클래스 속성을 테이블의 파티션 키 속성으로 매핑하는 역할.

@DynamoDBTable

DynamoDB 테이블을 식별하는 역할.

 

어노테이션들은 이렇게 알아두면 되고 더 자세한 설명을 원한다면 출처 자료를 보면 된다.

 

 

이렇게 하면 반은 온 거고 반은 이어서 진행하기로 한다ㅎㅎ

 

 

출처(참고자료)

www.youtube.com/watch?v=3ay92ZdCgwQ

docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/DynamoDBMapper.Annotations.html