2020년 01월 08일

업데이트:


썸네일


게시글 목록에서 어느 위치에 썸네일이 보여지고 싶은지 결정하고, 어느 컨트롤러가 불러와야 되는지 생각해보기

썸네일 출력

썸네일출력




BoardController 게시글 목록이 조회 되었을 때 해당 게시글의 썸네일도 얻어온다.

// 게시글 목록 조회 Controller **********************************************************
if(command.equals("/list.do")) {
    errorMsg = "게시판 목록 조회 과정에서 오류 발생";
    
    // 1) 페이징 처리를 위한 값 계산 Service 호출
    PageInfo pInfo = service.getPageInfo(cp);
    
//				System.out.println(pInfo);
    
    // 2) 게시글 목록 조회 비즈니스 로직 수행
    List<Board> bList = service.selectBoardList(pInfo);
    // pInfo에 있는 currentPage, limit를 사용해야지만
    // 현재 페이지에 맞는 게시글 목록만  조회할 수 있음.
    
    /*for(Board b : bList) {
        System.out.println(b);
    }*/
    
    // 썸네일 추가 부분
    // 3. 게시글 목록이 조회 되었을 때
    // 해당 게시글 목록 요소에 작성된 썸네일 이미지 목록 얻어오는 서비스 진행
    if(bList !=null ) {
        // 썸네일 이미지 목록 조회 서비스 호출
        List<Attachment> fList = service.selectThumbnailList(pInfo);
        
        // 썸네일 이미지 목록이 비어있지 않은 경우
        if(!fList.isEmpty()) {
            request.setAttribute("fList", fList);
        }
        
    }
    
    
    path = "/WEB-INF/views/board/boardList.jsp";
    
    request.setAttribute("bList", bList);
    request.setAttribute("pInfo", pInfo);
    
    view = request.getRequestDispatcher(path);
    view.forward(request, response);
}


BoardService.java

/** 썸네일 목록 조회 Service
* @param pInfo
* @return fList
* @throws Exception
*/
public List<Attachment> selectThumbnailList(PageInfo pInfo) throws Exception {
    Connection conn = getConnection();
    
    List<Attachment> fList = dao.selectThumbnailList(conn,pInfo);
    
    close(conn);
    
    return fList;
}


BoardDAO.java

/** 썸네일 목록 조회 DAO
* @param conn
* @param pInfo
* @return fList
* @throws Exception
*/
public List<Attachment> selectThumbnailList(Connection conn, PageInfo pInfo) throws Exception {
List<Attachment> fList = null;

String query = prop.getProperty("selectThumbnailList");
try {
    // 위치 홀더에 들어갈 시작 행, 끝 행번호 계산
    int startRow = (pInfo.getCurrentPage() -1) * pInfo.getLimit() + 1;
    int endRow = startRow + pInfo.getLimit()-1;
    
    pstmt = conn.prepareStatement(query);
    pstmt.setInt(1, startRow);
    pstmt.setInt(2, endRow);
    
    rset = pstmt.executeQuery();
    
    fList = new ArrayList<Attachment>();
    while(rset.next()){
        Attachment at = new Attachment();
        at.setFileName(rset.getString("FILE_NAME"));
        at.setParentBoardNo(rset.getInt("PARENT_BOARD_NO"));
        
        fList.add(at);
    }
    
}finally {
    close(rset);
    close(pstmt);
}
return fList;
}


board-query.xml

<!-- 썸네일 목록 조회  -->
<entry key="selectThumbnailList">
SELECT * FROM ATTACHMENT
WHERE PARENT_BOARD_NO 
IN (SELECT BOARD_NO FROM 
    (SELECT ROWNUM RNUM, V.* FROM
        (SELECT BOARD_NO FROM V_BOARD
        WHERE BOARD_STATUS='Y'
        ORDER BY BOARD_NO DESC)V)
WHERE RNUM BETWEEN ? AND ?)
AND FILE_LEVEL=0
</entry>


boardList.jsp

<%-- 썸네일 출력  --%>
<c:forEach var="thumbnail" items="${fList }">
        <%-- 현재 출력하려는 게시글 번호와 썸네일 목록  부모게시글번호가 일치하는 썸네일 정보가 있다면  --%>
        <c:if test="${board.boardNo == thumbnail.parentBoardNo }">
                <img src="${contextPath }/resources/uploadImages/${thumbnail.fileName}">
        </c:if>
</c:forEach>



  • 검색을 했을 때도 썸네일이 출력 될 수 있게 검색 컨트롤러에도 썸네일을 추가해주어야 한다.

검색 시 게시글 목록 검색 시 썸네일




SearchController.java

// 검색 게시글 목록 조회 성공 시 썸네일 목록 조회 수행
if(bList != null) {
List<Attachment> fList = service.searchThumbnailList(map, pInfo);
if(!fList.isEmpty()) { // 조회된 썸네일 목록이 있다면
    request.setAttribute("fList", fList);
}

}


SearchService.java

/** 검색이 적용된 썸네일 목록 조회 Service
* @param map
* @param pInfo
* @return fList
* @throws Exception
*/
public List<Attachment> searchThumbnailList(Map<String, Object> map, PageInfo pInfo) throws Exception {
Connection conn = getConnection();

// 검색에 사용될 SQL 조건문 생성
String condition = createCondition(map);

List<Attachment> fList = dao.searchThumbnailList(conn, pInfo, condition);

close(conn);		

return fList;
}


SearchDAO.java

/** 검색이 적용된 썸네일 목록 조회 DAO
* @param conn
* @param pInfo
* @param condition
* @return fList
* @throws Exception
*/
public List<Attachment> searchThumbnailList(Connection conn, PageInfo pInfo, String condition) throws Exception {
    List<Attachment> fList = null;
    
    String query = 
            "SELECT FILE_NAME, PARENT_BOARD_NO FROM ATTACHMENT " + 
            "WHERE PARENT_BOARD_NO IN (" + 
            "    SELECT BOARD_NO FROM " + 
            "    (SELECT ROWNUM RNUM, V.* FROM " + 
            "            (SELECT BOARD_NO  FROM V_BOARD " + 
            "            WHERE BOARD_STATUS='Y' " + 
            "            AND " + condition + 
            "            ORDER BY BOARD_NO DESC ) V) " + 
            "    WHERE RNUM BETWEEN ? AND ?" + 
            ") " + 
            "AND FILE_LEVEL = 0";
    
        try {
            // 위치 홀더에 들어갈 시작 행, 끝 행번호 계산
            int startRow = (pInfo.getCurrentPage() -1) * pInfo.getLimit() + 1;
            int endRow = startRow + pInfo.getLimit()-1;
            
            pstmt = conn.prepareStatement(query);
            pstmt.setInt(1, startRow);
            pstmt.setInt(2, endRow);
            
            rset = pstmt.executeQuery();
            
            fList = new ArrayList<Attachment>();
            while(rset.next()){
                Attachment at = new Attachment();
                at.setFileName(rset.getString("FILE_NAME"));
                at.setParentBoardNo(rset.getInt("PARENT_BOARD_NO"));
                
                fList.add(at);
            }
        }finally {
            close(rset);
            close(pstmt);
        }

    return fList;

}




게시글 수정

게시글 수정 버튼을 누르면 게시글 수정 화면 전환


전체 목록조회 상태에서 수정할 때

  • 수정 버튼 클릭 -> 수정 화면 -> 수정 성공 -> 상세조회 화면

검색 후 게시글을 수정할 때

  • 검색 -> 검색목록 -> 상세조회 -> 수정 버튼 클릭 -> 수정화면 -> 수정 성공 -> 상세조회 화면

상황에 따라 게시글 수정 후 상세조회 페이지로 돌아오기 위한 url 조합을 해주어야 한다.


boardView.jsp

<%-- 로그인된 회원과 해당  작성자가 같은 경우--%>
<c:if test="${!empty loginMember && (board.memberId == loginMember.memberId) }">
    <button id="deleteBtn" class="btn btn-primary float-right">삭제</button>
        <%-- 게시글 수정  상세조회 페이지로 돌아오기 위한 url 조합 --%>
        <c:if test="${!empty param.sv && !empty param.sk }">
            <%-- 검색을 통해 들어온 상세 조회 페이지인 경우 --%>
            <c:set var="searchStr" value="&sk=${param.sk }&sv=${param.sv }"/>
        </c:if>
    <a href="updateForm.do?cp=${param.cp}&no=${param.no}${searchStr}" class="btn btn-primary float-right ml-1 mr-1">수정</a>
</c:if>


  • 글 수정을 진행하려면 우선 이전에 작성된 내용을 불러와야한다.

BoardController.java

//게시글 수정 화면 전환 controller ***************************
else if(command.equals("/updateForm.do")) {
errorMsg="게시글 수정 화면 전환 과정에서 오류 발생";
//수정화면이 미리 이전 내용을 작성될 수 있게
//글 번호를 이용하여 이전 내용을 조회해옴
int boardNo = Integer.parseInt(request.getParameter("no"));
Board board = service.updateView(boardNo);

if(board!=null) {
    List<Attachment> fList = service.selectBoardFiles(boardNo);
    
    if(!fList.isEmpty()) {
        request.setAttribute("fList", fList);
    }
    
    request.setAttribute("board", board);
    path = "/WEB-INF/views/board/boardUpdate.jsp";
    view = request.getRequestDispatcher(path);
    view.forward(request, response);
} else {
    request.getSession().setAttribute("swalIcon", "error");
    request.getSession().setAttribute("swalTitle", "게시글 수정화면 전환 실패");
    response.sendRedirect(request.getHeader("referer"));
}
}


BoardService.java

/** 게시글 수정 화면 출력용 Service
* @param boardNo
* @return board
* @throws Exception
*/
public Board updateView(int boardNo) throws Exception {
Connection conn = getConnection();

// 이전에 만들어 둔 상세조회 DAO 호출
Board board = dao.selectBoard(conn, boardNo);

// 스크립팅 방지를 위해 개행문자가 <br>로 변해있는 상태.
// 수정할때 내용이 보여지는 부분은 textArea
// textArea의 개행문자는 \r\n 형태이다.  <br>을 \r\n으로 바꾸기
// textArea 출력을 위한 개행문자 변경
board.setBoardContent(board.getBoardContent().replaceAll("<br>", "\r\n"));

close(conn);

return board;
}


BoardDAO.java

/** 게시글 상세조회 DAO
* @param conn
* @param boardNo
* @return board
* @throws Exception
*/
public Board selectBoard(Connection conn, int boardNo) throws Exception {
Board board = null;

String query = prop.getProperty("selectBoard");
try {
    pstmt = conn.prepareStatement(query);
    pstmt.setInt(1,boardNo);
    
    rset = pstmt.executeQuery();
    
    if(rset.next()) {
        board = new Board();
        board.setBoardNo(rset.getInt("BOARD_NO"));
        board.setBoardTitle(rset.getString("BOARD_TITLE"));
        board.setBoardContent(rset.getString("BOARD_CONTENT"));
        board.setMemberId(rset.getString("MEMBER_ID"));
        board.setReadCount(rset.getInt("READ_COUNT"));
        board.setBoardCreateDate(rset.getTimestamp("BOARD_CREATE_DT"));
        board.setBoardModifyDate(rset.getTimestamp("BOARD_MODIFY_DT"));
        board.setCategoryName(rset.getString("CATEGORY_NM"));
    }
    
}finally {
    close(rset);
    close(pstmt);
}

return board;
}


board-query.xml

<!-- 게시글 상세 조회  -->
<entry key="selectBoard">
SELECT * FROM V_BOARD
WHERE BOARD_NO=?
AND BOARD_STATUS='Y'
</entry>


boardUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<style>
    .insert-label {
      display: inline-block;
      width: 80px;
      line-height: 40px
    }
    
    .boardImg{
    	cursor : pointer;
    }
</style>
</head>
<body>
	<jsp:include page="../common/header.jsp"></jsp:include>

	<div class="container my-5">

		<h3>게시글 수정</h3>
		<hr>
		
		<c:if test="${!empty param.sk && !empty param.sv}">
			<c:set var="searchStr" value="&sk=${param.sk}&sv=${param.sv}"/>
		</c:if>
		
		<form action="update.do?cp=${param.cp}&no=${param.no}${searchStr}" method="post" 
			  enctype="multipart/form-data" role="form" onsubmit="return updateValidate();">

			<div class="mb-2">
				<label class="input-group-addon mr-3 insert-label">카테고리</label> 
				<select	class="custom-select" id="categoryCode" name="categoryCode" style="width: 150px;">
					<option value="10">운동</option>
					<option value="20">영화</option>
					<option value="30">음악</option>
					<option value="40">요리</option>
					<option value="50">게임</option>
					<option value="60">기타</option>
				</select>
			</div>
			<div class="form-inline mb-2">
				<label class="input-group-addon mr-3 insert-label">제목</label> 
				<input type="text" class="form-control" id="boardTitle" name="boardTitle" size="70" value="${board.boardTitle }">
			</div>

			<div class="form-inline mb-2">
				<label class="input-group-addon mr-3 insert-label">작성자</label>
				<h5 class="my-0" id="writer">${board.memberId }</h5>
			</div>


			<div class="form-inline mb-2">
				<label class="input-group-addon mr-3 insert-label">작성일</label> <fmt:formatDate value="${board.boardCreateDate }" pattern="yyyy년 MM월 dd일 HH:mm:ss"/>
			</div>
			<hr>

			<div class="form-inline mb-2">
				<label class="input-group-addon mr-3 insert-label">썸네일</label>
				<div class="boardImg" id="titleImgArea">
					<img id="titleImg" width="200" height="200">
				</div>
			</div>

			<div class="form-inline mb-2">
				<label class="input-group-addon mr-3 insert-label">업로드<br>이미지</label>
				<div class="mr-2 boardImg" id="contentImgArea1">
					<img id="contentImg1" width="150" height="150">
				</div>

				<div class="mr-2 boardImg" id="contentImgArea2">
					<img id="contentImg2" width="150" height="150">
				</div>

				<div class="mr-2 boardImg" id="contentImgArea3">
					<img id="contentImg3" width="150" height="150">
				</div>
			</div>


			<!-- 파일 업로드 하는 부분 -->
			<div id="fileArea">
				<input type="file" id="img0" name="img0" onchange="LoadImg(this,0)"> 
				<input type="file" id="img1" name="img1" onchange="LoadImg(this,1)"> 
				<input type="file" id="img2" name="img2" onchange="LoadImg(this,2)"> 
				<input type="file" id="img3" name="img3" onchange="LoadImg(this,3)">
			</div>

			<div class="form-group">
				<div>
					<label for="content">내용</label>
				</div>
				<textarea class="form-control" id="boardContent" name="boardContent" rows="15" style="resize: none;">${board.boardContent }</textarea>
			</div>


			<hr class="mb-4">

			<div class="text-center">
				<button type="submit" class="btn btn-primary">수정</button>
				<button type="button" class="btn btn-primary">이전으로</button>
			</div>

		</form>
	</div>

	<jsp:include page="../common/footer.jsp"></jsp:include>
		
		
	<script>

		// 유효성 검사 
		function updateValidate() {
			if ($("#boardTitle").val().trim().length == 0) {
				alert("제목을 입력해 주세요.");
				$("#boardTiitle").focus();
				return false;
			}

			if ($("#boardContent").val().trim().length == 0) {
				alert("내용을 입력해 주세요.");
				$("#boardContent").focus();
				return false;
			}
		}
		
		 // 이미지 영역을 클릭할 때 파일 첨부 창이 뜨도록 설정하는 함수
    $(function () {
       $("#fileArea").hide();

      $(".boardImg").on("click",function(){
        var index = $(".boardImg").index(this);
        $("#img" + index).click();
      });
    });
		 

    // 각각의 영역에 파일을 첨부 했을 경우 미리 보기가 가능하도록 하는 함수
    function LoadImg(value, num) {
      if (value.files && value.files[0]) {
        var reader = new FileReader();
        // 자바스크립트 FileReader
       	// 웹 애플리케이션이 비동기적으로 데이터를 읽기 위하여 읽을 파일을 가리키는 File 혹은 Blob객체를 이용해 파일의 내용을 읽고 사용자의 컴퓨터에 저장하는 것을 가능하게 해주는 객체
				
        reader.readAsDataURL(value.files[0]);
        // FileReader.readAsDataURL()
      	// 지정된의 내용을 읽기 시작합니다. Blob완료되면 result속성 data:에 파일 데이터를 나타내는 URL이 포함 됩니다.
      	
       	// FileReader.onload
				// load 이벤트의 핸들러. 이 이벤트는 읽기 동작이 성공적으로 완료 되었을 때마다 발생합니다.
        reader.onload = function (e) {
        	//console.log(e.target.result);
        	// e.target.result
        	// -> 파일 읽기 동작을 성공한 객체에(fileTag) 올라간 결과(이미지 또는 파일)
        	
          $(".boardImg").eq(num).children("img").attr("src", e.target.result);
        }

      }
    }
	
    // 카테고리 초기값 지정
    (function(){
       $("#categoryCode > option").each(function(index, item){
          if($(item).text() == "${board.categoryName}"){
             $(item).prop("selected", true);
          }
       });
       })();
	
	
		// 이미지 배치
		<c:forEach var="file" items="${fList}">
			$(".boardImg").eq(${file.fileLevel}).children("img").attr("src","${contextPath}/resources/uploadImages/${file.fileName}");
				
		</c:forEach>
	</script>
	
</body>
</html>


게시글 수정

BoardController.java

// 게시글 수정 Controller ********************************
else if(command.equals("/update.do")) {
    
    errorMsg = "게시글 수정 과정에서 오류 발생";
    
    // 1. MultipartRequest 객체 생성에 필요한 값 설정
    int maxSize = 20 * 1024 * 1024; // 최대 크기 20MB
    String root = request.getServletContext().getRealPath("/");
    String filePath = root + "resources/uploadImages/";
    
    // 2. MultipartRequest 객체 생성
    // -> 생성과 동시에 전달받은 파일이 서버에 저장됨
    MultipartRequest mRequest = new MultipartRequest(request, filePath, maxSize, "UTF-8", new MyFileRenamePolicy());
    
    // 3. 파일 정보를 제외한 파라미터 얻어오기
    String boardTitle = mRequest.getParameter("boardTitle");
    String boardContent = mRequest.getParameter("boardContent");
    int categoryCode = Integer.parseInt(mRequest.getParameter("categoryCode"));
    int boardNo = Integer.parseInt(mRequest.getParameter("no"));
    
    // 4. 전달받은 파일 정보를 List에 저장
    List<Attachment> fList = new ArrayList<Attachment>();
    Enumeration<String> files = mRequest.getFileNames();
    // input type="file"인 모든 요소의 name 속성 값을 반환받아 files에 저장
    
    while(files.hasMoreElements()) {
        // 현재 접근중인 name속성값을 변수에 저장
        String name = files.nextElement();
    
        // 현재 name 속성이 일치하는 요소로 업로드된 파일이 있다면
        if(mRequest.getFilesystemName(name) != null) {
            
            Attachment temp = new Attachment();
            
            // 변경된 파일 이름 temp에 저장
            temp.setFileName(mRequest.getFilesystemName(name));
            
            // 지정한 파일 경로 tmep에 저장
            temp.setFilePath(filePath);
            
            // 해당 게시글 번호 temp에 저장
            temp.setParentBoardNo(boardNo);
            
            // 파일 레벨 temp에 저장
            switch(name) {
            case "img0" : temp.setFileLevel(0); break;
            case "img1" : temp.setFileLevel(1); break;
            case "img2" : temp.setFileLevel(2); break;
            case "img3" : temp.setFileLevel(3); break;
            }
            
            // temp를 fList에 추가
            fList.add(temp);
        // 이미지를 변경한 부분들만 fList에 추가가 된다.
        }
    }
    
    // 5. Session에서 로그인한 회원의 번호를 얻어와 저장
    int boardWriter = ((Member)request.getSession().getAttribute("loginMember")).getMemberNo();
    
    // 6. 준비된 값들을 하나의 Map에 저장
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("boardTitle", boardTitle);
    map.put("boardContent", boardContent);
    map.put("categoryCode",categoryCode);
    map.put("boardNo",boardNo);
    map.put("fList",fList);
    map.put("boardWriter",boardWriter);
    
    // 7. 준비된 값을 매개변수로 하여 게시글 수정 Service 호출
    int result = service.updateBoard(map);
    
    // 8. result 값에 따라 View 연결 처리
    path = "view.do?cp=" + cp + "&no=" + boardNo;
    String sk = mRequest.getParameter("sk");
    String sv = mRequest.getParameter("sv");
    
    // 전달된 sk,sv가 존재 할 때 (검색을 통한 접근일 때)
    if(sk != null && sv != null ) {
        path += "&sk="+sk + "&sv=" + sv;
    }
    
    if (result>0) {
        swalIcon = "success";
        swalTitle = "게시글 수정 성공";
                        
    }else {
        swalIcon = "error";
        swalTitle = "게시글 수정 실패";
    }
    request.getSession().setAttribute("swalIcon", swalIcon);
    request.getSession().setAttribute("swalTitle", swalTitle);
    
    response.sendRedirect(path);
}


BoardService.java

/** 게시글 수정 Service
* @param map
* @return
* @throws Exception
*/
public int updateBoard(Map<String, Object> map) throws Exception {
    Connection conn = getConnection();

    int result = 0; // Service 수정 결과 저장 변수

    List<Attachment> deleteFiles = null; // 삭제할 파일 정보 저장 변수 선언

    // 1. 크로스 사이트 스크립팅 방지 처리

    String boardTitle = (String) map.get("boardTitle");
    String boardContent = (String) map.get("boardContent");

    boardTitle = replaceParameter(boardTitle);
    boardContent = replaceParameter(boardContent);

    // 2. 글 내용 개행문자 \r\n -> <br>
    boardContent.replaceAll("\r\n", "<br>");

    // 처리된 내용을 다시 map에 추가
    map.put("boardTitle", boardTitle);
    map.put("boardContent", boardContent);
    
    try {
        // 3. 게시글 부분 수정 DAO 호출
        result = dao.updateBoard(conn, map);
        
        // 4. 게시글 수정이 성공하고 fList가 비어있지 않으면
        //      파일 정보 수정 DAO를 호출함
        
        // 수정 화면에서 새로운 이미지가 업로드된 파일 정보만을 담고 있는 List
        List<Attachment> newFileList = (List<Attachment>)map.get("fList");
        
        
        if(result > 0 && !newFileList.isEmpty()) {
        
        // DB에서 해당 게시글의 수정전 파일 목록 조회
        List<Attachment> oldFileList = dao.selectBoardFiles(conn, (int)map.get("boardNo"));
        
        // newFileList -> 수정된 썸네일(lv.0)
        
        // oldFileList -> 썸네일(lv.0), 이미지 (lv.1), 이미지2(lv.2)
        
        // 기존 썸네일(lv.0) -> 수정된 썸네일(lv.0)로 변경됨
        // -> DB에서 기존 썸네일의 데이터를 수정된 썸네일로 변경
        //   --> DB에서 기존 썸네일 정보가 사라짐
        
        result = 0; // result 재활용
        deleteFiles = new ArrayList<Attachment>(); // 삭제될 파일 정보 저장 List
        
        // 새로운 이미지 정보 반복 접근
        for(Attachment newFile : newFileList) {
            
            // flag가 false인 경우 : 새 이미지와 기존 이미지의 파일 레벨이 중복되는 경우 -> update
            // flag가 true인 경우 : 새 이미지와 기존 이미지의 파일 레벨이 중복되지 않는 경우 -> insert
            boolean flag = true;
            
            // 기존 이미지 정보 반복 접근
            for(Attachment oldFile : oldFileList) {
                
                // 새로운 이미지와 기존 이미지의 파일 레벨이 동일한 파일이 있다면
                if(newFile.getFileLevel() == oldFile.getFileLevel()) {
                    
                    // 기존 파일을 삭제 List에 추가
                    deleteFiles.add(oldFile);
                    
                    // 새 이미지 정보에 이전 파일 번호를 추가 -> 파일 번호를 이용한 수정 진행
                    newFile.setFileNo(oldFile.getFileNo());
                    
                    flag = false;
                    
                    break;
                }
            }
            // flag 값에 따라 파일 정보 insert 또는 update수행
            if(flag) {
                result = dao.insertAttachment(conn, newFile);
            }else {
                result = dao.updateAttachment(conn, newFile);
            }
            
            // 파일 정보 삽입 또는 수정 중 실패 시
            if(result == 0) {
                // 강제로 사용자 정의 예외 발생
                throw new FileInsertFailedException("파일 정보 삽입 또는 수정 실패");
            }
        }
        }
        
    } catch (Exception e) {
        // 게시글 수정 중 실패 또는 오류 발생 시
        // 서버에 미리 저장되어 있던 이미지 파일 삭제
        List<Attachment> fList = (List<Attachment>)map.get("fList");
        
        if(!fList.isEmpty()) {
        for(Attachment at : fList) {
            String filePath = at.getFilePath();
            String fileName = at.getFileName();
            
            File deleteFile = new File(filePath + fileName);
            
            if(deleteFile.exists()) {
                // 해당 경로에 해당 파일이 존재하면
                deleteFile.delete(); // 해당 파일 삭제
            }
        }
        }
        
        // 에러페이지가 보여질 수 있도록 catch한 Exception을 Controller로 던져줌
        throw e; 
    }
    
    // 5. 트랜잭션 처리 및 삭제 목록에 있는 파일 삭제
    if(result > 0) {
        commit(conn);
        
        // DB 정보와 맞지 않는 파일(deleteFiles) 삭제 진행
        if(deleteFiles !=null) {
            
            for(Attachment at : deleteFiles) {
            String filePath = at.getFilePath();
            String fileName = at.getFileName();
            
            File deleteFile = new File(filePath + fileName);
            
            if(deleteFile.exists()) {
                deleteFile.delete();
            }
            }
        }
    }else {
        rollback(conn);
    }
    return result;
}


BoardDAO.java

/** 게시글 수정 DAO
* @param conn
* @param map
* @return result
* @throws Exception
*/
public int updateBoard(Connection conn, Map<String, Object> map) throws Exception {
int result =0;

String query = prop.getProperty("updateBoard");
try {
    pstmt = conn.prepareStatement(query);
    pstmt.setString(1, (String)map.get("boardTitle"));
    pstmt.setString(2, (String)map.get("boardContent"));
    pstmt.setInt(3, (int)map.get("categoryCode"));
    pstmt.setInt(4, (int)map.get("boardNo"));
    
    result = pstmt.executeUpdate();
}finally {
    close(pstmt);
}
return result;
}


/** 게시글에 포함된 이미지 목록 조회 DAO
* @param conn
* @param boardNo
* @return fList
* @throws Exception
*/
public List<Attachment> selectBoardFiles(Connection conn, int boardNo)throws Exception {
List<Attachment> fList = null;
String query = prop.getProperty("selectBoardFiles");
try {
    pstmt = conn.prepareStatement(query);
    pstmt.setInt(1,boardNo);
    
    rset = pstmt.executeQuery();
    
    fList = new ArrayList<Attachment>();
    
    while(rset.next()) {
            Attachment at = new Attachment(
                    rset.getInt("FILE_NO"),
                    rset.getNString("FILE_NAME"),
                    rset.getInt("FILE_LEVEL"));
        
            at.setFilePath(rset.getString("FILE_PATH") );
            
            fList.add(at);
    }
    
}finally {
    close(rset);
    close(pstmt);
}

return fList;
}

/** 파일 정보 삽입 DAO
* @param conn
* @param at
* @return result
* @throws Exception
*/
public int insertAttachment(Connection conn, Attachment at) throws Exception {
int result =0;

String query = prop.getProperty("insertAttachment");

try {
    pstmt = conn.prepareStatement(query);
    pstmt.setString(1, at.getFilePath());
    pstmt.setString(2, at.getFileName());
    pstmt.setInt(3, at.getFileLevel());
    pstmt.setInt(4, at.getParentBoardNo());
    
    result = pstmt.executeUpdate();
}finally {
    close(pstmt);
}
return result;
}


/** 파일 정보 수정 DAO
* @param conn
* @param newFile
* @return result
* @throws Exception
*/
public int updateAttachment(Connection conn, Attachment newFile) throws Exception {
int result =0;

String query = prop.getProperty("updateAttachment");

try{
    pstmt = conn.prepareStatement(query);
    pstmt.setString(1, newFile.getFilePath());
    pstmt.setString(2, newFile.getFileName());
    pstmt.setInt(3, newFile.getFileNo());
    
    result = pstmt.executeUpdate();
}finally {
    close(pstmt);
}
return result;
}


board-query.xml

<!-- 게시글 수정  -->
<entry key="updateBoard">
UPDATE BOARD SET
BOARD_TITLE = ?,
BOARD_CONTENT = ?,
CATEGORY_CD = ?,
BOARD_MODIFY_DT = SYSDATE
WHERE BOARD_NO = ?
</entry>


<!-- 게시글에 포함된 이미지 목록 조회 -->
<entry key="selectBoardFiles">
SELECT FILE_NO, FILE_NAME, FILE_LEVEL , FILE_PATH
FROM ATTACHMENT
WHERE PARENT_BOARD_NO = ?
ORDER BY FILE_LEVEL
</entry>


<!-- 파일 정보 삽입  -->
<entry key="insertAttachment">
INSERT INTO ATTACHMENT 
VALUES(SEQ_FNO.NEXTVAL, ?,?,?,?)
</entry>

<!-- 파일 정보 수정  -->
<entry key="updateAttachment">
UPDATE ATTACHMENT SET
FILE_PATH =?,
FILE_NAME =?
WHERE FILE_NO=?
</entry>





태그: , , ,

카테고리:

업데이트:

댓글남기기