728x90
게시글 삽입 을 했을 때 DB에 사진을 넣기 위에서 해당 위치에 이미지를 저장했다.
만약 이미지를 수정하거나 삭제하게 되면 해당 이미지 파일에 계속 쌓여서 DB에 메모리 누수가 발생할 것이다!
이를 방지하기 위에 오늘은 스케줄을 이용해서 DB에 이미지가 없다면 삭제를 진행해보자
관련하여 설정방법이나 @Scheduled은 아래 게시물을 먼저 확인해주세요!
[ Spring ] @Scheduled 이론 ⑯
게시글 삽입 을 했을 때 DB에 사진을 넣기 위에서 해당 위치에 이미지를 저장했다. 만약 이미지를 수정하거나 삭제하게 되면 해당 이미지 파일에 계속 쌓여서 DB에 메모리 누수가 발생할 것이다!
jnaa.tistory.com
📚 Spring
📗 ImageDeleteScheduling.java
: 스프링이 일정 시간마다 해당 객체를 이용해서 코드를 수정(객체로 만들어서 사용해야한다!)
스프링이 해당 클래스를 객체로 만들어서 관리를 해야한다. (Bean 등록)
🤔💭
@Component
: @Controller,@service,@Repository의 부모 어노테이션 Bean 등록을 하겠다고 명시하는 어노테이션
@Component
public class ImageDeleteScheduling {
@Autowired
private ServletContext servletContext;
@Autowired
private BoardService service;
//@Scheduled(cron = "0,30 * * * * *") // -> 0초 30초 될떄!
@Scheduled(cron = "0 0 * * * *") //(매 정시(*시 0분 0초)
public void test() {
System.out.println("-------------- 게시판 DB, 서버 불일치 파일 제거--------------");
// 서버에 저장된 파일 목록을 조회해서
// DB에 저장된 파일 목록과 비교하여
// 매칭되지 않는 서버 파일 제거
// 1) 서버에 저장된 파일 목록 조회
// -> application 객체 이용해서
// /resources/images/board의 실제 서버 경로를 얻어옴
String filePath = servletContext.getRealPath("/resources/images/board");
// C:\workspace\6_Framework\boardProject\src\main\webapp\resources\images\board
// 2) filePath에 저장된 모든 파일 목록 읽어오기
File path = new File(filePath);
File[] imageArr = path.listFiles();
// 배열 -> Lisi로 변환(다루기 편하니까)
List<File> serverImageList = Arrays.asList(imageArr);
// 3) DB에 파일 목록 조회
List<String> dbImageList = service.selectImageList();
// 확인(임시)
//for(File f:serverImageList) { System.out.println(f.toString());}
/*// 확인
for(String s : dbImageList) {
System.out.println(s);*/
//4) 서버에 파일 목록이 있을 경우에 비교 시작
if(!serverImageList.isEmpty()) {
// 5) 서버 파일 목록을 순차 접근
for(File server : serverImageList) {
//6) 서버에 존재하는 파일이
// DB(dbImageList)에 없다면 삭제
//String [] temp = server.toString().split("\\\\");
//String s = temp[temp.length-1]; //-1 하는 이유 이미지명
// C:\workspace\6_Framework\boardProject\src\main\webapp\resources\images\board/이미지명
//System.out.println(server.getName());
//List.indexOf(객체) = 객체가 List에 있으면 해당 인덱스 반환 없으면 -1 반환
if(dbImageList.indexOf(server.getName()) == -1) {
//db파일목록 서버 파일 이름
System.out.println(server.getName() + "삭제");
server.delete(); //File.delete() : 파일 삭제
}
}// for문 종료
System.out.println("--------------이미지 파일 삭제 스케쥴러 종료---------------");
}
}
}
📗 BoardService.java
/** DB 이미지(파일) 목록 조회
* @return list
*/
List<String> selectImageList();
📗 BoardServiceImpl.java
// DB 이미지(파일) 목록 조회
@Override
public List<String> selectImageList() {
return dao.selectImageList();
}
📗 BoardDAO.java
/** DB이미지 (파일) 목록 조회
* @return list
*/
public List<String> selectImageList() {
return sqlSession.selectList("boardMapper.selectImageListALL");
}
📗 board-mapper.xml
/** DB이미지 (파일) 목록 조회
* @return list
*/
public List<String> selectImageList() {
return sqlSession.selectList("boardMapper.selectImageListALL");
}
💻 console
설정한 시간마다 DB와 폴더를 확인해서 DB에 없으면 폴더에 삭제되는 모습을 확인 할 수 있다.
728x90
'ON > spring' 카테고리의 다른 글
[ Spring ] SpringAOP 사용하기 ⑳ (0) | 2023.09.02 |
---|---|
[ Spring ] SpringAOP 이론 ⑱ (0) | 2023.09.01 |
[ Spring ] @Scheduled 이론 ⑯ (0) | 2023.09.01 |
[ Spring ] 게시글 목록으로 이동 ⑮ (0) | 2023.08.31 |
[ Spring ] 게시글 삭제 / 게시글 검색 ⑭ (0) | 2023.08.31 |