diff --git a/build.gradle b/build.gradle index 8972301b..30069322 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,6 @@ configurations { repositories { mavenCentral() - maven { url 'https://s3-us-west-2.amazonaws.com/dynamodb-local/release' } } jacoco { @@ -47,12 +46,8 @@ dependencies { // Redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' - // AWS DynamoDB - implementation(platform("software.amazon.awssdk:bom:2.30.11")) - implementation 'software.amazon.awssdk:dynamodb-enhanced' - implementation 'com.amazonaws:DynamoDBLocal:2.5.4' - implementation 'io.github.boostchicken:spring-data-dynamodb:5.2.5' - implementation 'io.awspring.cloud:spring-cloud-aws-dynamodb:3.3.0' + // Util + implementation 'com.google.guava:guava:33.3.0-jre' // AWS S3 implementation 'software.amazon.awssdk:s3' diff --git a/src/main/java/org/ject/support/external/dynamodb/config/DynamoDbConfig.java b/src/main/java/org/ject/support/external/dynamodb/config/DynamoDbConfig.java deleted file mode 100644 index 42563a54..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/config/DynamoDbConfig.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.ject.support.external.dynamodb.config; - -import com.amazonaws.ClientConfiguration; -import com.amazonaws.auth.AWSStaticCredentialsProvider; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.client.builder.AwsClientBuilder; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; -import io.awspring.cloud.dynamodb.DynamoDbTemplate; -import org.ject.support.external.dynamodb.repository.DynamoDbRepository; -import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; -import software.amazon.awssdk.auth.credentials.AwsCredentials; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; -import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.dynamodb.DynamoDbClient; - -import java.net.URI; - -@Deprecated -@Configuration -@DependsOn(value = {"awsConfig"}) -@EnableDynamoDBRepositories(basePackageClasses = DynamoDbRepository.class) -public class DynamoDbConfig { - - @Value("${aws.dynamodb.endpoint}") - private String dynamoDbEndpoint; - - @Bean - public DynamoDbClient dynamoDbClient(AwsCredentials awsCredentials, Region region) { - return DynamoDbClient.builder() - .region(region) - .credentialsProvider(StaticCredentialsProvider.create(awsCredentials)) - .endpointOverride(URI.create(dynamoDbEndpoint)) - .build(); - } - - @Bean - public DynamoDbEnhancedClient dynamoDbEnhancedClient(DynamoDbClient dynamoDbClient) { - return DynamoDbEnhancedClient.builder() - .dynamoDbClient(dynamoDbClient) - .build(); - } - - @Bean - public DynamoDbTemplate dynamoDbTemplate(DynamoDbEnhancedClient dynamoDbClient) { - return new DynamoDbTemplate(dynamoDbClient); - } - - @Bean - public AmazonDynamoDB amazonDynamoDB(AwsCredentials awsCredentials, Region region) { - return AmazonDynamoDBClient.builder() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration(dynamoDbEndpoint, region.id()) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials( - awsCredentials.accessKeyId(), - awsCredentials.secretAccessKey() - ) - ) - ) - .withClientConfiguration(new ClientConfiguration()) - .build(); - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/config/DynamoDbInitializer.java b/src/main/java/org/ject/support/external/dynamodb/config/DynamoDbInitializer.java deleted file mode 100644 index 8089fa69..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/config/DynamoDbInitializer.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.ject.support.external.dynamodb.config; - -import com.amazonaws.services.dynamodbv2.local.main.ServerRunner; -import com.amazonaws.services.dynamodbv2.local.server.DynamoDBProxyServer; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; -import software.amazon.awssdk.services.dynamodb.DynamoDbClient; -import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition; -import software.amazon.awssdk.services.dynamodb.model.CreateTableResponse; -import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement; -import software.amazon.awssdk.services.dynamodb.model.KeyType; -import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput; -import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType; - -@Deprecated -@Slf4j -@Profile("!prod") -@Component -@RequiredArgsConstructor -public class DynamoDbInitializer implements ApplicationRunner, DisposableBean { - private static boolean started = false; - private static final String TABLE_NAME = "temporary_application"; - private static final String PK = "pk"; - private static final String SK = "sk"; - private static DynamoDBProxyServer server; - private final DynamoDbClient ddbClient; - - - @Override - public void run(final ApplicationArguments args) throws Exception { - if (started) { - return; - } - - final String[] localArgs = {"-inMemory"}; - server = ServerRunner.createServerFromCommandLineArgs(localArgs); - server.start(); - started = true; - - if (ddbClient.listTables().tableNames().stream().anyMatch(tableName -> tableName.equals(TABLE_NAME))) { - return; - } - - CreateTableResponse response = generateCreateTableRequest(); - log.info("Table created: {}", response.tableDescription().tableName()); - } - - @Override - public void destroy() throws Exception { - if (server != null) { - server.stop(); - } - started = false; - log.info("Stopping DynamoDB Local"); - } - - - private CreateTableResponse generateCreateTableRequest() { - return ddbClient.createTable( - builder -> builder.tableName(TABLE_NAME) - .keySchema( - KeySchemaElement.builder() - .attributeName(PK) - .keyType(KeyType.HASH) - .build(), - KeySchemaElement.builder() - .attributeName(SK) - .keyType(KeyType.RANGE) - .build() - ).attributeDefinitions( - AttributeDefinition.builder() - .attributeName(PK) - .attributeType(ScalarAttributeType.S) - .build(), - AttributeDefinition.builder() - .attributeName(SK) - .attributeType(ScalarAttributeType.S) - .build() - ).provisionedThroughput( - ProvisionedThroughput.builder() - .readCapacityUnits(5L) - .writeCapacityUnits(5L) - .build() - ) - ); - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/domain/CompositeKey.java b/src/main/java/org/ject/support/external/dynamodb/domain/CompositeKey.java deleted file mode 100644 index bd7ccecb..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/domain/CompositeKey.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.ject.support.external.dynamodb.domain; - -import java.io.Serializable; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; - -@Deprecated -@Getter -@AllArgsConstructor -@EqualsAndHashCode -public class CompositeKey implements Comparable, Serializable { - public static final String DELIMITER = "#"; - - private String prefix; - private String postfix; - - @Override - public String toString() { - return prefix + DELIMITER + postfix; - } - - @Override - public int compareTo(CompositeKey compositeKey) { - return this.toString().compareTo(compositeKey.toString()); - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/domain/EntityWithPrimaryKey.java b/src/main/java/org/ject/support/external/dynamodb/domain/EntityWithPrimaryKey.java deleted file mode 100644 index 04cb6e99..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/domain/EntityWithPrimaryKey.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.ject.support.external.dynamodb.domain; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey; -import java.io.Serializable; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.ject.support.external.dynamodb.util.CompositeKeyConverter; -import org.springframework.data.annotation.Id; -import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; -import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbConvertedBy; -import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; -import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey; - -@Deprecated -@Setter -@DynamoDbBean -@NoArgsConstructor -@AllArgsConstructor(access = AccessLevel.PROTECTED) -public abstract class EntityWithPrimaryKey implements Serializable { - @Id - protected CompositeKey pk; - protected CompositeKey sk; - - @DynamoDbPartitionKey - @DynamoDBHashKey(attributeName = "pk") - @DynamoDbConvertedBy(value = CompositeKeyConverter.class) - public CompositeKey getPk() { - return pk; - } - - @DynamoDbSortKey - @DynamoDBRangeKey(attributeName = "sk") - @DynamoDbConvertedBy(value = CompositeKeyConverter.class) - public CompositeKey getSk() { - return sk; - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/repository/AbstractDynamoDbRepository.java b/src/main/java/org/ject/support/external/dynamodb/repository/AbstractDynamoDbRepository.java deleted file mode 100644 index 47b9290d..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/repository/AbstractDynamoDbRepository.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.ject.support.external.dynamodb.repository; - -import io.awspring.cloud.dynamodb.DynamoDbTemplate; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.ject.support.external.dynamodb.domain.CompositeKey; -import org.ject.support.external.dynamodb.domain.EntityWithPrimaryKey; -import org.springframework.stereotype.Repository; -import software.amazon.awssdk.enhanced.dynamodb.Key; -import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional; -import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest; -import software.amazon.awssdk.enhanced.dynamodb.model.ScanEnhancedRequest; - -import java.util.List; -import java.util.Optional; - -@Deprecated -@Repository -@RequiredArgsConstructor -public abstract class AbstractDynamoDbRepository implements DynamoDbRepository { - protected final DynamoDbTemplate dynamoDbTemplate; - protected Class entityClass; - - @PostConstruct - protected abstract void setEntityClass(); - - @Override - public T save(final T entity) { - return dynamoDbTemplate.save(entity); - } - - @Override - public List findByPartitionKey(final CompositeKey partitionKey) { - QueryConditional condition = QueryConditional.keyEqualTo( - Key.builder().partitionValue(partitionKey.toString()).build() - ); - QueryEnhancedRequest request = QueryEnhancedRequest.builder() - .queryConditional(condition) - .build(); - return dynamoDbTemplate.query(request, entityClass) - .items() - .stream().toList(); - } - - @Override - public Optional findByPartitionKeyAndSortKey(final CompositeKey partitionKey, final CompositeKey sortKey) { - Key key = Key.builder().partitionValue(partitionKey.toString()).sortValue(sortKey.toString()).build(); - T result = dynamoDbTemplate.load(key, entityClass); - return Optional.ofNullable(result); - } - - @Override - public List findByPartitionWithSortType(final CompositeKey partitionKey, final String sortPrefix) { - Key key = Key.builder() - .partitionValue(partitionKey.toString()) - .sortValue(sortPrefix) - .build(); - QueryConditional condition = QueryConditional.sortBeginsWith(key); - QueryEnhancedRequest request = QueryEnhancedRequest.builder() - .queryConditional(condition) - .build(); - - return dynamoDbTemplate.query(request, entityClass) - .items() - .stream().toList(); - } - - @Override - public void delete(final T entity) { - dynamoDbTemplate.delete(entity); - } - - @Override - public void deleteAll() { - ScanEnhancedRequest request = ScanEnhancedRequest.builder() - .build(); - - dynamoDbTemplate.scan(request, entityClass) - .items().stream().forEach(dynamoDbTemplate::delete); - } - - @Override - public void deleteByPartitionKey(final CompositeKey partitionKey) { - Key key = Key.builder() - .partitionValue(partitionKey.toString()) - .build(); - QueryEnhancedRequest queryEnhancedRequest = QueryEnhancedRequest.builder() - .queryConditional(QueryConditional.keyEqualTo(key)) - .build(); - dynamoDbTemplate.query(queryEnhancedRequest, entityClass) - .items() - .forEach(dynamoDbTemplate::delete); - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/repository/DynamoDbRepository.java b/src/main/java/org/ject/support/external/dynamodb/repository/DynamoDbRepository.java deleted file mode 100644 index 2bee9ab4..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/repository/DynamoDbRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.ject.support.external.dynamodb.repository; - -import org.ject.support.external.dynamodb.domain.CompositeKey; -import org.ject.support.external.dynamodb.domain.EntityWithPrimaryKey; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Deprecated -@Repository -public interface DynamoDbRepository { - T save(T entity); - - List findByPartitionKey(CompositeKey partitionKey); - - Optional findByPartitionKeyAndSortKey(CompositeKey partitionKey, CompositeKey sortKey); - - List findByPartitionWithSortType(CompositeKey partitionKey, String sortPrefix); - - void delete(T entity); - - void deleteAll(); - - void deleteByPartitionKey(CompositeKey partitionKey); -} diff --git a/src/main/java/org/ject/support/external/dynamodb/util/ApplyTemporaryPortfolioConverter.java b/src/main/java/org/ject/support/external/dynamodb/util/ApplyTemporaryPortfolioConverter.java deleted file mode 100644 index 557cee4f..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/util/ApplyTemporaryPortfolioConverter.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.ject.support.external.dynamodb.util; - -import org.ject.support.domain.apply.dto.ApplyPortfolioDto; -import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter; -import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType; -import software.amazon.awssdk.enhanced.dynamodb.EnhancedType; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -@Deprecated -public class ApplyTemporaryPortfolioConverter implements AttributeConverter> { - - private static final String FILE_URL = "fileUrl"; - private static final String FILE_NAME = "fileName"; - private static final String FILE_SIZE = "fileSize"; - private static final String SEQUENCE = "sequence"; - - @Override - public AttributeValue transformFrom(List portfolios) { - return AttributeValue.builder() - .l(portfolios.stream() - .map(portfolio -> AttributeValue.builder() - .m(Map.of( - FILE_URL, AttributeValue.builder().s(portfolio.fileUrl()).build(), - FILE_NAME, AttributeValue.builder().s(portfolio.fileName()).build(), - FILE_SIZE, AttributeValue.builder().s(portfolio.fileSize()).build(), - SEQUENCE, AttributeValue.builder().s(portfolio.sequence()).build() - )) - .build()) - .collect(Collectors.toList())) - .build(); - } - - @Override - public List transformTo(AttributeValue attributeValue) { - return attributeValue.l().stream() - .map(value -> { - Map map = value.m(); - String fileUrl = Optional.ofNullable(map.get(FILE_URL)) - .map(AttributeValue::s) - .orElse(""); - String fileName = Optional.ofNullable(map.get(FILE_NAME)) - .map(AttributeValue::s) - .orElse(""); - String fileSize = Optional.ofNullable(map.get(FILE_SIZE)) - .map(AttributeValue::s) - .orElse(""); - String sequence = Optional.ofNullable(map.get(SEQUENCE)) - .map(AttributeValue::s) - .orElse(""); - return new ApplyPortfolioDto(fileUrl, fileName, fileSize, sequence); - }) - .collect(Collectors.toList()); - } - - @Override - public EnhancedType> type() { - return EnhancedType.listOf(EnhancedType.of(ApplyPortfolioDto.class)); - } - - @Override - public AttributeValueType attributeValueType() { - return AttributeValueType.L; - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/util/CompositeKeyConverter.java b/src/main/java/org/ject/support/external/dynamodb/util/CompositeKeyConverter.java deleted file mode 100644 index 1ac0a7d3..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/util/CompositeKeyConverter.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.ject.support.external.dynamodb.util; - -import org.ject.support.external.dynamodb.domain.CompositeKey; -import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter; -import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType; -import software.amazon.awssdk.enhanced.dynamodb.EnhancedType; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; - -@Deprecated -public class CompositeKeyConverter implements AttributeConverter { - @Override - public AttributeValue transformFrom(final CompositeKey compositeKey) { - return AttributeValue.fromS(compositeKey.toString()); - } - - @Override - public CompositeKey transformTo(final AttributeValue attributeValue) { - String[] parts = attributeValue.s().split(CompositeKey.DELIMITER); - return new CompositeKey(parts[0], parts[1]); - } - - @Override - public EnhancedType type() { - return EnhancedType.of(CompositeKey.class); - } - - @Override - public AttributeValueType attributeValueType() { - return AttributeValueType.S; - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/util/LocalDateTimeConverter.java b/src/main/java/org/ject/support/external/dynamodb/util/LocalDateTimeConverter.java deleted file mode 100644 index f232b012..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/util/LocalDateTimeConverter.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.ject.support.external.dynamodb.util; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter; -import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType; -import software.amazon.awssdk.enhanced.dynamodb.EnhancedType; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; - -@Deprecated -public class LocalDateTimeConverter implements AttributeConverter { - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; - - @Override - public AttributeValue transformFrom(final LocalDateTime localDateTime) { - return AttributeValue.fromS(localDateTime.format(FORMATTER)); - } - - @Override - public LocalDateTime transformTo(final AttributeValue attributeValue) { - return LocalDateTime.parse(attributeValue.s()); - } - - @Override - public EnhancedType type() { - return EnhancedType.of(LocalDateTime.class); - } - - @Override - public AttributeValueType attributeValueType() { - return AttributeValueType.S; - } -} diff --git a/src/main/java/org/ject/support/external/dynamodb/util/MapConverter.java b/src/main/java/org/ject/support/external/dynamodb/util/MapConverter.java deleted file mode 100644 index e46c4039..00000000 --- a/src/main/java/org/ject/support/external/dynamodb/util/MapConverter.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.ject.support.external.dynamodb.util; - -import java.util.Map; -import java.util.stream.Collectors; -import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter; -import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType; -import software.amazon.awssdk.enhanced.dynamodb.EnhancedType; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; - -@Deprecated -public class MapConverter implements AttributeConverter> { - @Override - public AttributeValue transformFrom(final Map map) { - return AttributeValue.builder() - .m(map.entrySet().stream() - .collect(Collectors - .toMap(Map.Entry::getKey, e -> - AttributeValue.builder() - .s(e.getValue()) - .build()))) - .build(); - } - - @Override - public Map transformTo(final AttributeValue attributeValue) { - return attributeValue.m().entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().s())); - } - - @Override - public EnhancedType> type() { - return EnhancedType.mapOf(String.class, String.class); - } - - @Override - public AttributeValueType attributeValueType() { - return AttributeValueType.M; - } -} diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index a78911b1..570d04b3 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -41,8 +41,6 @@ aws: region: ap-northeast-2 s3: bucket: ject-content-dev - dynamodb: - endpoint: http://localhost:8000 cloudfront: domain: https://d1emvsnzj31pdh.cloudfront.net/ ses: