지석이의 일기
Aws s3를 사용해서 파일(이미지)를 저장하자 본문

낮은 사양의 서버를 호스팅하거나, 대량의 이미지 파일들을 저장할경우 cdn 을 사용하거나 다른 nas를 사용해서 파일을 저장한다.
S3는 Amazon Simple Storage Service의 약자로, 웹에서 데이터를 저장하고 검색할 수 있는 무한한 저장 공간을 제공한다.
S3 특징들
1. 무한한 저장 공간
너의 모든 데이터를 무한히 저장할수 있고,사용한 만큼만 비용을 지불한다.
2. 높은 내구성과 가용성
내가 올린 데이터를 여러 저장소에 저장하기에 물리적으로 문제가 생긴다해도 내 파일의 무결성을 보장한다.
3. 보안
데이터는 전송 중이나 저장 중일 때도 암호화된다.
4. 간편한 데이터 관리
데이터 라이프 사이클 관리, 자동 아카이빙 등 다양한 기능을 통해 데이터를 쉽게 관리할 수 있다.
S3를 사용하기 앞서서, AWS 콘솔에 접근해서
1.버킷을 생성하고,
2.IAM 계정을 생성해야한다.
1. AWS S3 버킷 설정
AWS Management Console에 로그인.
S3 서비스로 이동하여 Create bucket을 클릭


버킷 이름을 입력하고, 이후 설정은 기본값으로 두고, Create bucket을 클릭하여 버킷을 생성.


매우 손쉽게 버킷을 만들수 있다.
2. IAM 사용자 생성 및 권한 설정
IAM 서비스로 이동하여 Users(사용자)를 클릭한 다음, Add user(사용자 생성)를 클릭


사용자 이름을 얼추 입력하고 Attach existing policies directly(직접 정책 연결)를 선택하고, AmazonS3FullAccess 정책을 체크

생성된 iam 유저를 보면




액새스 키와 옆에 비밀 액세스 키를 받았을것이다.
JAVA에서 구현해보기
gradle에 의존성 추가
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
yaml 추가하기
cloud:
aws:
credentials:
access-key: 액세스키
secret-key: 비밀엑시스 키
bucket : danbam
region:
static: (리전명)us-east-2
stack:
auto: false
Config 파일 추가
@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 AmazonS3 s3client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
return AmazonS3ClientBuilder.standard()
.withRegion(Regions.fromName(region))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();
}
}
서비스 추가
@RequiredArgsConstructor
public class S3Service {
@Value("${cloud.aws.bucket}")
private final String bucketName;
private final AmazonS3 s3client;
// 이미지 업로드
public String uploadFile(MultipartFile file) {
String fileName = file.getOriginalFilename();
try {
s3client.putObject(new PutObjectRequest(bucketName, fileName,
file.getInputStream(), null)
.withCannedAcl(CannedAccessControlList.PublicRead));
return s3client.getUrl(bucketName, fileName).toString();
} catch (IOException e) {
e.printStackTrace();
return "업로드 실패";
}
}
// 이미지 조회
public byte[] downloadFile(String fileName) {
S3Object s3object = s3client.getObject(bucketName, fileName);
S3ObjectInputStream inputStream = s3object.getObjectContent();
try {
byte[] content = IOUtils.toByteArray(inputStream);
return content;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
컨트롤러 추가
@RestController
public class S3Controller {
@Autowired
private S3Service s3Service;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
return s3Service.uploadFile(file);
}
@GetMapping("/download/{fileName}")
public ResponseEntity<byte[]> downloadFile(@PathVariable String fileName) {
byte[] data = s3Service.downloadFile(fileName);
return ResponseEntity.ok()
.contentType(MediaType.IMAGE_JPEG)
.body(data);
}
}
여기까지 s3를 할당해서 java 에서 s3 기능을 사용하는 것까지의 실습을 해보앗다!..
실질적으로 이미지를 올린 뒤에


이미지를 올린것이 확인가능하다.
s3의 비용정산은, 얼마나 많은 양의 파일을 얼마나 오래 저장하느냐 + 얼마나 많은 사람들이 자주 이미지를 호출 했느냐 2가지에 의해서 비용이 정산된다.
'Java' 카테고리의 다른 글
Cloudfront 의 이미지를 특정 서버에서만 호출하도록 하기 (0) | 2024.05.16 |
---|---|
Aws S3와 CloudFront 를 연계해보자 (0) | 2024.05.14 |
React + SpringBoot 를 사용해서 채팅을 구현해보자. WebSocket, Stomp (0) | 2024.03.21 |
JWT를 이용한 Access Token과 Refresh Token 발행 및 유효성 검사 (0) | 2024.01.18 |
ControllerAdvice을 활용해 전역 CustomException을 설정하자 (0) | 2024.01.15 |