본문 바로가기
스프링 부트3

스프링 부트 3와 AWS S3 연동: 클라우드 스토리지 활용의 새로운 차원

by 굿센스굿 2024. 12. 11.
반응형

 

스프링 부트 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. 추가 팁: 보안 및 최적화

  1. 보안 강화를 위한 IAM 역할 사용
    AWS 액세스 키와 시크릿 키를 코드에 하드코딩하지 않고, IAM 역할을 활용하면 보안을 강화할 수 있습니다.
  2. 멀티파트 업로드 활용
    대용량 파일의 경우 멀티파트 업로드 기능을 사용하면 업로드 속도와 안정성을 높일 수 있습니다.
  3. S3 버킷 정책 설정
    S3 버킷 정책을 구성하여 접근 권한을 세부적으로 관리하세요. 예를 들어, 특정 IP만 접근 가능하게 설정할 수 있습니다.

마무리

스프링 부트 3와 AWS S3 연동은 클라우드 스토리지의 효율성과 확장성을 극대화하며, 현대적인 웹 애플리케이션 개발에 필수적인 요소입니다. 위의 구현 단계를 따라가며, 클라우드 스토리지를 활용한 기능을 손쉽게 구축해 보세요. 추가적인 문의나 어려움이 있다면 댓글로 남겨주시면 도움드리겠습니다!

반응형