본문 바로가기

1.프로그래밍/Java

[Spring Boot] MultipartResolver 파일 업로드 - 2 (Date 폴더 생성, UUID)

728x90
반응형

[Spring Boot] MultipartResolver 파일 업로드 - 2 (Date 폴더 생성, UUID)

참고 블로그 VamPa


한 폴더에 수만개의 파일이 업로드 되었다고 가정을 한다.

그렇다면 한 파일을 찾기위해 많은 파일들을 뒤져야 된다는 문제가 생긴다.

그래서 현제 날짜에 따라 폴더를 생성하고 그 이후 그 폴더에 저장하는 방식을 구현한다.

그리고 만약 동일한 이름의 파일이 저장될 경우 덮어버리는 방식을 방지하기 위해 UUID를 이용하여 파일 이름을 변경해준다.

MultipartResolver 를 통한 간단한 파일 업로드 글은 전에 작성하였다.
이 글 또한 나의 공부, 정리 목적이므로 틀리거나 바뀐부분이 있을 수 있다.


[Spring Boot] MultipartResolver 파일 업로드 - 1(Gradle, Ajax)

1.현재 날짜 폴더 생성

2.UUID + fileName 으로 파일이름 변경

Controller

@RequestMapping(value = "uploadTest", method = RequestMethod.POST)
public void uploadTestPOST(MultipartFile[] uploadFile) {
        logger.info("uploadTestPOST............");

        String uploadFolder = "C:\\upload";

        /* 추가된 부분 ......... */
        SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        String formatDate = sdt.format(date);

        String datePath = formatDate.replace("-", File.separator);

        File uploadPath = new File(uploadFolder, datePath);

        if (uploadPath.exists() == false) {
            uploadPath.mkdirs();
        }
        /*..........*/

        for (MultipartFile multipartFile : uploadFile) {

            String uploadFileName = multipartFile.getOriginalFilename();
            File saveFile = new File(uploadFolder, uploadFileName);

            try {
                multipartFile.transferTo(saveFile);
            } catch (Exception e) {
                e.printStackTrace();
                }
            }
        }
    }

위의 추가된 코드에서 SimpleDateFormat 은 날짜 데이터를 지정된 문자열 형식으로 변환 해주거나 혹은 날짜 문자열 데이터를 날짜 데이터로 변환해준다.

코드로 확인하면 쉽게 이해가 된다.


public void test() {
    Date date = new Date();
    System.out.println("date = " + date);

    SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd");
    String formatDate = sdt.format(date);
    System.out.println("sdt = " + formatDate);

    String datePath = formatDate.replace("-", File.separator);
    System.out.println("datePath = " + datePath);
}


date = Fri Mar 25 22:11:03 KST 2022
sdt = 2022-03-25
datePath = 2022\03\25

이 처럼 날짜 데이터 파일이 String 형식으로 가공되어진다.

여기서 이제 봐야할 것은 datePath의 File.separator 이다.

각 운영체제마다 경고 구분자를 나타나내는 것이 다르다.

윈도우에서는 역슬래쉬, '' 이고,

리눅스 혹은 맥 환경에서는 정슬래쉬, '/' 이다.

그렇기에 File 클래스에서 실행되는 환경에 맞게 경로 구분자를 반환하는 separator 메서드를 사용한다.

위의 코드처럼 "-"로 나타나 있는 경로 구분자를 해당 메서드를 사용하여 변경하면 datePath가 완성된다.

UUID

먼저 UUID(Universally Unique IDentifier)란? 네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약이다.
이러한 식별자(일련번호)를 사용해서 파일 이름의 중복을 막아줄 수 있다.


@RequestMapping(value = "uploadTest", method = RequestMethod.POST)
public void uploadTestPOST(MultipartFile[] uploadFile) {
        logger.info("uploadTestPOST............");

        String uploadFolder = "C:\\upload";

        /* 추가된 부분 ......... */
        SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        String formatDate = sdt.format(date);

        String datePath = formatDate.replace("-", File.separator);

        File uploadPath = new File(uploadFolder, datePath);

        if (uploadPath.exists() == false) {
            uploadPath.mkdirs();
        }
        /*..........*/

        for (MultipartFile multipartFile : uploadFile) {

            String uploadFileName = multipartFile.getOriginalFilename();

            /* 변경 위치 ............. */
            String uuid = UUID.randomUUID().toString();
            uploadFileName = uuid + "_" + uploadFileName;

            File saveFile = new File(uploadPath, uploadFileName);
            /*.................*/

            try {
                multipartFile.transferTo(saveFile);
            } catch (Exception e) {
                e.printStackTrace();
                }
            }
        }
    }

위의 코드에선 Java에서도 UUID라는 클래스를 통해 UUID를 사용 할 수 있다.
주의할 점은 UUID.randomUUID()를 통해 생성된 식별자는 UUID타입의 데이터이기 때문에 toString() 으로 String으로 변환해주어야 사용 가능하다.

그리고 파일의 저장될 위치를 위해서 설정했던 uploadPath로 설정하였다.

실행 결과

image


Success!!

위의 해당 파일 경로를 보면 오늘자 2022.03.25로 설정되어있고,
파일의 이름 또한 UUID + OriginalFileName 으로 생성되어있다.

이로서 이번 글을 마치겠다.

728x90
반응형