문제:
처음에는 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에 저장하는 코드는 사용하지 않았습니다.)