스프링 부트 3는 최신 자바 기반 웹 애플리케이션 개발 프레임워크로, 간단하고 직관적인 설정을 제공하며 생산성을 크게 향상시킵니다. AWS S3는 안정적이고 확장 가능한 클라우드 스토리지 서비스로, 대규모 데이터를 효율적으로 관리할 수 있습니다. 이번 글에서는 스프링 부트 3를 이용해 AWS S3와 연동하는 방법을 단계별로 설명하며, 실제 구현 예시를 통해 이를 쉽게 이해할 수 있도록 돕겠습니다.
1. AWS S3 연동의 필요성과 장점
AWS S3(Simple Storage Service)는 파일 업로드, 백업, 미디어 콘텐츠 저장 등 다양한 목적으로 활용되는 클라우드 스토리지입니다. S3와 스프링 부트 3를 연동하면 다음과 같은 이점을 얻을 수 있습니다.
- 확장성: 저장 공간이 자동으로 확장되므로 대용량 데이터를 처리하기 용이합니다.
- 안정성: 데이터 내구성이 높고, 글로벌 서비스로 고가용성을 제공합니다.
- 편리성: RESTful API를 통해 S3 버킷에 접근할 수 있어 애플리케이션에서 쉽게 파일 업로드 및 다운로드를 처리할 수 있습니다.
2. 프로젝트 설정: 스프링 부트 3와 AWS SDK 추가
(1) Maven 의존성 추가
프로젝트의 pom.xml 파일에 AWS SDK와 관련된 의존성을 추가합니다. AWS SDK for Java는 AWS 서비스와의 통합을 위한 강력한 도구를 제공합니다.
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.62</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2) 프로퍼티 파일 설정
application.yml 또는 application.properties에 AWS 자격 증명 및 S3 버킷 정보를 설정합니다.
aws:
s3:
bucket-name: my-springboot-s3
region: ap-northeast-2
credentials:
access-key: YOUR_ACCESS_KEY
secret-key: YOUR_SECRET_KEY
3. AWS S3 연동 구현
(1) S3 클라이언트 설정
AWS SDK에서 제공하는 S3 클라이언트를 설정합니다. 이 클라이언트를 통해 S3 버킷과 통신하게 됩니다.
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 {
@Value("${aws.credentials.access-key}")
private String accessKey;
@Value("${aws.credentials.secret-key}")
private String secretKey;
@Value("${aws.s3.region}")
private String region;
@Bean
public S3Client s3Client() {
AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
return S3Client.builder()
.region(Region.of(region))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.build();
}
}
(2) 파일 업로드 기능 구현
S3에 파일을 업로드하는 메서드를 작성합니다. 이 메서드는 로컬 파일을 받아 S3 버킷에 업로드합니다.
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import java.nio.file.Paths;
@Service
public class S3Service {
private final S3Client s3Client;
private final String bucketName;
public S3Service(S3Client s3Client, @Value("${aws.s3.bucket-name}") String bucketName) {
this.s3Client = s3Client;
this.bucketName = bucketName;
}
public String uploadFile(String key, String filePath) {
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(key)
.build();
s3Client.putObject(putObjectRequest, Paths.get(filePath));
return String.format("https://%s.s3.amazonaws.com/%s", bucketName, key);
}
}
(3) API 컨트롤러 구현
파일 업로드 기능을 REST API로 노출합니다.
@RestController
@RequestMapping("/api/s3")
public class S3Controller {
private final S3Service s3Service;
public S3Controller(S3Service s3Service) {
this.s3Service = s3Service;
}
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String filePath = "temp/" + file.getOriginalFilename();
file.transferTo(new File(filePath));
String url = s3Service.uploadFile(file.getOriginalFilename(), filePath);
return ResponseEntity.ok("File uploaded successfully: " + url);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("File upload failed: " + e.getMessage());
}
}
}
4. 실습 예시
예시 1: 로컬 파일 업로드
로컬의 test-image.jpg 파일을 S3에 업로드하고 해당 URL을 확인합니다.
curl -X POST -F "file=@test-image.jpg" http://localhost:8080/api/s3/upload
예시 2: S3 버킷 내 저장 파일 목록 확인
S3에 업로드된 파일을 확인하려면 AWS Management Console에서 S3 서비스로 이동합니다.
예시 3: URL을 이용한 파일 접근
업로드 후 반환된 URL을 브라우저에서 열어 파일이 정상적으로 저장되었는지 확인합니다.
5. 추가 팁: 보안 및 최적화
- 보안 강화를 위한 IAM 역할 사용
AWS 액세스 키와 시크릿 키를 코드에 하드코딩하지 않고, IAM 역할을 활용하면 보안을 강화할 수 있습니다. - 멀티파트 업로드 활용
대용량 파일의 경우 멀티파트 업로드 기능을 사용하면 업로드 속도와 안정성을 높일 수 있습니다. - S3 버킷 정책 설정
S3 버킷 정책을 구성하여 접근 권한을 세부적으로 관리하세요. 예를 들어, 특정 IP만 접근 가능하게 설정할 수 있습니다.
마무리
스프링 부트 3와 AWS S3 연동은 클라우드 스토리지의 효율성과 확장성을 극대화하며, 현대적인 웹 애플리케이션 개발에 필수적인 요소입니다. 위의 구현 단계를 따라가며, 클라우드 스토리지를 활용한 기능을 손쉽게 구축해 보세요. 추가적인 문의나 어려움이 있다면 댓글로 남겨주시면 도움드리겠습니다!
'스프링 부트3' 카테고리의 다른 글
Spring Boot와 OpenAPI 통합 (0) | 2024.12.11 |
---|---|
스프링 부트 3에서 Cloud Config Server 사용하기 (0) | 2024.12.11 |
스프링 부트 3와 Google OAuth2 통합 (0) | 2024.12.11 |
스프링 부트 3의 Custom Authentication Provider (0) | 2024.12.11 |
Event Listener 활용하기 (0) | 2024.12.11 |