여러 블로그와 GitHub를 참고했던 것 같다.
아주 기본적인 CRUD에 사진만 추가하였다.
일단 CRUD가 되면 User
를 연결할 것이다.
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
package com.sparta.actionboss.global.config;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AmazonS3Config {
@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();
}
}
AmazonS3Config.java
이렇게 공통적으로 쓰는 것 같았다.
Amazon S3 클라이언트 설정을 하는 코드
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
AWS 인증에 필요한 기본 정보 객체 만들어준다.
return (AmazonS3Client) AmazonS3ClientBuilder.standard() // Amazon S3 클라이언트 빌더 생성
.withRegion(region) // 지역 설정
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) // 인증 정보 설정
.build(); // 객체 생성
@Slf4j
@RequiredArgsConstructor
@Service
public class S3Uploader {
private final AmazonS3Client amazonS3Client;
@Value("${cloud.aws.s3.bucket}")
private String s3Bucket;
/*
- MultipartFile 객체를 해당 디렉토리(dirName)에 파일을 업로드
- MultipartFile -> File 변환한 후, upload(File uploadFile, String dirName) 메서드에서 실제로 업로드 수행
*/
public String upload(MultipartFile multipartFile, String dirName) throws IOException {
File uploadFile = convert(multipartFile).orElseThrow(() -> new IllegalArgumentException("파일 전환에 실패했습니다."));
return upload(uploadFile, dirName);
}
/*
- S3에 파일 업로드
- 중복 방지를 위해 파일명에 UUID를 붙여서 업로드
*/
private String upload(File uploadFile, String dirName) {
String s3FileName = dirName + "/" + UUID.randomUUID() + "/" + uploadFile.getName();
String uploadImageURL = putS3(uploadFile, s3FileName);
uploadFile.delete(); // 로컬에 저장된 이미지 삭제
return uploadImageURL;
}
/*
- AmazonS3Client를 이용해서 파일을 업로드하고 해당 파일의 URL 반환
*/
private String putS3(File uploadFile, String s3FileName) {
amazonS3Client.putObject(new PutObjectRequest(s3Bucket, s3FileName, uploadFile).withCannedAcl(CannedAccessControlList.PublicRead));
return amazonS3Client.getUrl(s3Bucket, s3FileName).toString();
}
/*
- MultipartFile -> File 변환
- 시스템 사용자의 홈 디렉토리를 기준으로 파일 경로 설정
*/
public Optional<File> convert(MultipartFile multipartFile) throws IOException {
File convertFile = new File(System.getProperty("user.dir") + "/" + multipartFile.getOriginalFilename());
if (convertFile.createNewFile()) {
try (FileOutputStream fileOutputStream = new FileOutputStream(convertFile)) { // fileOutputStream 데이터 -> 바이트 스트림으로 저장
fileOutputStream.write(multipartFile.getBytes());
}
return Optional.of(convertFile);
}
return Optional.empty();
}
너무 어렵다