Simple Storage Service
- 목표
- 업로드 시 이미지 사이즈 제한하기
- 이미지 API 응답 속도 향상시키기
[ 업로드 시 이미지 사이즈 제한하기 ]
🤔 만약 악성 유저가 3GB 크기의 파일을 업로드하거나, 8시간짜리 동영상을 주기적으로 업로드한다면 어떻게 될까요?
💁 AWS는 사용량 기반 과금 모델을 사용하므로, AWS에 등록된 결제 카드에 예상치 못한 비용이 발생할 수 있습니다!! 😱
그렇지만, 다행히 Spring에서는 기본적으로 최대 파일 업로드 크기가 20MB로 제한되어 있습니다.
하지만 회사의 서비스의 요구사항에 따라 이미지 사이즈를 최대 5MB로 제한하는 등.. 수정되어야 할 수 있기 때문에 파일 업로드 용량을 수정하는 방법을 공부해 보도록 합시다.
API에 설정하는 방법
public String uploadImage(MultipartFile uploadFile) {
// 파일의 크기를 확인한 후, 제한된 크기(5MB)보다 큰 경우 예외 발생
final long MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
// 파일 크기 체크
if (uploadFile.getSize() > MAX_FILE_SIZE) {
throw new Exception(MAX_FILE_SIZE / (1024 * 1024) + "MB 이상의 파일은 업로드 할 수 없습니다.");
}
application.yml에 설정하는 방법
- spring.servlet.multipart.max-file-size=10MB
- Spring 에서는 기본적으로 최대 파일 업로드 크기가 10MB로 제한되어 있지만, 반대로 그 이상 크기의 사진이나 동영상을 업로드해야 할 수도 있다.
spring:
servlet:
multipart:
max-file-size: 30MB # 최대 파일 사이즈
max-request-size: 30MB # 최대 요청 사이즈
[ 이미지 API 응답 속도 향상시키기 ]
요청의 대부분은 S3에 파일을 업로드하는 시간입니다. 요청이 너무 길게 느껴지거나, 업로드 지연시간을 줄이고 싶을 경우 Async 어노테이션을 통해 비동기로 변경하여 API의 응답 속도를 향상할 수 있습니다.
Application 파일에 @EnableAsync 어노테이션 추가
@EnableAsync
@SpringBootApplication
public class S3TestApplication {
public static void main(String[] args) {
SpringApplication.run(S3TestApplication.class, args);
}
}
S3 업로드 구현체 메서드에 @Async 어노테이션을 추가합니다
- @Async 애너테이션이 적용된 메서드는 기본적으로 비동기적으로 실행되기 때문에, 메서드가 즉시 반환되지만 실제 작업은 백그라운드에서 진행됩니다. 이러한 특성 때문에 @Async 메서드는 반환 타입으로 void, Future<T>, CompletableFuture<T> 타입을 사용합니다.
@Async
public void uploadImage(MultipartFile uploadFile) {
// ... 이후 비즈니스 로직
[ 결과 비교 ]
- 비동기 처리 전
- Async 어노테이션을 통한 비동기 처리
S3 파일 업로드 다운로드 서비스를 간단히 구현하고, 더 나아가서 업로드 시 이미지 사이즈 제한하기 및 API 응답 속도 향상 시키기를 실습해 보았다.
읽어주셔서 감사합니다 😊
😺 GitHub: https://github.com/mad-cost/AWS-S3-study
'해피 코딩 > AWS' 카테고리의 다른 글
S3 이미지 업로드 및 다운로드 (1) | 2024.10.04 |
---|---|
S3 설정하고 SpringBoot에 연동하기 (1) | 2024.10.03 |