개요
이전까지 AWS S3를 위한 버킷과 IAM 사용자를 생성했다
https://steadi1y.tistory.com/245
[AWS] IAM 사용자 개념과 계정 생성하는 방법
개요루트 사용자 계정으로 AWS를 사용해서는 안 된다고 해서 IAM 사용자 개념에 대해 찾아보고, 설정하려고 한다.개념- 루트 사용자 : AWS 계정 생성 시 만든 기본 사용자 - IAM (Identity and Access Managem
steadi1y.tistory.com
이제는 Spring Boot 프로젝트에서 S3에 이미지를 업로드 하기
개념
클라이언트가 이미지 업로드 -> Spring Boot에서 이미지 처리 후 S3에 전송
-> S3에 저장 -> 파일에 접근할 수 있는 url 반환
설정
Spring Boot 2.7.18
Java 17
Maven
공식 문서 보면서 따라하기
메이븐에 의존성 추가 : 버전 참고
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.29.38</version>
</dependency>
application.properties에 값 추가해야 한다.
외부에 노출되지 않게 추가로 application-private.properties 만들어서 값 넣는다.
application.properties
aws.credentials.accessKey=${ACCESS_KEY}
aws.credentials.secretKey=${SECRET_KEY}
aws.s3.bucketName=${BUCKET_NAME}
aws.region.static=${REGION}
application-private.properties
ACCESS_KEY=
SECRET_KEY=
BUCKET_NAME=
REGION=
s3 클라이언트 설정 config 파일
@Configuration
public class S3Config {
@Value("${aws.credentials.accessKey}")
private String accessKey;
@Value("${aws.credentials.secretKey}")
private String secretKey;
@Value("${aws.region.static}")
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();
}
}
Controller
@RestController
@RequestMapping("/api/S3")
@RequiredArgsConstructor
public class S3Controller {
private final S3Service s3Service;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
try {
String fileUrl = s3Service.uploadFile(file);
return fileUrl;
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
}
Service
@Service
@RequiredArgsConstructor
public class S3Service {
private final S3Client s3Client;
@Value("${aws.s3.bucketName}")
private String bucketName;
private String createFileName(String originalFileName) {
return UUID.randomUUID() + "_" + originalFileName;
}
public String uploadFile(MultipartFile file) {
String fileName = createFileName(file.getOriginalFilename());
try {
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(fileName)
.contentType(file.getContentType())
.contentLength(file.getSize())
.build();
s3Client.putObject(objectRequest, RequestBody.fromBytes(file.getBytes()));
return getFileUrl(fileName);
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
private String getFileUrl(String fileName) {
GetUrlRequest request = GetUrlRequest.builder()
.bucket(bucketName)
.key(fileName)
.build();
URL url = s3Client.utilities().getUrl(request);
return url.toString();
}
}
Postman으로 테스트
url로 들어가면 이미지 업로드 성공
참고
https://jaehee1007.tistory.com/162
https://stackoverflow.com/questions/10975475/amazon-s3-upload-file-and-get-url/10975577
https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/java_s3_code_examples.html
'프로젝트' 카테고리의 다른 글
[AWS] S3 + CloudFront : 정적 웹사이트 배포하기 (0) | 2024.12.23 |
---|---|
[Log4jdbc] MyBatis 쿼리 로그 출력하기 (0) | 2024.12.22 |
[AWS] IAM 사용자 개념과 계정 생성하는 방법 (0) | 2024.12.20 |
[AWS] S3 버킷 생성하고 파일 업로드 (0) | 2024.12.19 |
[Vue.js] .env 파일에서 카카오 지도 API 키 설정하기 (0) | 2024.12.11 |