Kim VamPa

[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(파일 저장) - 4 본문

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

[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(파일 저장) - 4

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

목표

첨부 파일 저장 폴더 생성

 업로드하고자 하는 파일을 저장하고, 저장된 파일들을 각각 고유 하게 관리하기 위해서 저장되는 파일에 UUID를 추가해주는 것을 목표로 합니다.

 

순서

1. 파일 저장

2. UUID

 

 

 

1.  파일 저장

 뷰로부터 전달 받은전달받은 파일을 지정한 폴더에 저장하기 위해서 MultipartFile 클래스의 transferTo() 메서드를 사용할 것입니다. 사용방법은 전달받은 파일인 MultipartFile 객체에 저장하고자 하는 위치를 지정한 File 객체를 파라미터로 하여 transferTo() 메서드를 호출하면 됩니다.

 

MultipartFile.transferTo(File detination);

 

  따라서 위의 메서드를 사용하기 위해서 저장될 파일 이름과 위치 전체를 포함하는 File 객체를 만들어주겠습니다. 파일 이름의 경우 뷰로부터 전달받은 파일 이름을 그대로 사용할 것이기 때문에 getOriginalFilename() 메서드를 사용할 것입니다. 파일의 경로는 저번 포스팅에서 작성해둔 uploadPath 변수를 사용합니다.

 

 File 객체를 만들어 주기 전 먼저 파일의 이름을 사용하기 위해 아래와 같이 String 타입의 uploadfileName 변수를 선언하여 파일 이름을 저장해줍니다.

 

			/* 파일 이름 */
			String uploadFileName = multipartFile.getOriginalFilename();	

 

 파일 저장 위치인 uploadPath와 파일 이름인 uploadFileName을 활용하여 아래와 같이 File 타입의 saveFile  변수를 선언하고 파일 경로와 파일 이름을 포함하는 File 객체로 초기화해줍니다.

 

			/* 파일 이름 */
			String uploadFileName = multipartFile.getOriginalFilename();			
			
			/* 파일 위치, 파일 이름을 합친 File 객체 */
			File saveFile = new File(uploadPath, uploadFileName);

 

 파일을 저장하는 메서드인 transferTo()를 호출합니다.

 

			/* 파일 이름 */
			String uploadFileName = multipartFile.getOriginalFilename();			
			
			/* 파일 위치, 파일 이름을 합친 File 객체 */
			File saveFile = new File(uploadPath, uploadFileName);
			
			/* 파일 저장 */
			multipartFile.transferTo(saveFile);

 

 transferTo() 경우 IOException와 IllegalStateException을 일으킬 가능성이 있기 때문에 컴파일러에서 try catch문을 사용하라는 경구 문이 뜹니다. 따라서 파일을 저장하는 코드를 try catch문으로 감싸줍니다.

 

그림 1-1

 

			/* 파일 이름 */
			String uploadFileName = multipartFile.getOriginalFilename();			
			
			/* 파일 위치, 파일 이름을 합친 File 객체 */
			File saveFile = new File(uploadPath, uploadFileName);
			
			/* 파일 저장 */
			try {
				multipartFile.transferTo(saveFile);
			} catch (Exception e) {
				e.printStackTrace();
			} 

 

그림 1-2

 

 

 모두 완료하였으면 서버를 구동시켜서 파일이 저장되는지 확인을 해봅니다.

 

그림 1-3

 

그림 1-4

 

 

 

 

2. UUID 적용

 위에서 업로드 구현을 완료하였습니다. 하지만 한 가지 문제가 있습니다. 동일한 이름을 가진 파일을 저장하게 되면 기존의 파일을 덮어씌워 버린다는 점입니다. 이러한 문제점을 보완하기 위해서 각 파일이 저장될 때 고유한 이름을 가지도록 하면 해결이 될 것입니다. 따라서 파일에 고유한 이름을 가지도록 하기 위해서 기존 파일 이름에 UUID가 포함되도록 할 것입니다. 

 

 UUID(범용 고유 식별자)는 쉽게 말해 국제기구에서 표준으로 정한 식별자(일련번호)라고 생각하시면 됩니다. UUID는 총 5개 버전이 있으며 각 버전에 따라 식별자 생성 방식이 다릅니다. 좀 더 자세히 알고 싶으신 분은 UUID 위키 백과를 참고하시면 됩니다

 

이를 Java에서도 UUID라는 클래스를 통해 구제기구에서 표준으로 정한 식별자를 사용할 수 있도록 하고 있습니다.  Java에서도 5개의 버전 방식으로 제공을 하고 있는데 그중 가장 쉽게 사용할 수 있는 버전 4(랜덤) 방식의 radomUUID() 메서드를 사용할 것입니다. 해당 메서드는 정적(static) 메서드 이기 때문에 UUID를 인스턴스화 하지 않고도 사용할 수 있습니다. 주의할 점은 UUID.randomUUID()를 통해 생성된 '식별자'는 UUID 타입의 데이터 이기 때문에 toString() 메서들 사용하여 String 타입으로 변경해주어야 우리가 사용할 수 있습니다.

 

그림 2-1

 

 이제 직접 적용해보겠습니다. 우리는 파일 이름을 "UUID_파일 이름"과 같은 방식으로 저장하도록 할 것입니다. 먼저 UUID를 저장할 String 타입의 변수 uuid를 선언하고 UUID로 초기화해줍니다.

 

			/* uuid 적용 파일 이름 */
			String uuid = UUID.randomUUID().toString();

 

 기존 파일 이름인 uploadFileName 변수를 "UUID_파일 이름" 형식이 되도록 변경해줍니다.

 

			/* uuid 적용 파일 이름 */
			String uuid = UUID.randomUUID().toString();
			
			uploadFileName = uuid + "_" + uploadFileName;

 

그림 2-2

 

  서버를 구동시켜서 uuid가 적용된 파일이 저장되는지 확인을 합니다.

 

그림 2-3

 

그림 2-4

 

 

REFERENCE

 

 

DATE

  • 2020.05.11
728x90
반응형
Comments