65. Spring으로 게시물 수정하기 2

hanahana·2022년 9월 14일
0

Spring 학원수강

목록 보기
19/45
post-thumbnail

jsp를 먼저 확인한다

<h1 align="center">${board.boardNo }번 게시물 수정하기</h1>
	<br>
	<br>
	
	
	<!-- enctype을 이용해 파일을 전송한다 오타조심!!!!-->
	<form action="/board/modify.kh" method="post"	enctype="multipart/form-data">
	<input type="hidden" name="boardNo" value="${board.boardNo }" readonly>
	<input type="hidden" name="boardRename" value="${board.boardRename }">
	<input type="hidden" name="boardFile" value="${board.boardFile }">
	<input type="hidden" name="boardFildpath" value="${board.boardFildpath }">
		<table align="center" border="1">
			<tr>
				<td>제목</td>
				<td><input type="text" name="boardTitle" value="${board.boardTitle }" required="required"></td>
			</tr>
			<tr>
				<td>작성자</td>
				<td><input type="text" name="boardWirter" value="${board.boardWirter }" readonly="readonly"></td>
			</tr>
			<tr>
				<td>내용</td>

				<td><textarea id="summernote" name="boardContents"
						style="resize: none; width: 500px; height: 100%;" required="required"> ${board.boardContents }</textarea></td>
			</tr>
			<tr>
				<td>첨부파일</td>
				<td><input type="file" name="reloadFile">
				<a href="#"> ${board.boardFile }</a>

				</td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="등록"> <input
					type="reset" value="취소">
					<a href="#">목록으로</a>
					<a href="#">이전페이지로</a>
					</td>
			</tr>

		</table>

	</form>
  • 첨부파일을 체크하기위해 필요한 변수들이 있다. 그 변수들을 hidden을 통해 미리 다 가져와야 한다.
    • <input type="hidden" name="boardRename" value="${board.boardRename }">
      <input type="hidden" name="boardFile" value="${board.boardFile }">
      <input type="hidden" name="boardFildpath" value="${board.boardFildpath }">
  • 첨부파일을 받을수있는 input의 이름을 reloadFile로 교체하엿

controller에서 수정한 게시글을 처리한다.

/**
	 * 게시글 수정
	 * @param mv
	 * @param board
	 * @return
	 */
	@RequestMapping (value="/board/modify.kh", method = RequestMethod.POST)
	public ModelAndView modifyBoard(ModelAndView mv,
			@ModelAttribute Board board,
//1
			@RequestParam(value="reloadFile", required=false) MultipartFile reloadFile,
			HttpServletRequest request) {
//2
		try {
			String boardFilename = reloadFile.getOriginalFilename();
 			if(reloadFile != null && !boardFilename.equals(""))//새로 파일을 올렸을때, 이름이 없는 파일이 있을 경우를 생각해 null체크 2번함
			{//수정 할경우 대체/ 삭제 후 등록/ 대체는 어려워서 삭제후 등록으로 한다
				String root = request.getSession().getServletContext().getRealPath("resources");// 저장된 파일의 경로를 가져온다.
				String savedPath = root + "\\buploadFiles"; //가져온 경로에 업로드 파일이 들어있는 폴더의 경로까지 더해줌
				File file = new File(savedPath+"\\"+board.getBoardRename()); //이미 저장한 파일의 이름을 가져와야 한다.
//3				
				if(file.exists()) { //지정한 파일이 있는지 없는지 체크
					file.delete(); //있으면 삭제
				}
				
//4
				//////////여기부터 파일 재 업로드/////////////////////
				//파일 이름으로 업로드하면 파일이름이 겹치면 파일이 겹쳐서 사라진다.
				//고유한 rename으로 변경해주어야 한다.
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
				String boardRename = sdf.format(new Date(System.currentTimeMillis()))+"."+boardFilename.substring(boardFilename.lastIndexOf(".")+1);
				
				reloadFile.transferTo(new File(savedPath + "\\" + boardRename));
				board.setBoardFile(boardFilename);
				board.setBoardRename(boardRename);
				board.setBoardFildpath(savedPath + "\\" + boardRename);
				
				
			}
			
		int result = bService.modifyBoardOneByNo(board);
				
			mv.setViewName("redirect:/board/detail.kh?boardNo="+board.getBoardNo());
		
		}catch (Exception e) {
			mv.addObject("mgs",e.getMessage());
			mv.setViewName("/common/errorPage");
		}
		return mv;
	}
  1. @RequestParam(value="reloadFile", required=false) MultipartFile reloadFile

    1. 파일을 업로드 하기 위한 매개변수이다 required=false는 null이어도 상관없다는 뜻이다.
    2. input type file의 name인 reloadFile를 value로 설정한다.
  2. 업로드한 파일의 이름을 변수로 초기화 해주고 업로드한 파일이 있는지 없는지 체크한다.

    String boardFilename = reloadFile.getOriginalFilename();
     			if(reloadFile != null && !boardFilename.equals(""))//새로 파일을 올렸을때, 이름이 없는 파일이 있을 경우를 생각해 null체크 2번함
    			{//수정 할경우 대체/ 삭제 후 등록/ 대체는 어려워서 삭제후 등록으로 한다
    				String root = request.getSession().getServletContext().getRealPath("resources");// 저장된 파일의 경로를 가져온다.
    				String savedPath = root + "\\buploadFiles"; //가져온 경로에 업로드 파일이 들어있는 폴더의 경로까지 더해줌
    				File file = new File(savedPath+"\\"+board.getBoardRename()); //이미 저장한 파일의 이름을 가져와야 한다.
    • boardFilename은 수정페이지에서 새로 업로드한 파일의 이름이다
    • 만약 업로드한 팔이 있을때
      • 세션과 서블릿을 이용해 resource폴더가 있는 경로를 찾는다.
      • 그 경로에 buploadFiles라는 경로를 변수로 선언한다
        • 등록시에는 이 경로가 있는지 없는지 체크하여 buploadFiles를 생성하였지만 이번에는 수정이기에 하지 않는다
      • file변수에 해당 경로에 저장된 이전 파일의 경로와 이름을 저장한다.
        • 이름은 아까 jsp에 hidden을 이용해 전달해두어서 가져올수있다.
          • board안에 저장되어 board인스탠스에 getter 메소드를 이용해 가져올수있다.
  3. file에 있는 이전 파일이 있는지 없는지 체크하고 있으면 삭제한다.

    1. if(file.exists()) { file.delete(); }
  4. 새롭게 올린 파일을 다시 저장해준다.

    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    	String boardRename = sdf.format(new Date(System.currentTimeMillis()))+"."+boardFilename.substring(boardFilename.lastIndexOf(".")+1);
    				
    				reloadFile.transferTo(new File(savedPath + "\\" + boardRename));
    				board.setBoardFile(boardFilename);
    				board.setBoardRename(boardRename);
    				board.setBoardFildpath(savedPath + "\\" + boardRename);
  • SimpleDateFormat을 이용해 현재 날짜와 시간을 이용해 새롭게 파일 이름을 만든다.
  • 파일이름은 현재 파일의 확장자를 .을 기준으로 반단해 시분초.확장자로 최종적으로 만들어진다.
  • transferTo코드와 File코드를 이용해 buploadFiles경로에 새로운 파일을 저장한다.
  • 파일의 새로운이름, 원래이름, 경로를 board클래스에 저장한다.

Servic Store Mapper

Serivce

@Override
	public int modifyBoardOneByNo(Board board) {
		int result = bStore.updateBoardOneByNo(board, session);
		return result;
	}
  • jsp에서 수정한 값은 controller에서 처리되어 board안에 담기고 service는 이 값과 session을 store로 보낸다

Store

@Override
	public int updateBoardOneByNo(Board board, SqlSessionTemplate session) {
		int result = session.update("BoardMapper.modifyBoard",board);
		
		return result;
	}
  • 스토어는 받은 값을 Mapper에 해당 namespace와 id로 매개변수의 값과 전달하여 DB에 필요한값을 update하도록한다

Mapper

<update id="modifyBoard">
		update board_tbl set board_title = #{boardTitle}, BOARD_CONTENTS =
		#{boardContents}, B_UPDATE_DATE = default, BOARD_FILE = #{boardFile},
		BOARD_FILDPATH= #{boardFildpath}, BOARD_RENAME=#{boardRename} where
		BOARD_NO = #{boardNo}
	</update>
  • 이전(https://velog.io/@hana78786/64.-spring으로-게시물-수정하기)과 쿼리문이 많이 달라졌다.
  • controller에서 저장한 boardFile, boardFilepath, boardRename을 저장해주었다.
  • 만약 수정하면서 파일을 새롭게 바꾸지 않았다면 원래 저장되어있던 board의 값을 다시 올려주어 바뀌는 부분이 없을것이다.
profile
hello world

0개의 댓글