게시판에서 게시글을 지우는걸 떠올려보자.
당연히 내가 작성했던 글을 지우면 내가 업로드한 이미지들도 함께 지워지게 된다.
그렇다면 프로그래밍 입장에서 살펴보면 어떨까?
글을 저장하는 테이블과 이미지 저장 테이블 이 있을 경우 이미지 저장 테이블은 글 저장 테이블을 부모로 바라보고 있기 때문에 글이 삭제되면 이미지도 함께 삭제가 될 것이다.
❗ 그렇다면 테이블이 아닌 실제 저장되어 있는 file 은 어떻게 해야할까..?
테이블에 있는 정보가 삭제되면서 파일이 새롭게 부여받은 이름도 삭제되었을텐데 어떻게 찾아서 지울 수 있을까..? 라는 고민이 필요하다!
<a href="del?idx=${bbs.idx}">삭제</a>
→ 삭제 링크를 클릭하면 del 메서드와 매핑되며 idx 값을 통해 특정한 게시글을 삭제
@RequestMapping(value="del")
public String del(String idx) {
boardService.del(idx);
return "redirect:/list";
}
→ del 메서드 안에서 service 에 del 메서드를 호출한다.
public void del(String idx) {
List<FileDTO> fileList = boardDAO.files(idx);
int row = boardDAO.del(idx);
logger.info("delete row : " + row);
if(row>0) {
for (FileDTO dto : fileList) {
File file = new File("C:/upload/" + dto.getNew_filename());
if(file.exists()) {
boolean success = file.delete();
logger.info(dto.getNew_filename() + " delete : " + success);
}
}
}
}
1) idx(기본키) 를 가지고 files(테이블)에 있는 new_filename(UUID) 를 알아낸다.
→ List<FileDTO> fileList = boardDAO.files(idx); : 특정 idx 값으로 files 테이블에서 정보를 select 하는 메서드(파일 이름도 들어가 있다.)
2) 게시글 테이블(bbs)에 있는 데이터 삭제 ※ files 테이블의 부모로 삭제 시 files 테이블에 데이터도 함께 삭제됨
→ int row = boardDAO.del(idx); : 데이터가 삭제된 이후에 파일을 삭제해야 하기 때문에 결과(행)를 int에 넣어준다.
3) 삭제 성공 시 컴퓨터에 있는 file을 삭제해준다.
→ List로 넣었기 때문에 forEach 문으로 하나씩 꺼내준다.
→ File객체를 활용해 컴퓨터 폴더에 가져온 파일명이 있는지 확인한다.
→ 파일이 있을 경우 .delete() 를 사용해 삭제해준다.
List<FileDTO> files(String idx);
int del(String idx);
<select id="files" resultType="kr.co.gudi.dto.FileDTO">
SELECT * FROM files WHERE idx = #{param1}
</select>
<delete id="del">
DELETE FROM bbs WHERE idx = #{param1}
</delete>