Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 엘라스틱서치
- 헥사고날아키텍처
- kafka배포
- 자바
- selenium
- 한화시스템부트캠프
- 프로토콜역할
- 메소드
- JPA
- 오블완
- 부트캠프
- Kafka
- 스프링시큐리티
- Java
- N+1문제
- 캐시의 작동 원리
- 테스트케이스
- 티스토리챌린지
- 자료구조
- QA
- 하이브리드접근법
- 오버로딩
- nplus1
- STOMP
- jwt토큰
- XSS
- 프로세스와스레드의차이
- 자동화워크플로우
- n8n
- springboot
Archives
- Today
- Total
아쿠의 개발 일지
[SpringBoot] S3 파일 업로드와 최적화 방법 본문
AWS S3(Simple Storage Service)는 안정적인 클라우드 스토리지 서비스로, 다양한 애플리케이션에서 파일 저장 용도로 사용됩니다. 이번 글에서는 Spring Boot에서 S3 파일 업로드를 구현하는 방법과 비용 절감을 위한 최적화 전략을 소개합니다.
1. Spring Boot에서 S3 파일 업로드 구현
1.1 AWS SDK 의존성 추가
먼저, AWS SDK를 프로젝트에 추가해야 합니다. build.gradle 혹은 pom.xml에 아래 의존성을 추가합니다.
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.0</version>
</dependency>
1.2 S3 클라이언트 설정
Spring Boot에서 AWS S3를 사용하려면, S3Client를 설정해야 합니다.
@Configuration
public class S3Config {
@Value("${cloud.aws.region.static}")
private String region;
@Bean
public S3Client s3Client() {
return S3Client.builder()
.region(Region.of(region))
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
}
}
아래 코드는 Multipart 파일을 S3에 업로드하는 S3Service의 예제입니다.
@Service
public class S3Service {
private final S3Client s3Client;
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
public S3Service(S3Client s3Client) {
this.s3Client = s3Client;
}
public String uploadFile(MultipartFile file) throws IOException {
String key = UUID.randomUUID() + "-" + file.getOriginalFilename();
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(key)
.contentType(file.getContentType())
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromBytes(file.getBytes()));
return key;
}
}
2. 비용 절감 및 최적화 전략
2.1 Presigned URL을 활용한 직접 업로드
서버를 거치지 않고 클라이언트가 직접 S3에 파일을 업로드하면 서버 부하를 줄일 수 있습니다. Presigned URL을 활용하면 이를 구현할 수 있습니다.
public String generatePresignedUrl(String fileName) {
S3Presigner presigner = S3Presigner.create();
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(fileName)
.build();
PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(
PresignedPutObjectRequest.builder()
.signatureDuration(Duration.ofMinutes(10))
.putObjectRequest(objectRequest)
.build()
);
return presignedRequest.url().toString();
}
2.2 파일 저장 구조 최적화
- 압축 저장: 이미지나 텍스트 파일은 압축하여 저장하면 용량을 줄일 수 있습니다.
- 폴더 구조 설계: year/month/day/uuid-filename 형태로 저장하면 검색 성능이 향상됩니다.
- 라이프사이클 정책 적용: 일정 기간 후 오래된 파일을 Glacier로 이동하면 스토리지 비용을 절감할 수 있습니다.
2.3 파일 크기 제한 및 청소 정책 적용
- 최대 파일 크기 제한: 필요 이상으로 큰 파일 업로드를 방지합니다.
- 불필요한 파일 정리: 일정 기간 후 사용되지 않는 파일을 삭제하는 배치 작업을 설정합니다.
Spring Boot와 AWS S3를 활용한 파일 업로드 방법을 살펴 보았고, 비용 절감을 위한 최적화 방법을 소개 해 드렸습니다. S3 사용 시 비용이 지속적으로 증가할 수 있으므로 여러가지 방법을 사용하는 것을 권장 해 드립니다.
728x90
'Programming > Java' 카테고리의 다른 글
JPA 성능 최적화를 위한 fetch join과 EntityGraph 활용 (2) | 2025.02.11 |
---|---|
[SpringBoot] 멀티쓰레드 환경에서의 동시성 제어 (Synchronized vs Lock vs Atomic) (0) | 2025.02.10 |
[DevOps] Kubernetes로 채팅을 위한 Kafka와 Zookeeper 배포하기 (0) | 2025.01.09 |
[N8N] AI와 N8N (0) | 2025.01.06 |
[Java] 객체지향의 핵심 개념 & Spring Boot란? (0) | 2024.12.29 |