Kim VamPa

[Spring][쇼핑몰 프로젝트][29] 상품 이미지 수정 - 8(배치 프로그램 적용 5) 본문

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

[Spring][쇼핑몰 프로젝트][29] 상품 이미지 수정 - 8(배치 프로그램 적용 5)

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

 

목표

DB에 정보가 존재하지 않는 이미지 파일 삭제 작업 구현

 앞선 포스팅에서 테스트 한 코드를 활용하여 최종적으로 하루에 한 번 일괄적으로 DB에 정보가 존재하지 않는 이미지 파일을 삭제하는 코드를 작성할 것입니다.

 

순서

1. 배치(Batch) 작업 클래스 생성

2. 이미지 파일(DB 존재X) 삭제 코드 작성

3. 테스트

 

 

 

 

1. 배치(Batch) 작업 클래스 생성

 com.vam.task 패키지에 AttachFileCheckTask 클래스를 생성합니다.

 

그림 1-1

 

 

해당 클래스 파일을 열어 @Log4j, @Component 어노테이션을 추가해주고, AdminMapper클래스를 의존성 주입해줍니다.

 

 

 

2. 이미지 파일(DB 존재 X) 삭제 코드 작성

 AttachFileCheckTask 클래스 구현부에 아래의 코드를 추가해줍니다. 매일 새벽 1시에 배치 프로그램이 수행하도록 cron 값을 부여하였습니다.

 

	private String getFolderYesterDay() {
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar cal = Calendar.getInstance();
		
		cal.add(Calendar.DATE, -1);
		
		String str = sdf.format(cal.getTime());
		
		return str.replace("-", File.separator);
	}	
	
	@Scheduled(cron="0 0 1 * * *")
	public void checkFiles() throws Exception{	
		
		log.warn("File Check Task Run..........");
		log.warn(new Date());
		log.warn("========================================");		
		
		// DB에 저장된 파일 리스트
		List<AttachImageVO> fileList = mapper.checkFileList();		
		
		
		// 비교 기준 파일 리스트(Path객체)
		List<Path> checkFilePath = new ArrayList<Path>();
			//원본 이미지
		fileList.forEach(vo -> {
			Path path = Paths.get("C:\\upload", vo.getUploadPath(), vo.getUuid() + "_" + vo.getFileName());
			checkFilePath.add(path);
		});		
			//썸네일 이미지
		fileList.forEach(vo -> {
			Path path = Paths.get("C:\\upload", vo.getUploadPath(), "s_" +  vo.getUuid() + "_" + vo.getFileName());
			checkFilePath.add(path);
		});
		
		
		// 디렉토리 파일 리스트
		File targetDir = Paths.get("C:\\upload", getFolderYesterDay()).toFile();
		File[] targetFile = targetDir.listFiles();
		
		
		// 삭제 대상 파일 리스트(분류)
		List<File> removeFileList = new ArrayList<File>(Arrays.asList(targetFile));		
		for(File file : targetFile){
			checkFilePath.forEach(checkFile ->{
				if(file.toPath().equals(checkFile)) 
					removeFileList.remove(file);	
			});
		}
		
		
		// 삭제 대상 파일 제거
		log.warn("file Delete : ");
		for(File file : removeFileList) {
			log.warn(file);
			file.delete();
		}		
		
		log.warn("========================================");
		
	}

 

그림 2-1

 

 

3. 테스트

 서버를 구동시켜서 이미지 파일을 삭제하는 배치 프로그램이 정상적으로 동작하는지를 확인해보겠습니다. 구동시키기 앞서서 어제자 날짜의 폴더를 생성 후, 해당 폴더에 삭제시킬 이미지 파일들을 추가해줍니다.

 

그림 3-1

 

 

 배치 프로그램이 매일 새벽 1시에 동작하도록 cron 값을 설정하였는데 테스트를 위해 1분에 한 번씩 실행이 되도록 값을 변경하였습니다.

 

그림 3-2

 

 

 서버를 구동시켜 테스트를 합니다.

 

그림 3-3

 

그림 3-4

 

 

REFERENCE

  • 코드로배우는 스프링 웹 프로젝트(남가람북스)
  •  

 

 

 

DATE

  • 2020.07.30

 

728x90
반응형
Comments