코딩스토리

Spring(Gradle) + DynamoDB CRUD 예제 본문

프로젝트

Spring(Gradle) + DynamoDB CRUD 예제

kimtaehyun98 2022. 10. 10. 23:41

프로젝트를 진행 중에 Spring 서버에서 Dynamo DB를 사용해야 할 일이 생겼다.

 

그래서 여러 자료를 찾아보려고 구글링 했는데 이상하게 자료가 많지 않았다.

특히 gradle을 사용하는 자료는 거의 없었다.

 

왜지..? (Spring으로는 Dynamo DB를 잘 안 다루나요...? 🧐)

 

나는 기존에 구현했던 AWS S3 코드를 비교해가며 구현하긴 했는데 만약 이런 경험이 없다면 구현하기 쉽지 않을 것 같다.

 

그래서 이 기회에 코드를 남겨놓으려고 한다.

 

먼저 대부분의 블로그에서 말해주고 있듯이 AWS IAM을 생성해야 한다.

IAM은 쉽게 말하면 권한을 가지고 있는 부계정을 생성해주는 것인데

 

내 Root 계정은 AWS의 모든 서비스를 사용할 수 있는 권한이 있지만 그만큼 탈취당했을 시 큰 위험이 따른다.

따라서 보안적으로 굉장히 위험하기 때문에 필요한 권한만 가지는 부계정을 만들어 사용하는 것이다.

 

IAM을 생성하는 방법은 해당 포스팅에는 따로 적진 않으려고 한다. (어렵지 않기도 하고, 많은 블로그에서 기술하고 있음ㅎㅎ)

 

IAM을 생성하는 데 성공했다면 accessKey와 secretKey를 받을 수 있는데 이를 application.properties에 잘 적어둔다.

그리고 region도 같이 설정해준다.

cloud.aws.region.static=ap-northeast-2

 

다음으로 Client를 생성해주어야 한다.

 

즉, 내 서버(Spring)와 AWS 사이에 Client를 생성해주는 것이다.

 

그다음 , build.gradle에 들어가서 dependency를 추가해준다.

 

implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.1000')
implementation 'com.amazonaws:aws-java-sdk-dynamodb'

 

이렇게 추가해주었다면 config 패키지에 AWSConfig.class를 생성해준다.

 

그리고 다음과 같이 코드를 작성해준다.

@Configuration
public class AWSConfig {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;

    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonDynamoDBClient dynamoDbClient(){
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        return (AmazonDynamoDBClient) AmazonDynamoDBAsyncClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();
    }
}

 

Spring을 공부해 본 사람이라면 Bean을 수동 주입하는 코드임을 바로 알아챌 것이다.

(수동으로 설정 클래스에서 의존관계를 명시해서 주입시켜주는 과정, 자세한 설명은 아래 포스팅에서 🤣)

https://kimtaehyun98.tistory.com/134

 

Spring 컨테이너와 Dependency Injection

Spring에서는 객체들을 Spring 컨테이너에 Spring 빈으로 등록하고 적재적소에 의존 관계를 만들어 줌으로써 객체 지향적 설계 원칙을 지킨다. https://kimtaehyun98.tistory.com/115 좋은 객체지향 설계의 5가

kimtaehyun98.tistory.com

 

이렇게 Client를 Bean으로 설정하고 나면, Service 클래스에서 Bean을 주입시켜줄 수 있다.

 

이제 Client를 구현했으니, DB 테이블에 접근할 Entity를 만들어보자.

(Dynamo DB에서 테이블을 만드는 건 역시 다른 블로그에서 잘 설명하고 있으니 PASS)

 

아래 코드는 내가 생성한 Dynamo DB 테이블의 Entity이다.

@DynamoDBTable(tableName="자신의 테이블 명")
@Getter
@AllArgsConstructor
public class Lyric {

    @DynamoDBHashKey
    private String id;

    @DynamoDBAttribute
    private String lyrics;
}

 

 

DynamoDBHashKey 어노테이션은 말 그대로 PK(파티션 키)이고, 테이블을 생성할 때 본인이 입력했던 것을 사용하면 된다.

그 외에 DynamoDBAttribute는 컬럼 명을 적으면 된다.

위 두 개의 어노테이션이면, 간단한 CRUD는 다 될 것 같지만 혹시나 기타 어노테이션을 사용하고 싶다면 아래 공식 Docs를 확인!

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

 

DynamoDB에 사용되는 Java 주석 - Amazon DynamoDB

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

이제 마지막으로 Service 로직을 구현해보자.

 

@Service
public class AwsDynamoDbService {

    private final AmazonDynamoDBClient amazonDynamoDBClient;

    @Autowired
    public AwsDynamoDbService(AmazonDynamoDBClient amazonDynamoDBClient) {
        this.amazonDynamoDBClient = amazonDynamoDBClient;
    }

    public void createItem(String id, String _lyric) throws BaseException{
        try{
            Lyric lyric = new Lyric(id, _lyric);

            // Save Lyric To DynamoDB
            DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDBClient);
            mapper.save(lyric);
            
        } catch(Exception e){
            throw new BaseException(AWS_DYNAMODB_ERROR);
        }
    }
}

 

DynamoDB에 접근하는 핵심 로직은 두 줄이다.

그 외의 부분은 자신에 맞춰 수정하면 될 것이다.

 

create 부분만 작성했는데 그 외의 부분은 아래의 공식 Docs에 잘 나와있다.

(절대 귀찮아서 그런 거 아님)

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/DynamoDBMapper.CRUDExample1.html

 

예: CRUD 작업 - Amazon DynamoDB

예: CRUD 작업 다음 Java 코드 예제에서는 Id, Title, ISBN 및 Authors 속성을 가진 CatalogItem 클래스를 선언합니다. 이 예제에서는 주석을 사용하여 이러한 속성을 DynamoDB의 ProductCatalog 테이블로 매핑합니

docs.aws.amazon.com

 

항상 언젠가는 Dynamo DB를 써야 될 날이 있겠지 했는데 결국 다뤄보게 되었다.

 

Dynamo DB를 잘 다루려면 꽤나 오래 걸린다고 하는데 나는 아직 많은 부분을 사용하지 않아서 괜찮았다.

Comments