태그 보관물: spring

SpringQuartz 스케쥴링 시간지정 방법

SpringQuartzSpring Framework안에서 @Scheduled 어노테이션을 통해서 Quartz에서 제공하는 cron schedule 기능을 활용하게 해주는 라이브러리.

시간지정 구조

초 분 시 일 월 요일 년도(옵션)

예제

  • 매일 오전 9시에 수행 : 0 0 9 * * ?
  • 매월 10일 오전 9시에 수행 : 0 0 9 10 * ?
  • 매주 일요일 오전 9시에 수행 : 0 0 9 ? * 1
  • 매월 두번째 일요일 오전 9시에 수행 : 0 0 9 ? * 1#2
    • [실행할 요일] # [N번째]
  • 매시간 10분 간격으로 수행 : 0 10 * * * ?
  • 매분 0초, 30초에 수행 : 0/30 * * * * ?
필드명 허용값 허용 특수키 비고
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / LW L : 월 중 마지막 일자
W : 작업요일(월-금)
1-12 또는 JAN-DEC , - * /
요일 1-7 또는 SUN-SAT , - * ? / L# # : “6#3” = 월 중 3번째 금요일
년도 빈칸 또는 1970-2099 , - * /

스프링 Single File Download Resolver

웹 프로젝트 개발을 하다보면 업로드한 파일을 다운로드하는 모듈을 요청 받을 때가 있다.
해당되는 파일을 컨트롤러에서 바로 구현을 해도 되겠지만, 스프링 ViewResolver로 구현을 하면 같은 프로젝트의 모든 개발들이 쉽게 사용할 수 있다.

스프링 ViewResolver는 AbstractView를 상속받아서 구현 할 수 있다.

FileDownViewResolver

@Component("fileDownLoadView")
public class FileDownView extends AbstractView{
  private FileInputStream fin = null;
  private BufferedInputStream bis = null;
  private ServletOutputStream sout = null;
  private BufferedOutputStream bos = null;

  @Override
  protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 다운로드 받을 때 저장할 파일명
    String fileName = (String) model.get("fileName");
    // 다운로드 받을 파일경로
    String filePath = (String) model.get("filePath");

    response.setContentType("application/octet-stream;");
    File file = new File(filePath);
    try{
      if(file.exists()){
        response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"),"ISO8859_1") + ";");

        byte buff[] = new byte[2048];
        int bytesRead;

        fin = new FileInputStream(file);
        bis = new BufferedInputStream(fin);
        sout = response.getOutputStream();
        bos = new BufferedOutputStream(sout);

        while((bytesRead = bis.read(buff)) != -1){
          bos.write(buff, 0, bytesRead);
	}

	bos.flush();

	fin.close();
	sout.close();
	bis.close();
	bos.close();
      }else{
        // 자체 예외발생
       	throw new Exception("해당 파일이 존재하지 않습니다.");
      }
    }catch(CSFWException e){
      throw e;
    }catch(Exception e){
      // 자체 예외발생
      throw new CSFWException("파일 다운로드중에 오류가 발생하였습니다.");
    }finally{
      if(fin != null){fin.close();}
      if(sout != null){sout.close();}
      if(bis != null){bis.close();}
      if(bos != null){bos.close();}
    }
  }
}

스프링에서 ViewResolver로 사용하기 위해서는 xml을 통해서 등록을 해야 하지만, @Component 어노테이션을 사용한다면 별도의 설정없이 바로 사용할 수 있다.

컨트롤러에서 사용하는 방법

@RequestMapping("fileDownload.do")
public String fileDonwLoadSample(ModelMap model) throws Exception{
  model.put("fileName", "저장할 파일명");
  model.put("filePath", "다운로드 할 파일의 풀 경로");
  return "fileDownLoadView";
}