API를 테스트할 때 들어오는 모든 이미지들이 버킷아래로 바로 생성이 되어서
/images 라는 폴더 안에 요청별로 폴더가 생성되고 생성된 폴더 안에 이미지가 저장되도록 하였다.
이렇게 저장을 하면 더 관리하기 좋지 않을까? 라는 생각에...
원래는 폴더명이 겹치면 안되기 때문에 UUID.randomUUID()로 랜덤값을 생성하였고 그 곳 이미지를 저장하도록 했다.
Setting
- Post Entity
@Column(nullable = false) @ElementCollection private List<String> imageUrls;이렇게 imageUrls 테이블이 생기도록 하였다. 또, 저장을 할 때, imageName이 아닌 imageUrl을 저장하도록 했다.
S3 Bucket
ㄴ images
ㄴ 9fce5f5f-3967-4001-83d7-a6ca8cddd06c/
| ㄴ image(1).png
| ㄴ image(2).png
| ㄴ image(3).png
|
ㄴ 5cffe55q-2256-1987-23a0-q2wh7cdnm67k/
ㄴ image(1).png
ㄴ image(2).png
ㄴ image(3).png
이미지 또한 겹치면 안되기 때문에 이미지명에도 UUID를 붙여주었다.
(+ 지금은 수정된 상태 230818)
폴더명: UUID.randomUUID()
public String getRequestFolderNameFromImageUrl(String imageUrl) {
try {
URL pasedUrl = new URL(imageUrl);
String path = pasedUrl.getPath();
String dir = path.substring(0, path.lastIndexOf("/") + 1).substring(8);
return dir;
} catch (MalformedURLException e) {
System.out.println("e.getMessage() = " + e.getMessage());
}
return null;
}
이미지 테이블에는 S3에 저장된 이미지 URL이 저장된다.
그래서 URL에서 다시 폴더만 가져와야했다.
그래서 폴더이름을 가져오는 메서드를 만들었다.
https://action-boss-bucket.s3.ap-northeast-2.amazonaws.com/images/%5B1%5D_9fce5f5f-3967-4001-83d7-a6ca8cddd06c/KakaoTalk_Photo_2023-08-03-21-05-33-11664136983707980072.png
이렇게 생긴 URL에서 폴더이름을 뽑아온다.
deleteFolder()그리고 폴더를 삭제할 수 있도록 deleteFolder() 를 만들었다.
public void deleteFolder(String requestFolderName) {
ObjectListing objectListing = amazonS3Client.listObjects(s3Bucket, "images/" + requestFolderName);
List<DeleteObjectsRequest.KeyVersion> keyVersions = new ArrayList<>();
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
keyVersions.add(new DeleteObjectsRequest.KeyVersion(objectSummary.getKey()));
}
if (!keyVersions.isEmpty()) {
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(s3Bucket).withKeys(keyVersions);
amazonS3Client.deleteObjects(deleteObjectsRequest);
}
}