[TIL] 230816 URL 저장 ➡️ 파일명만 저장

CountryGirl·2023년 8월 16일
0

TIL

목록 보기
45/80

📌 문제점 & 시도 & 해결

👿 문제점

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에서 원래 uploaderFileURLsreturn해주었다.
나는 왜 uploaderFileURLsreturn해야한다는 거에 집착을 했는지 이 returnuploaderFileURLs이 아닌 그냥 fileNames을 했으면 됐는데......

uploaderFileURLsreturn 하면 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이미지명만 returncreate에서는 URL이 필요없고,
get에서 prefix를 더하면 URL을 만들 수 있기때문에
images 테이블 저장URL 저장이미지 원본 파일명 + 난수 저장중복되는 데이터가 많아 쓸 데 없이 데이터가 길다.
profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글