-
AWS에서 제공하는 S3를 통해 파일 입출력을 하게 되면 비용이 저렴하여 많은 회사에서 S3를 사용하고 있다.
이는 단순 이미지 파일업로드 뿐이 아니라 이력을 적재하여 잘못된 데이터를 추적하는 시스템 내에서도 활용이 가능하다.
간단히 AmazonS3를 주입하여 putObject(쓰기) , listObjects(읽기)를 사용해주면 된다
여기서 중요한 포인트는 파일을 위치를 어떻게 할지 , 업로드 시 압축을 어떻게 할지에 따라 비용 감축과 활용도가 달라진다는 점이다
위치의 경우 업무단위로 구분 후 생성날짜별로 저장하면 된다
예를 들면 취소라는 기능 수행 도중 S3에 파일업로드를 원한다면 S3 취소 폴더 내 금일 일자를 폴더를 만들고 거기에 해당 취소에 따른 고유 키 폴더를 만들면 될 것이다
압축의 경우 여러 압축방법이 있지만 GZIP을 통한 압축을 진행하였다
GZIP의 장점을 나열하면 아래와 같다
- 효율적인 압축률: Gzip은 파일의 크기를 상당히 줄일 수 있일수 있어 네트워크를 통해 데이터를 전송할 때 시간과 대역폭을 절약할 수 있다
- 널리 지원됨: Gzip은 많은 시스템과 프로그래밍 언어 지원한다
- 표준화: Gzip은 RFC 1952에 의해 표준화되어 호완성과 안정성을 보장한다
- 스트림 압축 가능: 스트림에 대한 압축과 해제를 지원하므로 대용량 처리에 유용하다
- 체크섬 기능: Gzip은 압축된 데이터의 무결성을 검사하기 위한 체크섬 기능을 제공한다
public byte[] compressGzip(String data) { byte[] uncompressed =StringUtf8.toBytes(data); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); try (GZIPOutputStream zipOut = new GZIPOutputStream(out)) { //stream을 통한 압축 StreamUtils.copy(uncompressed, zipOut); } return out.toByteArray(); } catch (IOException e) { throw new IllegalArgumentException(e.getMessage(), e); } }
이제 이를 활용하여 업로드를 해보자
private void upload(String data){ byte[] gzipBytes =compressGzip(data); InputStream inputStream= new ByteArrayInputStream(gzipBytes); ObjectMetaData metaData = new ObjectMeteData(); metaData.setContentType("application/x-gzip"); metaData.setContentLength(gzipBytes.length); PutObjectRequest putObjectRequest = new PutObjectRequest(); putObjectRequest.withBucketName("public"); putObjectRequest.withKey("취소_주문_OrderInfo"); putObjectRequest.withInputStream(inputStream); putObjectRequest.withMetadata(metaData); s3Client.putObject(putObjectRequest); }
읽기의 경우는 앞에서 정의한 폴더 생성 규칙에 따라 해당 위치를 콜만 하면 된다
public InputStream ReadS3(){ String bucketName ="public"; String path ="취소_주문_OrderInfo"; S3Object S3Object= s3Client.getObject(bucketName,path); return S3Object.getObjectContent(); }
'개발 > AWS' 카테고리의 다른 글
dynamodb write (0) 2024.08.20 카프카 (0) 2022.03.13 DynamoDB 활용기 (0) 2021.12.28 DynamoDB (0) 2021.12.16 Athena (0) 2021.12.16