순서
1. 방향성
2. 날짜 경로를 문자열로 얻기
3. 폴더 생성(File 객체 사용)
4. 테스트
1. 방향성
저는 기본적으로 C:\upload 경로에 이미지 파일을 저장했습니다.
C 경로에 upload 폴더를 생성합니다.
더불어 설정한 용량을 초과하는 파일들을 C:\upload 경로에 있는 temp 폴더에 저장되도록 설정하는 코드를 추가했기 때문에 upload 폴더 내에 temp 폴더를 생성했습니다.
업로드될 이미지 파일들을 C:\upload 폴더에 저장시켜도 상관없지만, 매우 많은 파일을 한 곳에 업로드할 경우, 업로드된 이미지를 호출할 때 애플리케이션 내에서 호출한 파일을 찾기 위해 upload 전체를 스캔하게 되는데, 그 과정에서 많은 자원이 소모될 수 있습니다.
이러한 문제점을 보완하기 위해 업로드 한 날짜에 맞게 폴더가 생성되고, 생성된 폴더에 업로드 파일이 저장되도록 했습니다.
업로드를 수행하는 url 매핑 메서드(uploadAjaxActionPOST)에 파일을 저장할 기본적인 경로를 String 타입의 변수로 선언하고 초기화합니다.
String uploadFolder = "C:\\upload";
2. 날짜 경로를 문자열로 얻기
Java에서 제공하는 File이란 클래스를 통해 폴더를 생성해줬습니다. 이렇게 폴더를 생성하는 명령을 하기 위해선 생성할 폴더의 전체 경로의 String 데이터가 필요합니다.
기본적인 경로 "C:\\upload"는 변수로 선언되어 있기 때문에 하위 경로인 "yyyy/MM/dd" 문자열(String) 데이터가 필요합니다.
오늘 날짜 "yyyy/MM/dd" 형식의 String 데이터를 얻기 위해 SimpleDateFormat 클래스와 Date 클래스를 사용했습니다.
Date 클래스
오늘의 날짜를 얻기 위해 사용했습니다.
SimpleDateFormat 클래스
Date 클래스를 통해 얻은 오늘의 날짜를 지정된 형식의 문자열 데이터로 생성하기 위해 사용했습니다.
간단히 설명하면, SimpleDateFormt 클래스는 날짜 데이터를 지정된 문자열 형식으로 변환하거나 날짜 문자열 데이터를 날짜 데이터로 변환할 수 있게 해주는 클래스입니다.
SimpleDateFormat을 사용하기 위해 아래와 같이 변수를 선언하고 인스턴스화 하여 초기화합니다. 인스턴스화 하는 코드의 파라미터에는 자신이 날짜 데이터를 어떤 형식의 문자열로 변환할지 지정하는 값을 삽입합니다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
오늘의 날짜 데이터를 얻기 위해 Date 클래스 타입의 변수를 선언 및 초기화합니다.
// 날짜 경로 폴더
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 오늘의 날짜 데이터를 얻기 위해서 Date 클래스 타입의 변수를 선언 및 초기화
Date date = new Date();
오늘의 날짜 데이터 값을 가지고 있는 date 변수를 "yyyy-MM-dd" 형식의 문자열로 변환하기 위해 SimpleDateFormat 클래스의 format 메서드를 호출합니다. format 메서드의 인자 값으로 date 변수를 부여하고 String 타입으로 변환된 값을 String 타입의 str 변수로 선언하여 대입합니다.
String uploadFolder = "C:\\upload";
// 날짜 경로 폴더
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 오늘의 날짜 데이터를 얻기 위해서 Date 클래스 타입의 변수를 선언 및 초기화
Date date = new Date();
// 오늘의 날짜 데이터 값을 가지고 있는 date 변수를 "yyyy-MM-dd" 형식의 문자열로 변환을 해주기 위해서
// SimpleDateFormat의 format 메서드를 호출
String str = sdf.format(date);
위의 str 데이터엔 년, 월, 일 사이에 '-'가 들어있습니다. '-'를 경로 구분자인 '/'(리눅스) 혹은 '\'(윈도)로 변경해주어야 합니다.
str 데이터에서 '-' 값만 변경하기 위해 String 클래스가 가지고 있는 replace 메서드를 사용했습니다.
File 클래스엔 실행되는 환경에 따라 그에 맞는 경로 구분자를 반환하는 정적(Static) 변수인 separator가 있습니다. str 변수의 값의 문자열 중 '-'을 String 클래스의 replace 메서드를 사용하여 File.separator로 변경해 주는 코드를 작성합니다.
String uploadFolder = "C:\\upload";
// 날짜 경로 폴더
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 오늘의 날짜 데이터를 얻기 위해서 Date 클래스 타입의 변수를 선언 및 초기화
Date date = new Date();
// 오늘의 날짜 데이터 값을 가지고 있는 date 변수를 "yyyy-MM-dd" 형식의 문자열로 변환을 해주기 위해서
// SimpleDateFormat의 format 메서드를 호출
String str = sdf.format(date);
String datePath = str.replace("-", File.separator);
3. 폴더 생성(File 객체 사용)
폴더를 생성하기 위해 File 클래스를 사용했습니다.
File 클래스는 Java에서 '파일' 혹은 '디렉터리'에 관한 작업을 할 수 있도록 여러 메서드와 변수를 제공하는 클래스입니다.
File 타입의 uploadPath 변수를 선언하고, 만들고자 하는 "C:\upload\yyyy\MM\dd" 경로의 디렉터리를 대상으로 하는 File 객체로 초기화합니다.
객체화를 해주는 코드의 첫 번째 인자엔 부모 경로인 uploadFolder 변수를, 두 번째 인자엔 자식 경로인 datePath 변수를 부여했습니다.
/* 폴더 생성(File 객체 사용) */
File uploadPath = new File(uploadFolder, datePath);
폴더 생성을 수행하기 위해 File 클래스의 mkdir() 메서드 또는 mkdirs() 메서드를 사용할 수 있습니다.
두 메서드는 폴더를 생성한다는 것이 동일하지만 한 개의 폴더를 생성할 것이냐 여러 개의 폴더를 생성할 것이냐의 차이가 있습니다.
저는 여러 개의 폴더를 생성하기 위해 mkdirs() 메서드를 사용했습니다.
폴더가 이미 존재하는 상황에도 사용자가 업로드를 할 때마다 폴더를 생성하는 코드가 무조건 실행되는 것을 방지하기 위해 File 클래스에서 대상 파일 혹은 디렉터리가 존재하는지의 유무를 반환하는 exists() 메서드를 활용하여 if 문을 작성했습니다.
if (uploadPath.exists() == false) {
// 여러개의 폴더를 생성해야 하기 때문에 mkdirs() 메서드를 사용
uploadPath.mkdirs();
}
4. 테스트
상품 등록 페이지에서 이미지 파일을 선택하여 "C:\upload" 경로에 날짜 경로 폴더가 생성되는지 확인해봅니다.
'😎 STS3 Spring 쇼핑몰' 카테고리의 다른 글
STS3 쇼핑몰 프로젝트[24] 상품 이미지 업로드(썸네일 생성 및 저장) - 5 (0) | 2022.09.26 |
---|---|
STS3 쇼핑몰 프로젝트[24] 상품 이미지 업로드(파일 저장) - 4 (0) | 2022.09.25 |
STS3 쇼핑몰 프로젝트[24] 상품 이미지 업로드(파일 서버 전송) - 2 (0) | 2022.09.25 |
STS3 쇼핑몰 프로젝트[24] 상품 이미지 업로드(파일 서버 전송) - 1 (0) | 2022.08.04 |
STS3 쇼핑몰 프로젝트[24] 상품 이미지 업로드(준비 작업) (0) | 2022.08.04 |