images Entity
를 따로 만들지 않고 Post Entity
에 @ElementCollection
로 테이블을 만들었다.
@Column(nullable = false)
@ElementCollection
private List<String> imageNames;
하지만 이것의 문제는 내가 원하는 column을 추가할 수는 있지만 따로 Entity
로 만들어서 관리하는 것보다 불편할 것이다. 하지만 아직까지는 추가적인 column이 필요하다고 느끼지 못했다.
나는 조회를 할 때 URL로 해야하기 때문에 URL 전체를 저장했다. 저장할 때 이렇게 URL을 저장했더니 너무 중복되는 것이 많았고, 너무 데이터가 길었다.
앞에 중복되는 것은 내가 따로 붙여줄 수 있다.
public List<String> upload(List<MultipartFile> multipartFiles, String dirName) throws IOException {
List<String> uploaderFileURLs = new ArrayList<>();
for (MultipartFile multipartFile : multipartFiles) {
// MultipartFile -> File 변환
File uploadFile = convert(multipartFile).orElseThrow(
() -> new IllegalArgumentException("파일 전환에 실패했습니다."));
String uploadedImageURL = upload(uploadFile, dirName);
uploaderFileURLs.add(uploadedImageURL);
}
return uploaderFileURLs;
}
나는 S3 upload
에서 원래 uploaderFileURLs
을 return
해주었다.
나는 왜 uploaderFileURLs
을 return
해야한다는 거에 집착을 했는지 이 return
을 uploaderFileURLs
이 아닌 그냥 fileNames
을 했으면 됐는데......
uploaderFileURLs
을 return
하면 substring()
으로 잘라서 저장을 하려고 했다.
그냥 바보같은 생각이었다.
public List<String> upload(List<MultipartFile> multipartFiles, String dirName) throws IOException {
List<String> fileNames = new ArrayList<>();
for (MultipartFile multipartFile : multipartFiles) {
// MultipartFile -> File 변환
File uploadFile = convert(multipartFile).orElseThrow(
() -> new IllegalArgumentException("파일 전환에 실패했습니다."));
String fileName = uploadFile.getName();
upload(uploadFile, dirName);
fileNames.add(fileName);
}
return fileNames;
}
List<String> imageNames = images.stream().map(MultipartFile::getOriginalFilename).toList();
Post post = new Post(postRequestDto, imageNames, user);
postRepository.save(post);
// 요청별로 폴더생성 -> 저장
String directoryPath = "images/" + post.getPostId();
List<String> imageNameList = s3Service.upload(images, directoryPath);
post.setNames(imageNameList);
private List<String> imageUrlPrefix(List<String> imageNames, Long postId) {
return imageNames.stream()
.map(imageName -> s3Url + "/images/" + postId + "/" + imageName).toList();
}
변경 전 변경 후 이유 S3 업로드 리턴 URL return 이미지명만 return create에서는 URL이 필요없고,
get에서 prefix를 더하면 URL을 만들 수 있기때문에images 테이블 저장 URL 저장 이미지 원본 파일명 + 난수 저장 중복되는 데이터가 많아 쓸 데 없이 데이터가 길다.