프로젝트

14. 공지사항 게시판 (첨부파일 삭제, 글 목록에 첨부파일 아이콘)

하차모 2023. 5. 22. 22:28

첨부파일 삭제

게시글 상세 조회에서 삭제 버튼을 눌렀을 때, 파라미터로 게시글 pk인 boardNum이 넘어온다.

그 boardNum으로 해당 게시글에 첨부파일이 있는지 먼저 조회하고 첨부파일 pk인 fileNum을 list로 받아 저장한다.

 

삭제할 첨부파일이 있으면 (첨부파일 리스트가 Null이 아니면) for문으로 하나씩 삭제해준다.

 

첨부파일 + 글 삭제도 트랜잭션 처리가 필요하다.

 

NoticeServiceImpl.java

//글 삭제
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBoard(BoardVO boardVO) {
    //해당 글의 첨부파일 있는지 조회
    List<String> deleteFileNumList = sqlSession.selectList("boardMapper.getFileNumByBoardNum", boardVO);

    //첨부파일이 있으면 삭제
    if(deleteFileNumList != null) {
        for(String deleteFileNum : deleteFileNumList) {
            BoardFileVO fileVO =  sqlSession.selectOne("boardMapper.getDownloadFileVO", deleteFileNum);
            String attachedFileName = fileVO.getAttachedFileName();

            File file = new File(ConstVariable.BOARD_UPLOAD_PATH + attachedFileName);
            file.delete();

            sqlSession.delete("boardMapper.deleteFile", deleteFileNum);
        }
    }

    //글 삭제
    sqlSession.delete("boardMapper.deleteBoard", boardVO);
}

 

 

 

게시글 목록에 첨부파일 아이콘

파일이 첨부된 게시글에는 제목 옆에 첨부파일 아이콘을 붙여줬다.

 

BoardVO와 resultMap에 FILE_CNT 를 추가해 첨부된 파일이 몇개인지도 같이 조회한다.

 

board-mapper.xml

<!-- 공지사항 글 목록 조회 -->
	<!-- 상태값 1(등록) --> 
	<select id="getNoticeList" resultMap="board">
		SELECT BOARD_NUM
		    , BOARD_TITLE
		    , BOARD_WRITER
		    , TO_CHAR(BOARD_DATE, 'YYYY-MM-DD HH24:MI') BOARD_DATE
		    , BOARD_VIEW
		    , ENAME
		    , (SELECT COUNT(FILE_NUM) 
				FROM BOARD_FILE
				WHERE BOARD_NUM = BOARD.BOARD_NUM) FILE_CNT
		FROM BOARD, EMP
		WHERE BOARD_MENU_CODE = 'BOARD_MENU_001'
		AND BOARD_STATUS = 1
		AND BOARD_WRITER = EMPNO
		ORDER BY BOARD_NUM DESC
	</select>

 

fileCnt가 0이 아니면(count 함수라 음수가 나올 일은 없으니..) = 첨부된 파일이 하나라도 있으면 아이콘이 뜨도록 했다.

<a th:href="@{/notice/detail(boardNum=${notice.boardNum})}" style="color: black;">
[[${notice.boardTitle}]]
</a>
<th:block th:if="${notice.fileCnt != 0}">
	<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-paperclip" viewBox="0 0 16 16">
	  <path d="M4.5 3a2.5 2.5 0 0 1 5 0v9a1.5 1.5 0 0 1-3 0V5a.5.5 0 0 1 1 0v7a.5.5 0 0 0 1 0V3a1.5 1.5 0 1 0-3 0v9a2.5 2.5 0 0 0 5 0V5a.5.5 0 0 1 1 0v7a3.5 3.5 0 1 1-7 0V3z"/>
	</svg>
</th:block>