AWS S3를 통해서 쉽게 파일 업로드, 삭제와 관리까지 할 수 있다고?
당장 도입해봅시다.
로컬 서버에서 파일 관리를 하지 않아도 된다니....
사실 서버에 많은 파일들이 있으면 관리하기가 너무 힘들다..
서버 용량도 걱정이 되고
그래서 AWS S3 버킷을 활용해서 파일 관리를 하면
실무에서도 써먹을 수 있지 않을까? 라는 생각에 프로젝트에 도입해보기로 했다
나도 AWS S3 활용 할 줄 아는 개발자가 될 수 있을거라구...
으흐흐흐ㅡ흫
흐흐흐흐으으흐흐으으흐
응흐흐흐흐
ㄷㄱㄷㄱ 기대된다잇
가봅시다
근데 저는 돈이 없어서 프리티어 기준으로 설명해드립니다잇..
버킷 이름 : 원하는 이름으로 설정!
버킷만들기 눌러주세요!!!!
이때, 한 번만 볼 수 있어서 반드시 저장을 잘 해두셔야합니다!!
자 이제 S3 설정도 했고, 연결을 해볼까요?
// ⭐ AWS
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
#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
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;
}
}
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);
}
}
}
이제 AwsS3ObjectStorage Class를 활용해서 S3 사용을 해보자!
이건 뭐 알아서들..
이정도 알려줬으면 다 해줬자나~!>!!>????!!!
S3 관련해서 다양하게 응용을 할 수 있을 것 같은데
조금 더 알아보고 활용해보도록 해야겠다!
개발 할 때 AWS에서 제공해주는 다양한 기능을 활용하면
개발의 능률이 올라갈 것 같다..
능률 하니까 떠오르는데 개발할 때 에어팟을 끼면 ?
능률이 올라가죠? ㅋㅋ
요점이 이게 아니였지..?
다시 한 번 말하자면
개발 할 때 AWS에서 제공해주는 다양한 기능을 활용하면
개발의 능률이 올라갈 것 같다..
다양한 AWS 기능을 처음 쓰면 어떻게 쓰는지 몰라서 그게 문제...
뭐 차근차근하면 되겠지요
우리 모두 성장합시다 ^^
안녕