dynamodb prefix 스캔 조회방식 추가

This commit is contained in:
2025-03-26 15:23:23 +09:00
parent cb948c8a16
commit 51100ecb31
2 changed files with 65 additions and 2 deletions

View File

@@ -57,7 +57,17 @@ public abstract class BaseDynamoDBRepository<T> implements DynamoDBRepository<T>
@Override
public List<T> findAll(Key key) {
return operations.getItems(key, entityClass);
return operations.getQueryItems(key, entityClass);
}
@Override
public List<T> findAllScan(String prefix) {
return operations.getItemsScanBegins(prefix, entityClass);
}
@Override
public List<T> findAllScan(String prefix, String sortKey) {
return operations.getItemsScanBegins(prefix, sortKey, entityClass);
}
protected <T> T deepCopy(T source, Class<T> valueType) {

View File

@@ -115,7 +115,7 @@ public class DynamoDBOperations {
return table.getItem(key);
}
public <T> List<T> getItems(Key key, Class<T> itemClass){
public <T> List<T> getQueryItems(Key key, Class<T> itemClass){
DynamoDbTable<T> table = getTable(itemClass);
QueryConditional queryConditional = QueryConditional.keyEqualTo(key);
@@ -125,6 +125,59 @@ public class DynamoDBOperations {
.toList();
}
public <T> List<T> getItemsScanBegins(String prefix, Class<T> itemClass){
DynamoDbTable<T> table = getTable(itemClass);
TableSchema<T> schema = table.tableSchema();
String partitionKeyName = schema.tableMetadata().primaryPartitionKey();
Expression filterExpression = Expression.builder()
.expression("begins_with(#pk, :prefix)")
.putExpressionName("#pk", partitionKeyName)
.putExpressionValue(":prefix", AttributeValue.builder().s(prefix).build())
.build();
return table.scan(r -> r.filterExpression(filterExpression))
.items()
.stream()
.toList();
}
public <T> List<T> getItemsScanBegins(String prefix, String sortKeyPrefix, Class<T> entityClass) {
DynamoDbTable<T> table = getTable(entityClass);
// 파티션 키 및 정렬 키 속성 이름 가져오기
TableSchema<T> schema = table.tableSchema();
String partitionKeyName = schema.tableMetadata().primaryPartitionKey();
String sortKeyName = String.valueOf(schema.tableMetadata().primarySortKey().get());
// 표현식 빌더 초기화
Expression.Builder expressionBuilder = Expression.builder();
StringBuilder expressionString = new StringBuilder();
// 파티션 키 조건 추가
expressionString.append("begins_with(#pk, :prefix)");
expressionBuilder.putExpressionName("#pk", partitionKeyName);
expressionBuilder.putExpressionValue(":prefix", AttributeValue.builder().s(prefix).build());
// 정렬 키 조건 추가 (테이블에 정렬 키가 있는 경우)
if (sortKeyName != null && sortKeyPrefix != null && !sortKeyPrefix.isEmpty()) {
expressionString.append(" AND begins_with(#sk, :sortPrefix)");
expressionBuilder.putExpressionName("#sk", sortKeyName);
expressionBuilder.putExpressionValue(":sortPrefix", AttributeValue.builder().s(sortKeyPrefix).build());
}
// 필터 표현식 완성
Expression filterExpression = expressionBuilder
.expression(expressionString.toString())
.build();
return table.scan(r -> r.filterExpression(filterExpression))
.items()
.stream()
.toList();
}
/**
* JSON 문자열을 객체로 변환하고 트랜잭션에 추가
*/