[AWS] S3(Simple Storage Service)์๋ฒ์ Spring Boot ์ฐ๋
by rlaehddnd0422์งํ์ค์ด๋ ํ๋ก์ ํธ์ ํ์ผ ์ ๋ก๋ ๊ธฐ๋ฅ์ด ์์์ต๋๋ค.
- ex) ๊ฒ์๊ธ์ ์ ๋ก๋ ํ ๋ ์ด๋ฏธ์ง๋ ํจ๊ป ์ ๋ก๋, ํ์์ ๋ณด๋ฅผ ์์ ํ ๋ ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ๋ฑ๋ก
ํ์ผ ์ ๋ก๋์ ๊ฒฝ์ฐ, EC2 ์๋ฒ๊ฐ ์๋ ๋ก์ปฌ ์๋ฒ๋ฅผ ์ฌ์ฉํ์ ๋๋ ์๋์ ๊ฐ์ด yml์ ์ ๊ฐ์ธ PC์ ์ ์ฅํ๋๋ก ์ค์ ํด์ฃผ์๋๋ฐ, ๋ฐฐํฌ๋ฅผ ์์ํ๊ฒ ๋๋ฉด์ ํ์ผ ๊ด๋ฆฌ๋ฅผ ์ํ S3 ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
upload:
post:
image:
location: /Users/kdo6301/Desktop/sharing_platform_server/post/
member:
image:
location: /Users/kdo6301/Desktop/sharing_platform_server/member/
์ด๋ฒ ํฌ์คํ ์์๋ Spring Boot์์ AWS S3 ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ ํ์ผ ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
1. S3 (Simple Storage Service) ๋?
- AWS์์ ์ง์ํ๋ ํ์ผ ๊ด๋ฆฌ ์คํ ๋ฆฌ์ง ์๋ฒ์ ๋๋ค.
- ํ์ฅ์ฑ๊ณผ ๋ด๊ตฌ์ฑ์ด ์ข์ต๋๋ค.
- ๊ฐ์ ์ผ ๊ธฐ์ค 12๊ฐ์๊ฐ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
2. ์ฌ์ ์ค๋น
- S3 ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ AWS์์ ๋ฒํท๊ณผ IAM์ ๋จผ์ ์์ฑํด์ฃผ์ด์ผํฉ๋๋ค.
- ๋ฒํท : ๋ค์์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํ ์ด๋ ( ํ์ผ์ ๊ด๋ฆฌํ ์ ์๋ ํ์ผ ์์คํ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋จ )
- IAM : S3์ ์ ๊ทผํ๊ธฐ ์ํ ์ฌ์ฉ์ ์ ๋ณด
์ฌ์ฉ์(IAM) ์์ฑ
1. AWS ๊ฒ์์ฐฝ์ iam ์ ๊ฒ์ํ ํ ์ฃผ์ ๊ธฐ๋ฅ - ์ฌ์ฉ์ ํด๋ฆญ
2. ์ํ๋ ์ฌ์ฉ์ ์ด๋ฆ ์ง์ - ๋ค์
3. ์๋์ ๊ฐ์ด ๊ถํ ์ค์ - ๋ค์
4. ๊ฒํ ๋ฐ ์์ฑ - ์ฌ์ฉ์ ์์ฑ
5. ์ก์ธ์ค ํค ์ค์ - ์ฌ์ฉ์ ์ด๋ฆ ํด๋ฆญ
6. ์์ฝ - ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ
7. ์ก์ธ์ค ํค ์ฌ์ฉ ์ฌ๋ก ์ ํ - ์๋ฌด๊ฑฐ๋ ์ ํ ํด๋ ok
8. ์ํ๋ ํ๊ทธ ์์ฑ ( ์ ํ ) ํ - ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ
9. csv ํ์ผ ๋ค์ด๋ก๋๋ฅผ ํด๋ฆญํฉ๋๋ค. ( ์ด ํ์ผ์๋ ๊ณต๊ฐํค์ธ Access Key์ , ๋น๋ฐํค์ธ Secret Key ์ ๋ณด๊ฐ ๋ค์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ์ผ ๊ด๋ฆฌ์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค )
์ด์ S3์ ์ ๊ทผํ๊ธฐ ์ํ IAM์ ๋ํ ์ค์ ์ด ์๋ฃ๋์์ต๋๋ค. ๋ฒํท์ ์์ฑํด๋ด ์๋ค.
๋ฒํท ์์ฑ
1. ๊ฒ์์ฐฝ์ s3 ๊ฒ์
2. ๋ฒํท ๋ง๋ค๊ธฐ ํด๋ฆญ
3. ์ผ๋ฐ ๊ตฌ์ฑ - ๋ฒํท ์ด๋ฆ ์ง์
4. Public Access ์ฐจ๋จ ํด์ ๋ฐ ๋ฒํท ๋ง๋ค๊ธฐ ํด๋ฆญ
ํ์ผ์ ๊ด๋ฆฌํ ์ ์๋ ํ๋์ ๋ฒํท์ด ์์ฑ๋์์ต๋๋ค. ์ด์ ์ฌ์ ์ค๋น๊ฐ ๋ชจ๋ ๋๋ฌ์ต๋๋ค. ์ด์ Spring boot์ ์ด ๋ฒํท๊ณผ ์ฐ๋ํด๋ด ์๋ค.
3. Spring Boot์ ์ฐ๋
1. build.gradle์ ์์กด๊ด๊ณ ์ถ๊ฐ
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
2. IAM ์์ฑ์์ ๋ฐ๊ธ๋ฐ์ csv ํ์ผ์ ๊ณต๊ฐํค์ ๋น๋ฐํค, ๊ทธ๋ฆฌ๊ณ ๋ฒํท์ ์์ฑํ ๋ ์ง์ ํ ๋ฒํท ์ด๋ฆ์ yml์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด์ค๋๋ค.
- ์ด ๋ AccessKey์ SecretKey ์ ๋ณด๋ github์ ์ฌ๋ผ๊ฐ๊ฒ ๋๋ฉด ํดํน์ผ๋ก ์ธํ ๊ณผ๊ธ ์ํ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก yml ํ์ผ์ gitignore๋ก ์ค์ ํ์ฌ ๋ฐ๋์ github์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก ํฉ์๋ค.
- cloud.aws.region.static: ap-northease2 : ์ง์ญ ํ๊ตญ ๊ณ ์
3) ์คํ๋ง ์ค์ ์ถ๊ฐ
@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();
}
}
4. ๋ก์ปฌ ์ ์ฅ โก๏ธ S3 ์๋ฒ์ ๋ฒํท์ ์ ์ฅํ๋๋ก Refactoring
PostFileService
@Service
@RequiredArgsConstructor
public class PostFileService {
@Value("${cloud.aws.s3.bucket}")
private String BUCKET;
private final AmazonS3Client amazonS3Client;
public void upload(MultipartFile file, String filename) {
try {
ObjectMetadata metadata= new ObjectMetadata();
metadata.setContentType(file.getContentType());
metadata.setContentLength(file.getSize());
amazonS3Client.putObject(BUCKET + "/post", filename, file.getInputStream(), metadata);
} catch(IOException e) {
throw new FileUploadFailureException();
}
}
public void delete(String fileName){
DeleteObjectRequest request = new DeleteObjectRequest(BUCKET + "/post", fileName);
amazonS3Client.deleteObject(request);
}
}
- ๊ธฐ์กด์๋ upload()๋ฉ์๋์์ try/catch๋ฌธ์ผ๋ก ๋ก์ปฌ์์ ํ๋์ ์ง์ ํ ์์น์ ์ ๊ทผํ์ฌ ํ์ผ์ ์ ์ฅํ๊ณ , ๋ง์ฝ IOException์ผ๋ก ํ์ผ์ ๋ก๋์ ์คํจํ๋ ๊ฒฝ์ฐ Customํ extended RuntimeException์ธ FileUploadException์ ๋์ง๋๋ก ๊ตฌํํ์ต๋๋ค.
- ๊ธฐ์กด์๋ delete() ๋ฉ์๋๋ ํ๋์ ์ง์ ํ ์์น์ ์ ๊ทผํ์ฌ ํ์ผ์ ์ญ์ ํ๋๋ก ๊ตฌํํ์ต๋๋ค.
- S3 ์คํ ๋ฆฌ์ง ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ดํ ๋ถํฐ๋ ์ ์ฝ๋์ ๊ฐ์ด yml์ ์ง์ ํด์ค BUCKET์ ํด๋์ ์ ๊ทผํ์ฌ ํ์ผ์ ์ ๋ก๋ํ๊ณ , ์ง์ธ ์ ์๋๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.
5. Postman Test
์ ๋ก๋ ํ ์คํธ
1) ๊ฒ์๊ธ ์์ฑ ์์ฒญ with ํ์ผ
- ์ด ๋ ๋ณ๋๋ก ์์ฑํด๋ Post Image ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ผ์ originName๊ณผ uniqueName์ด ์ ์ฅ๋ฉ๋๋ค. (for ์ฌ์ฉ์๊ฐ ํ์ผ์ ์์ฑํ๊ณ , ์ญ์ ํ ๋ S3์ ์ ์ฅ๋ ํ์ผ์ด ๋ฌด์์ธ์ง ํ์ ํ๊ธฐ ์ํด์)
2) ๋ฒํท์ ํ์ผ์ด ์ ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฒ์๊ธ ์์ ํ ์คํธ - ์ด๋ฏธ์ง ํ์ผ ์ญ์
1) ์์ ์์ฒญ
2) ๋ฒํท์์ ์ญ์ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ฐธ๊ณ ๋ก ์ด๋ฏธ์ง ์ญ์ ๋ ๋ด๋ถ์ ์ผ๋ก ๊ฒ์๊ธ ์์ API์์ Post Image๋ฅผ ์ํ ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ์์ฒญ API์ ํผ๋ฐ์ดํฐ์ deleteImageNames๋ก ์์ฑํ originName๊ณผ ์ผ์นํ๋ ํ์ผ์ uniqueName์ S3์๋ฒ์์ ์ญ์ ํ๋๋ก ๊ตฌํํ์์ต๋๋ค)
<์ฐธ๊ณ ์๋ฃ>
'๐ Etc > Sol' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
axios ์์ฒญ ์ header์ Token์ด ๋ด๊ธฐ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ (0) | 2023.09.22 |
---|---|
[AWS] Amazon S3 ๋ฒํท์์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ (0) | 2023.09.12 |
[MySQL] blocked because of many connection errrors ์๋ฌ ํด๊ฒฐ (0) | 2023.08.17 |
[DB] EC2 MySQL ์ฐ๋ ์ค ๋๋ฏธ ๋ฐ์ดํฐ ์ฝ์ ์ค๋ฅ ํด๊ฒฐ (0) | 2023.08.16 |
TestCode์์ Lombok ์ฌ์ฉ (build.gradle) (0) | 2023.08.16 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422