1. 개요

TempFileCleanJob 클래스는 시스템에서 주기적으로 임시 파일을 삭제하는 스케줄 작업을 수행하는 Java 클래스입니다. 이 작업을 통해 불필요한 임시 파일을 삭제함으로써 디스크 공간을 확보하고 시스템 성능을 유지할 수 있습니다. Spring Framework와 Quartz Scheduler를 사용하여 주기적인 파일 정리 작업을 자동화합니다.

2. 내용

TempFileCleanJob 클래스는 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  • Quartz Scheduler와의 통합: @DisallowConcurrentExecution 어노테이션을 사용하여 동시에 여러 작업이 실행되지 않도록 보장합니다.
  • Spring Framework 의존성 주입: @Autowired 어노테이션을 사용하여 필요한 서비스(ErrorUtil, FileService, EnvDRSoftLoader)를 주입받아 사용합니다.
  • 파일 삭제 로직:
    • 지정된 날짜 이전의 임시 파일을 검색하고, 해당 파일을 물리적으로 삭제합니다.
    • 삭제된 파일의 메타 데이터를 데이터베이스에서 제거합니다.
    • FileUtils와 FileDeleteStrategy를 사용하여 파일을 강제로 삭제하며, 삭제 작업 중 발생할 수 있는 예외를 로깅합니다.

3. 코드

package kr.co.drsoft.job;

import kr.co.drsoft.consts.EnvDRSoftLoader;
import kr.co.drsoft.module.common.FileService;
import kr.co.drsoft.util.ErrorUtil;
import kr.co.drsoft.util.Lists;
import kr.co.drsoft.vo.cmm.PageVo;
import kr.co.drsoft.vo.req.ReqTmpFileLstVo;
import kr.co.drsoft.vo.res.ResTmpFileVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileDeleteStrategy;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;
import java.util.Date;
import java.util.Locale;

@Slf4j
@Component
@DisallowConcurrentExecution
public class TempFileCleanJob extends JobInterface {

    @Autowired
    private ErrorUtil errorUtil;

    @Autowired
    private FileService fileService;

    @Autowired
    private EnvDRSoftLoader envDRSoftLoader;

    @Override
    @Transactional
    public void start(JobExecutionContext context) throws Exception {

        Date endDtObj = DateUtils.parseDate(
                DateFormatUtils.format(new Date(), "yyyy-MM-dd"),
                Locale.KOREAN,
                "yyyy-MM-dd"
        );

        ReqTmpFileLstVo reqTmpFileLstVo = ReqTmpFileLstVo.builder()
                .startDt(
                        DateUtils.parseDate(
                                DateFormatUtils.format(DateUtils.addDays(new Date(), -1), "yyyy-MM-dd"),
                                Locale.KOREAN,
                                "yyyy-MM-dd"
                        )
                )
                .endDt(endDtObj)
                .build();

        PageVo pageVo = reqTmpFileLstVo.getPage();
        pageVo.setLimitPageSize(1000);
        pageVo.init();

        Lists<ResTmpFileVo> resTempfileLst = fileService.getTmpFileLst(reqTmpFileLstVo);
        if (resTempfileLst == null) {
            return;
        }

        for (ResTmpFileVo resTmpFileVo : resTempfileLst) {
            // 파일 삭제
            File targetPhysicalFile = null;
            try {
                targetPhysicalFile = new File(envDRSoftLoader.getTempFilePath() + File.separator + resTmpFileVo.getFilePath());

                if (targetPhysicalFile != null && targetPhysicalFile.isFile()) {
                    FileUtils.forceDelete(targetPhysicalFile);
SELECT A.* FROM TB_TMP_FILE A
WHERE 1 = 1
AND reg_dt <![CDATA[<]]> #{endDt}

이 코드는 특정 날짜 이전에 등록된 모든 임시 파일의 메타 데이터를 삭제하기 위한 SQL 쿼리를 보여줍니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기