아무거나

Spring Boot 에서 aws-java-sdk-dynamodb 를 활용한 AWS DynamoDB 연동 (+Credentials Setting 포함) 본문

Java & Kotlin/Spring

Spring Boot 에서 aws-java-sdk-dynamodb 를 활용한 AWS DynamoDB 연동 (+Credentials Setting 포함)

전봉근 2022. 7. 2. 13:40
반응형

Spring Boot 에서 aws-java-sdk-dynamodb 를 활용한 AWS DynamoDB 연동 (+Credentials Setting 포함)

  • 먼저 AWS Credentials 설정을 application.yml 기반으로 하게된다면 중요키들이 노출하게된다. 그래서 보통 KMS(=Key Management System)를 통한 관리, 키값 암호화 관리, 서버에 설정된 AWS CLI 를 통한 저장된 프로필 사용(Ex- ~/.aws/credentials) 등의 방법이 있으며 해당 내용에서는 서버에 설정된 AWS CLI 를 통한 저장된 프로필 사용 하는 방법으로 진행하도록 한다.
  • aws-java-sdk-dynamodb 를 선택한 이유 (=spring-data-dynamodb 의 단점)
    • 2020.03.08 기준 Spring Data 팀이 공식 지원하는 프로젝트가 없다. 그래서 개인이 만든 프로젝트를 사용 boostchicken/spring-data-dynamodb
    • Spring Boot 가 버전이 올라갈때마다 호환성 이슈로 인하여 사용에 제약이 있다. (이전엔 Spring Boot 2.1.x 까지만 지원하였으나 지금은 그 이상 사용이 가능하긴하다.)
    • 레거시 DynamoDB 의 데이터 구조가 복잡할경우 용이함
  • 의존성 추가(build.gradle)
    dependencies {
        implementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.239'
    }
    
  • DynamoDB Configuration 생성
    [DynamoDBConfig.java]
    package com.test.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    
    import com.amazonaws.auth.AWSCredentialsProvider;
    import com.amazonaws.auth.profile.ProfileCredentialsProvider;
    import com.amazonaws.client.builder.AwsClientBuilder;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
    import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
    import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
    import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
    
    @Configuration
    public class DynamoDBConfiguration {
    
        @Bean
        public DynamoDBMapper dynamoDBMapper() {
            DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder()
              .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER)
              .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)
              .withTableNameOverride(null)
              .withPaginationLoadingStrategy(DynamoDBMapperConfig.PaginationLoadingStrategy.EAGER_LOADING)
              .build();
    
            return new DynamoDBMapper(buildAmazonDynamoDB(), mapperConfig);
        }
    
        @Primary
        @Bean
        public AWSCredentialsProvider awsCredentialsProvider() {
           return new ProfileCredentialsProvider(); // 서버에 설정된 AWS CLI 를 통한 저장된 프로필 사용 (~/.aws/credentials)
        }
    
        @Bean
        public AmazonDynamoDB buildAmazonDynamoDB() {
            return AmazonDynamoDBClientBuilder
              .standard()
              .withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration(
                  "dynamodb.ap-northeast-2.amazonaws.com",
                  Regions.AP_NORTHEAST_2.getName()
                )
              )
              .withCredentials(awsCredentialsProvider())
              .build();
        }
    }
  • DynamoDB 를 호출할 Repository 생성(예시로 값을 넣었으므로 잘 참고해서 사용하자. -> https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html)
    [TestRepository.java]
    @RequiredArgsConstructor
    @Repository
    public class TestRepository {
    
        private final DynamoDBMapper dynamoDBMapper;
    
        public TestData getTestData(String testNo) {
            // dynamoDBMapper.load({리턴할 클래스}, {Hash Key}, {Sort Key});
    	        return dynamoDBMapper.load(TestData.class, "TEST$" + testNo, "TEST");
          }
    
    }
반응형
Comments