public List<String> saveFiles(List<MultipartFile> files) throws RuntimeException {
  if (files == null || files.isEmpty())
    return Collections.EMPTY_LIST;
 
  List<String> uploadNames = new ArrayList<>();
 
  files.stream().forEach(file -> {
    String savedName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
    Path savePath = Paths.get(uploadPath, savedName);
    try {
      Files.copy(file.getInputStream(), savePath, StandardCopyOption.REPLACE_EXISTING);
      uploadNames.add(savedName);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  });
 
  return uploadNames;
public List<String> saveFiles(List<MultipartFile> files) throws RuntimeException {
  if (files == null || files.isEmpty())
    return Collections.EMPTY_LIST;
 
  return files.stream().map(this::uploadFile).toList();
}
 
private String uploadFile(MultipartFile file) throws RuntimeException {
  if (file == null || file.isEmpty())
    throw new RuntimeException("File is empty");
 
  String savedName = UUID.randomUUID() + "_" + file.getOriginalFilename();
  Path savePath = Paths.get(uploadPath, savedName);
  try {
    // 파일 복사
    Files.copy(file.getInputStream(), savePath, StandardCopyOption.REPLACE_EXISTING);
 
    // 썸네일 처리 - MIME 유형으로 이미지 확인 후 복사
    if (file.getContentType() != null && file.getContentType().startsWith("image/")) {
      Path thumbnailPath = Paths.get(uploadPath, "s_" + savedName);
      Thumbnails.of(savePath.toFile()).size(200, 200).toFile(thumbnailPath.toFile());
    }
  } catch (IOException e) {
    throw new RuntimeException(e);
  }
  return savedName;
}
    public ResponseEntity<Resource> getFile(String fileName) {
        Resource resource = new FileSystemResource(uploadPath + File.separator + fileName);
        if (!resource.isReadable())
            resource = new FileSystemResource(uploadPath + File.separator + "default.ico");
 
        HttpHeaders headers = new HttpHeaders();
        try {
            headers.add("Content-Type", Files.probeContentType(resource.getFile().toPath()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
 
        return ResponseEntity.ok().headers(headers).body(resource);
    }