μ€λμ μ€μ μ€ν λμ AWSμ S3 λ²ν·μ μ΄λ―Έμ§λ₯Ό λ±λ‘νλ κΈ°λ₯μ ꡬνμ νμκ³ ,
Spring Bootμμμ AWS S3 μ€μ κ³Ό λ‘μ§μ λν μ 리λ₯Ό ν΄λ³΄λ €κ³ ν©λλ€.
AWS S3λ κ°λ¨ν μκ°νμ¬ νμ₯ κ°λ₯ν ν΄λΌμ°λ μ μ₯μ λΌκ³ μκ° νλ©΄ λ κ² κ°λ€.
(λ€μ΄λ² ν΄λΌμ°λ, I ν΄λΌμ°λ λ±)
ν νλ‘μ νΈλ₯Ό νλ©°, μ΄λ―Έμ§ (νμΌ)μ μλ²λ₯Ό ν΅ν΄ κ΄λ¦¬μ νμμ±μ λλΌκ² λμ΄, AWS S3μ λ²ν·μ νμ©νμ¬ μ μ₯μλ‘ νμ© νλ €κ³ νλ€.
AWSμ λ‘κ·ΈμΈ ν S3λ₯Ό κ²μ νκ³ , μ μ ν©λλ€.
λ²ν· λ§λ€κΈ° λ²νΌμ λλ¬ AWS S3μ λν λ²ν· (컨ν
μ΄λ)λ₯Ό λ§λ€μ΄ μ€λλ€.
λ²ν·μ λν μ΄λ¦μ μ§μ΄μ£Όλ κ²μ΄λ©°, λ²ν·μ μ΄λ¦μ λ€λ₯Έ μ¬λλ€μ λ²ν· μ΄λ¦ κΉμ§ ν΅νμ΄μ κ³ μ ν μ΄λ¦ μ΄μ΄μΌ ν©λλ€.
λͺ¨λ νΌλΈλ¦ μ‘μΈμ€λ₯Ό μ°¨λ¨νκ² λλ©΄ μΈν°λ· μ¬μ©μλ€μκ² κ³΅κ°λμ§ μμΌλ©°, νΉλ³ν κ²½μ°μΌ λλ§, 체ν¬λ₯Ό ν΄μ νλ€κ³ νλ€.
λ²ν·μ λ²μ κ΄λ¦¬λ λΉνμ±νλ₯Ό μ²΄ν¬ ν©λλ€.
κΈ°λ³Έ μ€μ λλ‘ μ²΄ν¬ νκ³ λμ λ²ν·μ μμ± ν©λλ€.
μ¬μ©μλ₯Ό μμ± ν΄μΌ νλ μ΄μ λ S3μ μ κ·ΌνκΈ° μν΄ μ κ·Ό κΆνμ μ£Όκ³ , μμΈμ€ ν€ μ μν¬λ¦Ώ μμΈμ€λ₯Ό μμ±νμ¬ μ κ·ΌνκΈ° μν΄μ μ λλ€.
I AM μ κ²μνμ¬ μ μ ν©λλ€.
μ¬μ©μ μμ± λ²νΌμ λλ¬ μ§ν ν©λλ€.
μ¬μ©μ μ΄λ¦μ μμ±νμ¬ λ€μ λ²νΌμ ν΄λ¦ ν©λλ€.
μ§μ μ μ±
μ°κ²° μ ν ν, S3 κΆν μ μ±
μ μ ννκ³ λ€μμ ν΄λ¦ νκ² λλ©΄,
μ¬μ©μκ° μμ± λ©λλ€.
μΈλΆμμ μ μ νκΈ° μν μ¬μ©μμ μ‘μΈμ€ ν€λ₯Ό μμ± ν΄μΌ ν©λλ€.
μ¬μ©μ νμ ν΄λ¦ ν, μμ±νλ μ¬μ©μλ₯Ό ν΄λ¦ ν©λλ€.
보μ μ격 μ¦λͺ
ν ν΄λ¦ν, μ‘μΈμ€ ν€ λ§λ€κΈ°λ₯Ό ν΄λ¦ ν©λλ€.
μ무거λ ν΄λ¦ν ν λ€μ λ²νΌμ ν΄λ¦ ν©λλ€.
μ‘μΈμ€ ν€μ λΉλ° μ‘μΈμ€ ν€κ° μμ± λλ κ²μ λ³Ό μ μμ΅λλ€.
(μλ΄λ¬Έκ΅¬λ‘ μμ± νλ©΄μμλ§ ν€λ₯Ό νμΈ ν μ μμΌλ©°, .CSV νμΌλ‘ λ°μ λλ κ²μ κΆμ₯νλ€. λ°λΌνμ.)
{
"Version": "2012-10-17",
"Id": "Policy1702863852313",
"Statement": [
{
"Sid": "Stmt1702863805510",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::λ§λ€μλ λ²ν· μ΄λ¦/*"
}
]
}
1) build.gradleμ μμ‘΄μ± μΆκ°
dependencies {
// μΆκ° μμ‘΄μ±...
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
}
2) application.ymlμ μ€μ μΆκ°
ap-northeast-2 : μ€μ μ§μμ΄ μμΈμ΄λΌλ λ»
λ°κΈ λ°μ μ‘μΈμ€ ν€, λΉλ° μ‘μΈμ€ ν€μ λν΄μλ κΉνλΈμ μ¬λΌκ°μ§ μκ²
.gitIgnore μ€μ λ±μ ν΅ν΄ κΉνλΈμ μ¬λΌκ°μ§ μκ² μ‘°μ¬ ν΄μΌ νλ€.
cloud:
aws:
s3:
bucket: <λ²ν· μ΄λ¦>
url: https://<λ²ν· μ΄λ¦>.s3.ap-northeast-2.amazonaws.com/
stack.auto: false
region.static: ap-northeast-2
credentials:
accessKey: <λ°κΈ λ°μ μ‘μΈμ€ ν€>
secretKey: <λ°κΈ λ°μ λΉλ° μ‘μΈμ€ ν€>
3) Config μ€μ
yml νμΌμμ μ€μ ν κ°μ κ°μ Έμ μ¬μ©νλ μ€μ μ½λ μ
λλ€.
@Configuration
public class S3Config {
@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();
}
}
controller μ½λ
@RestController
@RequestMapping("/upload")
@RequiredArgsConstructor
public class FileUploadController {
private final FileUploadService fileUploadService;
@PostMapping
public ResponseEntity<String> uploadFile(@ModelAttribute(
name = "images") MultipartFile images) {
fileUploadService.createFile(images);
return ResponseEntity.ok("νμΌ μ
λ‘λ μ±κ³΅")
}
}
}
service μ½λ
@Service
@RequiredArgsConstructor
public class ImageService {
private final AmazonS3Client amazonS3Client;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
@Value("${cloud.aws.s3.url}")
private String bucketUrl;
@Transactional
public void uploadImage(MultipartFile file) throws IOException {
String imageLocation = bucketUrl;
String imageName = file.getOriginalFilename();
String requestTypeSimpleName = "product" + "/";
String imagePath = imageLocation + requestTypeSimpleName + imageName;
String fileName = requestTypeSimpleName + file.getOriginalFilename();
createS3Bucket(fileName, file);
}
private void createS3Bucket(String fileName, MultipartFile image) throws IOException {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(image.getContentType());
metadata.setContentLength(image.getSize());
amazonS3Client.putObject(bucket, fileName, image.getInputStream(), metadata);
}
}
AWS S3 λ²ν·μ product ν¨ν€μ§λ‘ μ μ μ₯ λλ κ²μ νμΈ ν μ μμ΅λλ€.
κ°λ¨νκ² AWS S3 λ²ν·μ μ΄λ―Έμ§λ₯Ό μ λ‘λ ν μ μλ λ°©λ²μ λν΄ μ 리 ν΄λ³΄μμ΅λλ€.
λ§μ§λ§ λΉμ¦λμ€ λ‘μ§μ λν΄μλ μ¬μ©μμ λ§κ² 컀μ€ν ν΄μ μ¬μ©νλ©΄ μ’μ κ² κ°μ΅λλ€. (κΈ°λ₯ λΆλ¦¬ λ±)