Amazon S3와 Java Spring Boot를 이용한 파일 스토리지 연동 가이드

Amazon S3와 Java Spring Boot 연동하기

Amazon S3는 안전한 파일 스토리지로, 대용량 데이터를 효율적으로 저장할 수 있어 웹 애플리케이션에 자주 사용됩니다. 특히 Spring Boot와 연동하여 이미지나 비디오 파일을 저장하면 서버의 부담을 줄이고 성능을 향상시킬 수 있습니다. 이 가이드는 Amazon S3와 Java Spring Boot 연동 방법을 자세히 설명하고 필요한 코드 예제를 제공합니다.

Amazon S3 설정 및 IAM 사용자 권한 부여

Spring Boot 애플리케이션에서 S3에 접근하려면 AWS에서 S3 버킷을 생성하고 IAM 사용자 권한을 설정해야 합니다.

  1. AWS 계정 생성 및 S3 버킷 생성: AWS 콘솔에 로그인한 후 S3 서비스를 선택하여 새로운 버킷을 만듭니다. 버킷 이름과 리전을 설정합니다.
  2. IAM 사용자 권한 설정: IAM 콘솔에서 새로운 사용자를 생성하고 “AmazonS3FullAccess” 정책을 할당하여 S3 접근 권한을 부여합니다. 이후 액세스 키시크릿 키를 기록해둡니다.

Spring Boot 프로젝트에 AWS SDK 추가하기

pom.xml 파일에 AWS SDK 의존성을 추가하여 S3 연동을 준비합니다.

<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.17.89</version> <!-- SDK 버전은 최신 버전에 맞게 조정 -->
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
</dependency>

이제 Spring Boot에서 S3를 사용할 수 있는 환경이 설정되었습니다.

S3 클라이언트 설정 및 파일 업로드 서비스 구현

S3 클라이언트를 설정하고 파일 업로드 서비스를 구현하여 Spring Boot 애플리케이션에서 S3로 파일을 전송합니다.

1. S3Config 클래스 작성

Spring에서 S3 클라이언트를 설정하는 클래스를 작성합니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

@Configuration
public class S3Config {

@Bean
public S3Client s3Client() {
AwsBasicCredentials awsCreds = AwsBasicCredentials.create(
"YOUR_ACCESS_KEY",
"YOUR_SECRET_KEY"
);

return S3Client.builder()
.region(Region.US_EAST_1) // S3 버킷의 지역 설정
.credentialsProvider(StaticCredentialsProvider.create(awsCreds))
.build();
}
}

2. S3Service 클래스 작성

파일을 S3에 업로드하고, URL을 반환하는 서비스 클래스를 작성합니다.

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

@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 = "uploads/" + file.getOriginalFilename();
Path tempFile = Files.createTempFile("temp", file.getOriginalFilename());
file.transferTo(tempFile.toFile());

PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(key)
.acl("public-read") // 파일을 공개하려면 'public-read' 설정
.build();

PutObjectResponse response = s3Client.putObject(putObjectRequest, RequestBody.fromFile(tempFile));
return s3Client.utilities().getUrl(builder -> builder.bucket(bucketName).key(key)).toExternalForm();
}
}

컨트롤러 작성 및 파일 업로드 엔드포인트 생성

파일 업로드를 위한 RESTful API 엔드포인트를 생성합니다.

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/api/files")
public class FileController {

private final S3Service s3Service;

public FileController(S3Service s3Service) {
this.s3Service = s3Service;
}

@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String fileUrl = s3Service.uploadFile(file);
return ResponseEntity.ok(fileUrl);
} catch (Exception e) {
return ResponseEntity.status(500).body("파일 업로드 실패: " + e.getMessage());
}
}
}

위 코드를 통해 /api/files/upload 엔드포인트에 파일을 업로드하면 파일이 S3에 저장되고, 업로드된 파일의 URL을 반환합니다. 이를 통해 워드프레스에서 S3에 저장된 파일을 외부 링크로 활용할 수 있습니다.

결론

이 가이드를 통해 Java Spring Boot 애플리케이션에서 Amazon S3와 효율적으로 연동하여 미디어 파일을 관리할 수 있습니다. 이 설정은 대용량 파일 관리와 웹사이트 성능 최적화에 유리합니다.

위로 스크롤