AWS S3

Mini_me·2023년 4월 20일
1

공부 [Spring]

목록 보기
19/27
post-thumbnail

S3?? 그게뭔데

S3는 AWS 대표적인 객체 스토리지 서비스로서,
클라우드 환경에서 파일이나 데이터를 안정적으로 저장하고 관리할 수 있도록 지원하는 서비스

AWS S3 Bucket을 생성하고 AWS SDK를 프로젝트에 추가하려면 다음 단계를 따르면 됩니다.

AWS Management Console에서 S3 Bucket 생성

AWS Management Console에 로그인하여 S3 서비스로 이동합니다. 새로운 버킷을 만들고 일반 구성, 객체 소유권, 버전 관리 및 기본 암호화 설정을 비활성화합니다. 퍼블릭 엑세스 차단 기능은 필요에 따라 활성화 또는 비활성화할 수 있습니다.

AWS SDK 및 의존성 추가

Gradle 파일에 AWS SDK를 추가합니다. Gradle 파일을 업데이트하고 필요한 의존성을 추가합니다.

implementation 'com.amazonaws:aws-java-sdk-s3:1.12.42'

IAM에서 사용자 추가

AWS IAM에서 새로운 사용자를 만들고 해당 사용자에게 액세스 키를 부여합니다. 이 작업은 애플리케이션에서 AWS S3 서비스에 액세스하기 위해 필요합니다.

애플리케이션 설정 업데이트

애플리케이션의 application.properties 파일에 액세스 키와 시크릿 액세스 키를 추가합니다.

cloud.aws.credentials.accessKey=YOUR_ACCESS_KEY
cloud.aws.credentials.secretKey=YOUR_SECRET_KEY

그러면 이제 S3 설정을 했으니 프로젝트에 S3 코드를 작성하였습니다.

@Service
public class S3Service {
    private final String bucketName;
    private final String accessKeyId;
    private final String secretAccessKey;
    private final String clientRegion;
    private final BasicAWSCredentials awsCreds;
    private final AmazonS3 s3Client;
    
    // AWS S3 서비스를 사용하기 위한 인증 정보와 설정 정보를 초기화 한다.
    public S3Service(@Value("${cloud.aws.credentials.accessKey}") String accessKeyId,
                     @Value("${cloud.aws.credentials.secretKey}") String secretAccessKey,
                     @Value("${cloud.aws.region.static}") String clientRegion,
                     @Value("${cloud.aws.s3.bucket}") String bucketName) {
        this.bucketName = bucketName;
        this.accessKeyId = accessKeyId;
        this.secretAccessKey = secretAccessKey;
        this.clientRegion = clientRegion;
        
        // AWS 인증 정보를 담은 객체 생성
        this.awsCreds = new BasicAWSCredentials(accessKeyId, secretAccessKey);
        
        // AWS S3 클라이언트 생성
        this.s3Client = AmazonS3ClientBuilder.standard()
                .withRegion(clientRegion)
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .build();
    }
    
    // 파일 업로드 기능
    public String upload(MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        
        // S3 상에 고유한 키값 생성
        String key = UUID.randomUUID().toString() + "_" + fileName;
        
        // 파일 정보 생성
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(file.getSize());
        metadata.setContentType(file.getContentType());
        
        // 파일 업로드
        s3Client.putObject(new PutObjectRequest(bucketName, key, file.getInputStream(), metadata)
                .withCannedAcl(CannedAccessControlList.PublicRead));
        
        // 업로드한 파일의 URL 반환
        return s3Client.getUrl(bucketName, key).toString();
    }
}

위 코드는 AWS S3에 파일을 업로드하는 기능을 제공하는 S3Service 클래스입니다.

클래스 생성자에서는 AWS 계정의 accessKeyId와 secretAccessKey, 클라이언트 리전 정보, 그리고 업로드할 버킷 이름을 인자로 받아 필드에 할당합니다. 그리고 BasicAWSCredentials와 AmazonS3Client 객체를 생성합니다.

upload 메소드에서는 MultipartFile 형식의 파일을 인자로 받아, 파일 이름을 랜덤한 UUID와 함께 생성하고, 파일의 크기와 컨텐츠 타입 정보를 ObjectMetadata 객체에 담습니다.
그리고 AWS S3 클라이언트 객체의 putObject 메소드를 이용하여 파일을 업로드하고, 해당 파일의 고유한 URL을 반환합니다.

0개의 댓글