게시물을 삭제할 떄는 게시물이 포함된 첨부파일 역시 같이 삭제할 필요가있다.
단순히 DB상에서 삭제 뿐만아니라 실제 폴더 내의 파일도 같이 삭제되어야 한다.
첨부파일 삭제 처리
첨부파일과 관련된 SQL은 BoardAttachMapper 인터페이스와 XML파일에 작성되어있으니 이부분에 추가를 해주자
public void delete(String uuid);
삭제처리할 메서드이다.
그리고 실제 SQL은 XML매퍼에 작성한다.
<delete id="delete">
delete from tbl_attach where uuid = #{uuid}
</delete>
<delete id="deleteAll">
delete tbl_attach where bno = #{bno}
</delete>
하나삭제와 종합삭제를 넣었다. 하나삭제는 기존에 있지만 종합삭제/전체삭제도 그아래 추가해주었다.
BoardServiceImpl변경
BoardServiceImpl은 첨부파일 삭제와 실제 게시물의 삭제가 같이 처리되도록 트랜잭션 하에서
BoardAttachMapper의 deleteAll()을 호출하도록 수정하자
@Transactional
@Override
public boolean remove(Long bno) {
// TODO Auto-generated method stub
log.info("remove .............." + bno);
attachMapper.deleteAll(bno);
return mapper.delete(bno) == 1;
}
BoardController의 파일삭제 처리
BoardController는 DB의 삭제를 먼저 호출하고, 이후 파일을 삭제해야 한다.
다만 파일을 삭제하기 위해서 해당 게시물의 첨부파일 목록이 필요하다.
그런데! 첨부파일의 목록을 구한다고 해도 이미지 파일의 경우에는 썸네일 파일이 생성되어 있으므로
이에 대한 처리가 같이 필요하다.
따라서 작업의 순서를 정리하면
1. 해당 게시물의 첨부파일 정보를 미리 준비
2. DB상에서 해당 게시물과 첨부파일 데이터 삭제
3. 첨부파일 목록을 이용해서 해당 폴더에서 섬네일 이미지(이미지 파일의 경우)와 일반파일을 삭제
Criterria수정
게시물의 삭제 후에 페이지 번호나 검색 조건을 유지하면서 이동하기 위해서는 'redirect'에 필요한
파라미터들을 매번 추가해야하 하는 불편함이 있다.
이는 Criteria에서 처리 할 수 있도록 이미 작성되어 있는지 확인하고 조치한다.
public String getListLink() {
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("")
.queryParam("pageNum", this.pageNum)
.queryParam("amount", this.getAmount())
.queryParam("type", this.getType())
.queryParam("keyword", this.getKeyword());
return builder.toUriString();
}
UrilComponentsBuilder는 브라우저에서 GET방식 등의 파라미터 전송에 사용되는 문자열(쿼리스트링(query string))
을 손쉽게 처리할 수 있는 클래스이다.
파일 삭제 처리
파일삭제는 BoardController에 deleteFile()라는 메서드를 추가해서 처리하도로고 한다.
deleteFile()는 java.nio.file패키지의 Path를 이용해서 처리한다.
private void deleteFiles(List<BoardAttachVO> attachList) {
if (attachList == null || attachList.size() == 0) {
return;
}
log.info("delete attach files...................");
log.info(attachList);
attachList.forEach(attach -> {
try {
Path file = Paths.get(
"C:\\programing\\upload\\" + attach.getUploadPath() + "\\" + attach.getUuid() + "_" + attach.getFileName());
Files.deleteIfExists(file);
if (Files.probeContentType(file).startsWith("image")) {
Path thumbNail = Paths.get("C:\\programing\\upload\\" + attach.getUploadPath() + "\\thumb_" + attach.getUuid() + "_"
+ attach.getFileName());
Files.delete(thumbNail);
}
} catch (Exception e) {
log.error("delete file error" + e.getMessage());
} // end catch
});// end foreachd
}
먼저 deleteFiles라는 메서드를 생성한다. 이는 첨부파일명단을 매개변수로 받아서, 그 명단을 받아
해당 업로드 파일이 있는 곳에 파일들을 삭제하고, 만약 해당파일이 이미지라면
thumb라는 이름을 포함하고있는 파일도함께 삭제시키는 기능을 수행하도록 한다.
@PostMapping("/remove")
public String remove(@RequestParam("bno") Long bno, Criteria cri, RedirectAttributes rttr) {
log.info("remove..." + bno);
List<BoardAttachVO> attachList = service.getAttachList(bno);
if (service.remove(bno)) {
deleteFiles(attachList);
rttr.addFlashAttribute("result", "success");
}
return "redirect:/board/list" + cri.getListLink();
}
그리고 삭제동작을 하는 remove메서드를 이것이 잘 반영될 수 있도록 그리고 그것들이 결과값으로 반영되도록
수정해준다.
그리고 동작하는지 확인하자
동작확인 단계가 기니까 접은글로 처리하겠다.

최초 문제없는 업로드 (글번호 126)

파일 그대로있다.

uuid, 업로드된 폴더위치, 파일이름, 글번호 등 모두 정상적으로 기입되어있다.

아29야.. 수정하는 화면을 구현하지않았다. 지금이라도 당장 복붙매직으로 구현하고싶은데 절차를 따르자..
그럼 삭제를 하는수밖에..

처리완료했고(다음엔 처리완료하면 글번호나 제목을 넣어주도록 해야겠다. )


모두삭제가 되었음을 확인하였다 .만ㄴ세..!
삭제된 결과를 모두 확인했다. 이제 수정하는 것을 구현해보자 . !!
하나 짚고가야할 게있다면
화면에서 첨부파일 수정
을 하기전에 ... 수정이라고하면 여기에 첨부파일을 새로 등록하고, 삭제하고, 또 전부삭제하고,,, 닫을때 또 삭제되게하고
많이 복잡할것같아서 포스팅을 잠시 나누어서 진행하도록 하겠다..
'Spring공부 > 3-파일업로드' 카테고리의 다른 글
프로젝트(6)-잘못된 파일 처리 (0) | 2021.10.15 |
---|---|
프로젝트(5)-게시글 수정 및 기타작업 (0) | 2021.10.15 |
프로젝트(3)-게시물 조회 (0) | 2021.10.15 |
프로젝트(2)-등록화면처리 (0) | 2021.10.14 |
프로젝트(1)-첨부파일등록 (0) | 2021.10.14 |
댓글