일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 다이나믹 프로그래밍
- jpa
- LCS
- 우선순위 큐
- JavaScript
- 시뮬레이션
- 펜윅 트리
- Cloud Pub/Sub
- 이분탐색
- Bit
- 생활코딩
- BFS
- Air Table
- r
- 고속 푸리에 변환
- 그리디
- 백준 1753번
- REACT
- 수학
- ICPC
- 컴퓨터 구조
- 다익스트라
- dp
- 삼성 SW 역량테스트
- 접미사 배열
- 삼성SW역량테스트
- 데이터 분석
- 종만북
- Cloud Run
- CI/CD
- Today
- Total
코딩스토리
Spring(Gradle) + DynamoDB CRUD 예제 본문
프로젝트를 진행 중에 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
이렇게 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를 확인!
이제 마지막으로 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에 잘 나와있다.
(절대 귀찮아서 그런 거 아님)
항상 언젠가는 Dynamo DB를 써야 될 날이 있겠지 했는데 결국 다뤄보게 되었다.
Dynamo DB를 잘 다루려면 꽤나 오래 걸린다고 하는데 나는 아직 많은 부분을 사용하지 않아서 괜찮았다.
'프로젝트' 카테고리의 다른 글
DB Indexing - Read Row Count가 많다면? (1) | 2022.09.14 |
---|---|
Air Table API 사용하여 자동화 파이프라인 구축 (0) | 2022.07.07 |
Air Table과 Zapier 연동하여 Slack에 알림 메세지 전송하기 (4) | 2022.07.03 |
AWS Lambda와 API Gateway 사용하여 메일링 코드 개발 (0) | 2022.07.03 |
Sovled.ac 및 Github 잔디 프로젝트 (1) | 2022.05.28 |