아쿠의 개발 일지

[SpringBoot] S3 파일 업로드와 최적화 방법 본문

Programming/Java

[SpringBoot] S3 파일 업로드와 최적화 방법

디아쿠 2025. 1. 31. 11:10

 

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