AWS S3 구축과 Spring boot 연동하기 (feat. Code)

2.5*2 하빈·2024년 6월 9일
1
post-thumbnail

AWS S3를 통해서 쉽게 파일 업로드, 삭제와 관리까지 할 수 있다고?

당장 도입해봅시다.

로컬 서버에서 파일 관리를 하지 않아도 된다니....

사실 서버에 많은 파일들이 있으면 관리하기가 너무 힘들다..

서버 용량도 걱정이 되고

그래서 AWS S3 버킷을 활용해서 파일 관리를 하면
실무에서도 써먹을 수 있지 않을까? 라는 생각에 프로젝트에 도입해보기로 했다



나도 AWS S3 활용 할 줄 아는 개발자가 될 수 있을거라구...
으흐흐흐ㅡ흫
흐흐흐흐으으흐흐으으흐
응흐흐흐흐
ㄷㄱㄷㄱ 기대된다잇

가봅시다

근데 저는 돈이 없어서 프리티어 기준으로 설명해드립니다잇..


1 - AWS 접속

  • 먼저 AWS 접속부터 해야겠죠?
    Login 해주세요!


2 - S3 bucket 생성

  • 검색창에서 S3 검색해서 들어가봅시다


  • 버킷 만들어봅시다


  • 하나씩 따라오세요~!

버킷 이름 : 원하는 이름으로 설정!



  • 차단이 default로 check 되어 있는 것을 풀어주세요


  • 빨간 박스 설정을 따라주세요!

버킷만들기 눌러주세요!!!!


  • 오 잘 만들어졌네요!


3 - I AM 사용자 권한 설정

  • 우선 I AM 부분으로 들어가볼까요?


  • 액세스 관리 > 사용자 > 사용자 생성


  • 사용자 이름 설정하고 다음 눌러주세요


  • 직접 정책 연결 > S3 검색 > AmazonS3FullAccess Check > 다음


  • 설정한 내용 확인 후 사용자 생성 Click!


3-1 Access Key 발급

  • 이제 사용자가 생성된 것을 확인하고 생성한 사용자 이름을 눌러주세요.


  • 보안 자격 증명 > 액세스 키 > 액세스 키 만들기


  • 사용 방법을 알려주는 것을 선택하는 것이라서 아무거나 선택하세요!


  • 설정안하고 그냥 넘기셔도 무방합니다.


  • 생성하면 액세스 키와 비밀 액세스 키 2가지가 나오는데 저장해두세요!

이때, 한 번만 볼 수 있어서 반드시 저장을 잘 해두셔야합니다!!


4 - AWS S3 Spring boot 연결!

자 이제 S3 설정도 했고, 연결을 해볼까요?

  • build.gradle 의존성 추가
// ⭐ AWS
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

  • .yml S3 Key 값 작성
#aws s3 bucket
cloud:
  aws:
    s3:
      bucket: S3 버킷 이름
    credentials:
      access-key: I AM 사용자에서 발급받은 액세스 키
      secret-key: I AM 사용자에서 발급받은 시크릿 키
    region:
      static: ap-northeast-2
      auto: false
    stack:
      auto: false

4-1 Spring boot S3 Config 작성

  • 저는 S3 관련 코드를 따로 클래스로 빼기 위한 Config 설정입니다.
    참고해주세요!
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.quiz.ourclass.global.util.AwsS3ObjectStorage;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AWSS3Config {

    @Value("${cloud.aws.s3.bucket}")
    private String bucket;
    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;
    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;
    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonS3Client amazonS3Client() {
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
            .withRegion(region)
            .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
            .build();
    }

    @Bean
    public AwsS3ObjectStorage awsS3ObjectStorageUpload(AmazonS3 amazonS3) {
        AwsS3ObjectStorage awsS3ObjectStorageUpload = new AwsS3ObjectStorage(amazonS3);
        awsS3ObjectStorageUpload.setBucket(bucket);
        return awsS3ObjectStorageUpload;
    }
}

4-2 S3 파일 업로드, 삭제 클래스 생성 및 작성

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.quiz.ourclass.global.exception.ErrorCode;
import com.quiz.ourclass.global.exception.GlobalException;
import java.io.IOException;
import java.net.URI;
import java.util.UUID;
import lombok.Data;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.multipart.MultipartFile;

@Log4j2
@Data
public class AwsS3ObjectStorage {

    private AmazonS3 amazonS3; //AmazonS3 config 미리 빈 주입
    private String bucket; //빈 주입 시 setter
    private String aiS3Url; //빈 주입 시 setter

    public AwsS3ObjectStorage(AmazonS3 amazonS3) {
        this.amazonS3 = amazonS3;
    }

    public String uploadFile(MultipartFile multipartFile) {
        // UUID 이용해 고유한 파일명 생성
        String originalFileName = multipartFile.getOriginalFilename();
        String fileName = UUID.randomUUID() + "_" + originalFileName;

        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(multipartFile.getSize());
        metadata.setContentType(multipartFile.getContentType());
        try {
            amazonS3.putObject(bucket, fileName, multipartFile.getInputStream(), metadata);
        } catch (IOException ioException) {
            throw new GlobalException(ErrorCode.AWS_SERVER_ERROR);
        }
        return amazonS3.getUrl(bucket, fileName).toString();
    }

    public void deleteFile(String fileUrl) {
        try {
            // URL에서 객체 키 추출
            URI uri = new URI(fileUrl);
            // URL의 첫 번째 '/'를 제거하여 객체 키 얻기
            String key = uri.getPath().substring(1);

            // 파일 존재 여부 확인
            if (amazonS3.doesObjectExist(bucket, key)) {
                // S3에서 파일 삭제
                amazonS3.deleteObject(bucket, key);
                log.info("File deleted successfully: {}", key);
            } else { // file not found
                log.warn("File not found: {}", key);
                throw new GlobalException(ErrorCode.FILE_NOT_FOUND);
            }
        } catch (Exception e) { //error
            log.error("Failed to delete file!: {}", fileUrl, e);
            throw new GlobalException(ErrorCode.AWS_SERVER_ERROR);
        }
    }
}

5 - 마무리

이제 AwsS3ObjectStorage Class를 활용해서 S3 사용을 해보자!

이건 뭐 알아서들..

이정도 알려줬으면 다 해줬자나~!>!!>????!!!

S3 관련해서 다양하게 응용을 할 수 있을 것 같은데

조금 더 알아보고 활용해보도록 해야겠다!

개발 할 때 AWS에서 제공해주는 다양한 기능을 활용하면

개발의 능률이 올라갈 것 같다..

능률 하니까 떠오르는데 개발할 때 에어팟을 끼면 ?

능률이 올라가죠? ㅋㅋ




요점이 이게 아니였지..?

다시 한 번 말하자면

개발 할 때 AWS에서 제공해주는 다양한 기능을 활용하면
개발의 능률이 올라갈 것 같다..

다양한 AWS 기능을 처음 쓰면 어떻게 쓰는지 몰라서 그게 문제...

뭐 차근차근하면 되겠지요

우리 모두 성장합시다 ^^

안녕

profile
끝내주는 남자

0개의 댓글