Kim VamPa

[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(저장 폴더 생성) - 3 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(저장 폴더 생성) - 3

Kim VamPa 2021. 5. 10. 10:00
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

목표

첨부 파일 저장 폴더 생성

 이번 포스팅에선 첨부파일을 보관할 폴더를 생성하는 코드를 작성하는 것이 목표입니다.

 

순서

1. 방향

2. 날짜 경로 문자열 얻기

3. 폴더 생성(File 객체 사용)

4. 테스트

 

 

1.  방향

 이번 포스팅에서는 업로드한 이미지가 저장될 폴더를 생성하는 작업을 진행하고자 합니다. 저의 목표는 기본적으로 "c/upload"경로에 파일을 저장할 것입니다.

 

 C경로에 upload 폴더를 만들어줍니다.

 

그림 1-1

 

 더불어 우리가 설정한 용량을 초과하는 파일들을 c/upload 경로에 있는 temp 폴더에 저장되도록 설정하는 코드를 추가하였었습니다. 따라서 upload폴더에 temp폴더를 생성해줍니다.

 

그림 2

 

 

 업로드 될 파일들을 단순히 "c/upload" 폴더에 저장시켜도 상관은 없습니다. 하지만 매우 많은 파일을 한 곳에 업로드를 할 경우 앞으로 구현할 업로드된 이미지를 호출할 때 애플리케이션 내에서 호출한 파일을 찾기 위해 upload폴더를 전체를 스캔을 하게 되는데 그 과정에서 자원이 많이 소모될 수 있습니다. 더불어 파일을 관리하는 측면에서도 너무 많은 파일이 한 곳에 모여있으면 어려움이 있습니다.

 

 이러한 문제점을 보완하기 위해서 업로드 하는 날짜에 맞게 폴더가 생성되고, 생성된 폴더에 업로드 파일을 저장되도록 할 것입니다. 예를 들어 '2021년 05월 10일' 날짜의 경우 c/upload 경로에 '2021/05/10' 경로의 폴더가 생성되도록 할 것입니다.

 

 

 

 본격적으로 시작하기 앞서서 업로드를 수행하는 url 매핑 메서드(uploadAjaxActionPOST)에 파일을 저장할 기본적 경로를 저장하는 String 타입의 변수를 선언하고 초기화합니다. (넘어오는 파일들의 정보를 보기 위해 작성했던 logger 메서드는 지워줍니다.)

 

※ 저의 경우 윈도우를 사용하기 때문에 경로에 \를 사용하였습니다. ( 운영체제 따른 경로 문자 '경로' 위키피디아 참고)

 

String uploadFolder = "C:\\upload";

 

 

 

2. 날짜 경로 문자열 얻기

 우리는 Java에서 제공하는 File이라는 클래스를 통해서 폴더를 생성해 줄 것입니다. 하지만 폴더를 생성하는 명령을 수행하기 위해선 생성할 폴더의 전체 경로의 String 데이터가 필요로 합니다. 일단 기본적인 경로인 "c:\\upload"는 변수로 선언이 되어 있기 때문에 하위 경로인 "yyyy/MM/dd" 문자열(String) 데이터가 필요로 합니다.  따라서 오늘 날짜의 "yyyy/MM/dd" 문자열 데이터를 생성하도록 코드를 작성해보겠습니다.

 

 오늘 날짜의 'yyyy/MM/dd ' 형식의 String 데이터를 얻기 위해서 SimpleDateFormat 클래스와 Date 클래스를 사용 할 것입니다. 

 

 Date 클래스를 오늘의 날짜를 얻기 위해서 사용을 합니다.

 

 SimpleDateForamt은 Date 클래스를 통해 얻은 오늘의 날짜를 지정된 형식의 문자열 데이터로 생성하기 위해서 사용을 합니다. SimpleDateFormat에 대해서 간략히 설명을 하면 날짜 데이터를 지정된 문자열 형식으로 변환하거나 날짜 문자열 데이터를 날짜 데이터로 변환할 수 있게 해주는 클래스입니다.

 

 SimpleDateFormat을 사용하기 위해서 아래와 같이 변수를 선언하고 인스턴스화 하여 초기화해줍니다. 인스턴스화 하는 코드의 파라미터에는 자신이 날짜데이터를 어떠한 형식의 문자열로 변환할 지 지정해주는 값을 삽입합니다. ( 다양 한 예시는 다음의 홈페이지를 참고해주세요. www.javatpoint.com/java-simpledateformat)

 

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

 

 오늘의 날짜 데이터를 얻기 위해서 Date 클래스 타입의 변수를 선언 및 초기화 해줍니다.

 

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		Date date = new Date();

 

 오늘의 날짜 데이터 값을 가지고 있는 date 변수를 "yyyy-MM-dd" 형식의 문자열로 변환을 해주기 위해서 SimpleDateFormat의 format 메서드를 호출합니다. format 메서드의 인자 값으로 date 변수를 부여합니다. String 타입으로 변환된 값을 String 타입의 str 변수를 선언하여 대입합니다.

 

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		Date date = new Date();
		
		String str = sdf.format(date);

 

 지금 str의 데이터는 년, 월, 일 사이에 '-'이 작성되어 있습니다. 예를 들어서 2021년 05월 10일일 경우에는 str 변수에는 '2021-05-10' 문자열 데이터가 저장되어 있을 것입니다.  '-'을 경로 구분자인 '/'(리눅스) 혹은 '\'(윈도)로 변경해주어야 합니다. 

 

 str 데이터에서 '-' 값만 변경해주기 위해서 String 클래스가 가지고 있는 replace 메서드를 사용할 것입니다.

 

 우리는 애플리케이션이 실행되는 운영체제 환경에 따라 그에 맞는 경로 구분자가 작성되도록 해주어야 합니다. 편리하게도 File 클래스에서 실행되는 환경에 따라 그에 맞는 경로 구분자를 반환하는 정적(static) 변수인 separator가 있습니다. 따라서 str 변수의 값의 문자열 중 '-'을 String 클래스의 replace 메서드를 사용하여 File.separator로 변경해주는 코드를 작성합니다.

 

그림 2-1

 

 

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		Date date = new Date();
		
		String str = sdf.format(date);
		
		String datePath = str.replace("-", File.separator);

 

 

 

3. 폴더 생성(File 객체 사용)

 폴더를 생성하기 위해서 File 클래스를 사용을 할 것인데, File 클래스의 역할에 대해 간략히 설명을 하면 Java에서 '파일' 혹은 '디렉터리'에 관한 작업을 할 수 있도록 여러 메서드와 변수를 제공해주는 클래스입니다.

 

 File 타입의 uploadpath 변수를 선언하여 우리가 만들고자 하는 "c:\upload\yyyy\MM\dd' 경로의 디렉터리를 대상으로 하는 File 객체로 초기화해줍니다. 객체화해주는 코드에 첫 번째 인자로 부모 경로엔 uploadFoler 변수를 두 번째 인자로 자식 경로인 datePath 변수를 부여해줍니다.

 

		File uploadPath = new File(uploadFolder, datePath);

 

 폴더를 생성을 수행하기 위해서 File 클래스의 mkdir() 혹은 mkdirs()를 사용할 수 있습니다. 두 메서드는 폴더를 생성한다는 것을 동일 하지만 한 개의 폴더를 생성할 수 있느냐 여러 개의 폴더를 생성할 수 있느냐의 차이가 있습니다. 우리는 여러개의 폴더를 생성해야 하기 때문에 mkdirs() 메서드를 사용합니다.

 

		File uploadPath = new File(uploadFolder, datePath);
		
		uploadPath.mkdirs();

 

 그런데 작성한 코드를 그대로 사용하게 된다면 폴더가 이미 존재하는 상황에도 사용자가 업로드를 할 때마다 폴더를 생성하는 코드가 무조건 실행을 하게 됩니다. 이를 방지하기 위해서 File 클래스에서 대상 파일 혹은 디렉터리가 존재하는지 유무를 반환하는 exists() 메서드를 활용하여 if문을 작성을 하고 if구현부에 폴더를 생성하는 코드를 작성해줍니다.

 

		/* 폴더 생성 */
		File uploadPath = new File(uploadFolder, datePath);
		
		if(uploadPath.exists() == false) {
			uploadPath.mkdirs();
		}

 

그림 3-1

 

 

 

4. 테스트

 상품 등록 페이지에 아무 이미지 파일을 선택을 하여 "c:\uplad"경로에 날짜 경로 폴더가 생성이 되었는지 확인해봅니다.

 

그림 4-1

 

그림 4-2

 

REFERENCE

 

DATE

  • 2020.05.10
728x90
반응형
Comments