졸업프로젝트

[그로쓰][Spring Boot Data JPA / AWS S3/ AWS RDS] Spring Boot에서 AWS RDS와 S3에 함께 정보를 저장하기

달팽이포뇨 2022. 4. 11. 00:12

문제:

처음에는 Spring Boot에서 AWS RDS와 AWS S3에 저장하는 코드를 각각 @PostMapping 주소를 다르게 하여 구성하였습니다.

하지만 이렇게 하니 프론트에서 접근하고 파일을 보내서 저장할 때 불편함이 생겼습니다.

 

제안:

Spring Boot 코드를 작성할 때 아예 하나의 @PostMapping 안에서 정보를 AWS RDS에 저장하고 AWS S3에 RequestPart로 받은 이미지 파일을 넘기는 코드를 작성하자.

 

코드:

Spring boot에서 AWS S3에 이미지 업로드하는 코드는  https://kim-jong-hyun.tistory.com/78 이 글의 도움을 많이 받았습니다. 저희 프로젝트에 맞게 코드를 변형하였습니다.

 

일단 이 코드에서는 AWS S3와 RDS에 접근하므로 build.gradle에 관련 dependency를 추가해주어야합니다.

implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-aws', version: '2.1.0.RELEASE'

 

1. RDS

DB의 record 테이블에 정보를 저장하는 코드입니다. @PostMapping을 통해 경로 변수로 사용자 아이디, 문학작품 번호, 이미지 이름을 받고 사용자가 쓴 글씨가 있는 이미지 파일을 전달받습니다. 

경로 변수로 받은 정보를 builder()를 이용하여 레코드를 만들어 save메소드를 이용하여 record 테이블에 레코드가 들어가는 효과를 줍니다.

이 코드를 쓰려면 Record 클래스 즉, Record Entity 코드를 작성한 파일에 @Builder 어노테이션을 달아서 RDS에 집어넣을 레코드 형태를 미리 선언해주어야합니다.

2.S3    

이 메소드의 return 형을 AwsS3로 두고 return을 awsS3Service.upload(@PostMapping에서 받은 이미지 파일 변수명, S3 디렉토리 이름)으로 합니다.

awsS3Service 클래스의 upload메소드에는 AWS S3에 파일을 S3의 해당 디렉토리에 저장하는 코드가 작성되어있습니다. 아래 주소를 참고하시면 알 수 있습니다.

 

(저희 프로젝트에서는 프론트엔드에서 랜덤하게 이미지 이름을 생성한 후 백엔드에 보내주기 때문에 UUID로 이미지 이름을 만들어서 RDS에 저장하는 코드는 사용하지 않았습니다.)  

 

참고: https://kim-jong-hyun.tistory.com/78