Skip to content

Commit 013ef04

Browse files
committed
tests dymodb crud api with spring data
1 parent 4856cb7 commit 013ef04

File tree

10 files changed

+197
-2
lines changed

10 files changed

+197
-2
lines changed

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,11 @@
9595
- <a href="springboot-cloud-ribbon-demo">springboot-cloud-ribbon-demo</a>
9696
; client side loadbalancer with spring cloud ribbon
9797

98+
- <a href="springboot-resilience4j-demo">springboot-resilience4j-demo</a>
99+
; circuitbreak with resilence4j
100+
101+
- <a href="springboot-dynamodb-demo">springboot-dynamodb-demo</a>
102+
; demo crud api with aws cli, java sdk, spring-data
103+
104+
98105

springboot-dynamodb-demo/README.md

+7-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,13 @@ $ scripts/aws-cli.sh
2121
2222
Start dynamodb with testcontainers and tests Create table / Create item / Get item / Update item / Delete item / Drop table.
2323

24-
[See SdkBasicUsage.java](./src/test/java/demo/basic/SdkBasicUsage.java)
25-
[See MapperBasicUsage.java](./src/test/java/demo/basic/MapperBasicUsage.java)
24+
[See SdkBasicUsage.java](./src/test/java/demo/basic/SdkBasicUsage.java)
25+
[See MapperBasicUsage.java](./src/test/java/demo/basic/MapperBasicUsage.java)
26+
27+
> ## Simple CRUD api with spring data dynamodb
28+
29+
[See config package](./src/main/java/demo/config)
30+
[See rest controller](./src/main/java/demo/rest/CommentController.java)
2631

2732
---
2833

springboot-dynamodb-demo/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ dependencies {
2222
implementation 'org.springframework.boot:spring-boot-starter-web'
2323
// aws dynamodb sdk
2424
implementation 'com.amazonaws:aws-java-sdk-dynamodb:1.11.796'
25+
// spring data dynamodb
26+
implementation 'com.github.derjust:spring-data-dynamodb:5.1.0'
2527
// guava
2628
// implementation 'com.google.guava:guava:29.0-jre'
2729

30+
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
2831
compileOnly 'org.projectlombok:lombok'
2932
annotationProcessor 'org.projectlombok:lombok'
3033
testImplementation('org.springframework.boot:spring-boot-starter-test') {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/env bash
2+
3+
set -x
4+
5+
aws dynamodb create-table \
6+
--endpoint-url http://localhost:8000 \
7+
--table-name Comment \
8+
--attribute-definitions \
9+
AttributeName=id,AttributeType=S \
10+
AttributeName=mentionId,AttributeType=N \
11+
AttributeName=createdAt,AttributeType=S \
12+
--key-schema AttributeName=id,KeyType=HASH \
13+
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
14+
--global-secondary-indexes IndexName=byMentionId,KeySchema=["{\
15+
AttributeName=mentionId,\
16+
KeyType=HASH\
17+
}","{\
18+
AttributeName=createdAt,\
19+
KeyType=RANGE\
20+
}"],Projection="{ProjectionType=ALL}",ProvisionedThroughput="{\
21+
ReadCapacityUnits=1,\
22+
WriteCapacityUnits=1\
23+
}"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
aws dynamodb delete-table \
2+
--endpoint-url http://localhost:8000 \
3+
--table-name Comment
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package demo.config;
2+
3+
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
4+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Primary;
8+
9+
import com.amazonaws.auth.AWSStaticCredentialsProvider;
10+
import com.amazonaws.auth.BasicAWSCredentials;
11+
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
12+
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
13+
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
14+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
15+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
16+
17+
import demo.config.properties.AwsProperties;
18+
import lombok.RequiredArgsConstructor;
19+
20+
@Configuration
21+
@EnableConfigurationProperties(AwsProperties.class)
22+
@EnableDynamoDBRepositories(basePackages = "demo.repository")
23+
@RequiredArgsConstructor
24+
public class DynamoDbConfig {
25+
26+
private final AwsProperties awsProperties;
27+
28+
@Primary
29+
@Bean
30+
public DynamoDBMapper dynamoDBMapper() {
31+
return new DynamoDBMapper(amazonDynamoDB(), DynamoDBMapperConfig.DEFAULT);
32+
}
33+
34+
@Bean
35+
public AmazonDynamoDB amazonDynamoDB() {
36+
final AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(
37+
new BasicAWSCredentials(awsProperties.getCredential().getAccessKey(),
38+
awsProperties.getCredential().getSecretKey()));
39+
final EndpointConfiguration endpointConfiguration = new EndpointConfiguration(
40+
awsProperties.getDynamodb().getEndpoint(),
41+
awsProperties.getDynamodb().getRegion());
42+
43+
return AmazonDynamoDBClientBuilder.standard()
44+
.withCredentials(credentialsProvider)
45+
.withEndpointConfiguration(endpointConfiguration)
46+
.build();
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package demo.config.properties;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
5+
import lombok.Data;
6+
7+
@ConfigurationProperties(prefix = "aws", ignoreInvalidFields = true)
8+
@Data
9+
public class AwsProperties {
10+
11+
private DynamoDbProperties dynamodb;
12+
private Credential credential;
13+
14+
@Data
15+
public static class DynamoDbProperties {
16+
private String endpoint;
17+
private String region;
18+
}
19+
20+
@Data
21+
public static class Credential {
22+
private String accessKey;
23+
private String secretKey;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package demo.repository;
2+
3+
import java.util.List;
4+
5+
import org.springframework.data.repository.PagingAndSortingRepository;
6+
7+
import demo.domain.Comment;
8+
9+
public interface CommentRepository extends PagingAndSortingRepository<Comment, String> {
10+
11+
List<Comment> findAllByMentionIdOrderByCreatedAtAsc(Integer mentionId);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package demo.rest;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.Optional;
5+
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.GetMapping;
8+
import org.springframework.web.bind.annotation.PathVariable;
9+
import org.springframework.web.bind.annotation.PostMapping;
10+
import org.springframework.web.bind.annotation.PutMapping;
11+
import org.springframework.web.bind.annotation.RequestBody;
12+
import org.springframework.web.bind.annotation.RequestParam;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import demo.domain.Comment;
16+
import demo.repository.CommentRepository;
17+
import lombok.RequiredArgsConstructor;
18+
import lombok.extern.slf4j.Slf4j;
19+
20+
@RestController
21+
@Slf4j
22+
@RequiredArgsConstructor
23+
public class CommentController {
24+
25+
private final CommentRepository commentRepository;
26+
27+
@GetMapping("/comments")
28+
public ResponseEntity<Iterable<Comment>> getComments(@RequestParam(name = "mentionId") Integer mentionId) {
29+
return ResponseEntity.ok(commentRepository.findAllByMentionIdOrderByCreatedAtAsc(mentionId));
30+
}
31+
32+
@GetMapping("/comment/{id}")
33+
public ResponseEntity<Comment> getComment(@PathVariable("id") String id) {
34+
final Optional<Comment> commentOptional = commentRepository.findById(id);
35+
return commentOptional.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
36+
}
37+
38+
@PostMapping("/comments")
39+
public ResponseEntity<Comment> createComment(@RequestBody Comment comment) {
40+
comment.setCreatedAt(LocalDateTime.now());
41+
comment.setId(null);
42+
comment = commentRepository.save(comment);
43+
return ResponseEntity.ok(comment);
44+
}
45+
46+
@PutMapping("/comment/{id}")
47+
public ResponseEntity<Comment> updateComment(@PathVariable("id") String id,
48+
@RequestBody Comment update) {
49+
final Optional<Comment> commentOptional = commentRepository.findById(id);
50+
51+
if (!commentOptional.isPresent()) {
52+
return ResponseEntity.notFound().build();
53+
}
54+
55+
final Comment saved = commentOptional.get();
56+
saved.setContent(update.getContent());
57+
58+
return ResponseEntity.ok(commentRepository.save(saved));
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1+
server:
2+
port: 3000
13

4+
aws:
5+
dynamodb:
6+
endpoint: http://localhost:8000
7+
region: ap-northeast-2
8+
credential:
9+
access-key: dummy
10+
secret-key: dummy

0 commit comments

Comments
 (0)