Spring과 AWS의 S3를 사용해서 파일 업로드 기능을 구현해 보겠습니다.
Spring Cloud AWS를 사용하면 손쉽게 S3를 통한 파일 업로드 기능을 구현할 수 있습니다.
// build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
IAM의 사용자 탭으로 이동한 다음 오른쪽에 빨간색으로 표시되어 있는 사용자 추가 버튼을 클릭합니다.
액세스 유형은 액세스 키 - 프로그래밍 방식 액세스를 선택합니다.
S3와 관련된 모든 작업을 할 수 있도록 AmazonS3FullAccess 정책을 선택합니다.
따로 언급하지 않고 넘어갔던 태그 설정 부분은 원하는 대로 설정하면 됩니다.
마지막으로 사용자 추가에 성공했다면 액세스 키를 다운받아서 잘 보관해놓습니다.
// application.yml
cloud:
aws:
region:
static: 버킷의 리전(ex: ap-northeast-2)
s3:
bucket: 버킷 이름(ex: issue-tracker-file-upload)
credentials:
access-key: access key
secret-key: secret key
stack:
auto: false
@NoArgsConstructor(access = PROTECTED)
@Entity
public class UploadFile {
@Id @GeneratedValue(strategy = IDENTITY)
private Long id;
private String uploadFileName;
private String storeFileUrl;
public UploadFile(String uploadFileName, String storeFileUrl) {
this.uploadFileName = uploadFileName;
this.storeFileUrl = storeFileUrl;
}
}
@RequiredArgsConstructor
@RestController
public class S3Controller {
private final S3Service s3Service;
@PostMapping
public void uploadFile(@RequestParam MultipartFile multipartFile)
throws IOException {
s3Service.saveUploadFile(multipartFile);
}
}
multipart/form-data
방식으로 요청한 여러 가지 형식의 파일들의 정보를 가지고 있습니다.multipart/form-data
방식은 사진의 HTTP 메시지처럼 각 항목이 구분되어 있기 때문에 여러 파일의 정보를 저장할 수 있습니다.@RequiredArgsConstructor
@Service
public class S3Service {
private final AmazonS3Client amazonS3Client;
private final UploadFileRepository uploadFileRepository;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
@Transactional
public void saveUploadFile(MultipartFile multipartFile) throws IOException {
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(multipartFile.getContentType());
objectMetadata.setContentLength(multipartFile.getSize());
String originalFilename = multipartFile.getOriginalFilename();
int index = originalFilename.lastIndexOf(".");
String ext = originalFilename.substring(index + 1);
String storeFileName = UUID.randomUUID() + "." + ext;
String key = "test/" + storeFileName;
try (InputStream inputStream = multipartFile.getInputStream()) {
amazonS3Client.putObject(new PutObjectRequest(bucket, key, inputStream, objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead));
}
String storeFileUrl = amazonS3Client.getUrl(bucket, key).toString();
UploadFile uploadFile = new UploadFile(originalFilename, storeFileUrl);
uploadFileRepository.save(uploadFile);
}
}
postman을 통해 파일 업로드 요청을 보냅니다.
정상적으로 DB에 파일이 업로드된 것을 확인할 수 있습니다.
SdkClientException: Failed to connect to service endpoint
FileSizeLimitExceededException
Spring Boot Cloud AWS 덕분에 파일 업로드 기능을 쉽게 구현할 수 있습니다.
궁금하신 부분이나 피드백은 편하게 댓글로 남겨주시면 감사하겠습니다 😀
루이 글 너무 잘 읽었습니다! 저도 해당 기능 구현하려고 하는데 루이 글이 많은 도움이 될 것 같아요! 미리 고맙습니다 ㅎㅎㅎㅎㅎㅎ