글 수정하기

·2024년 11월 11일

스프링

목록 보기
22/33

boardSelectOne은 해당되는 bidx 게시물을 가져오기 때문에 이걸 활요ㅗㅇ해소 가져와야햔다/.

enc타입은 사진이나 문자열, 여러가지 타입을 가져가야 할 때 사용된다.

	<tr>
		<td>첨부파일<input type="file" name="attachfile"></td>
	</tr>

모디파이 jsp파일 가져오기. 이때 우리는 파일 타입과 name을 전에 수정했던 대로 바꿔줘야 한다.

	// 수정하기 화면 
	@RequestMapping(value="boardModify.aws")
	public String boardModify(@RequestParam("bidx") int bidx,Model model){
		
		BoardVo bv = boardService.boardSelectOne(bidx);
		model.addAttribute("bv", bv);
		
		String path="WEB-INF/board/boardModify";
		return path;
	}

1. 컨트롤러에서 화면 기능 구현 하기

2. modify.jsp에서 enc 타입 지정해ㅔ줘야 한다.
이미지와 문자열을 모두 담아서 넘길수 있개 바이너리타입으로 멀티파트로 넘긴다.

	@RequestMapping(value="boardModifyAction.aws")
	public String boardModifyAction(BoardVo bv,Model model){
		
		int value=0;
		
		String path="";
		if(value==0) {
			path = "redirect:/board/boardModify.aws?bidx="+bv.getBidx(); // 실패했으면 해당 키값을 다시 보여줘야 하기 때문에 bidx를 넘거야 한다
		}else {
			path = "redirect:/board/boardContents.aws?bidx="+bv.getBidx();
		}
		return path;
	}

3. BoardController에서 모디파이 액션 메서드를 만드는데 형식부터 만든다.
전송에 실패히면 해당 bidx값을 다시 보여줘야 하기 때문에 ?뒤에 bidx 값을 넘겨줘야 한다.
우리는 bidx값을 bv에 담아뒀기 때문에 ? 뒤에는 그냥 bidx를 적는게 아니라 bv에서 깞을 꺼내줘야 하니까 bv.getBidx()를 적어줘야한다.
처음 만들때는 우선 컨트롤러를 어느정도 구현을 해둬야 서비스로 넘어가서 메서드를 작성해야 한다.

	public int boardUpdate(BoardVo bv);
  1. 보드서비스 가서 메서드 만들기
	// 수정하기 
	@Override
	public int boardUpdate(BoardVo bv) {
		
		int value = bm.boardUpdate(bv); // bv값 넘겨주기 
		return value;
	}
  1. impl가서 구현되지 않은 메서드 만들기
public int boardUpdate(BoardVo bv);
  1. 보드매퍼에서 같은 메서드 만들기.
int value = boardService.boardUpdate(bv); // 서비스에서 만든 메서드 호출하기
  1. 컨트롤러로 가서 서비스에서 만든 메서드를 불러오기
<!-- 게시물 수정 쿼리 --> 
<update id="boardUpdate" parameterType="bv">
update board set subject =#{subject}, contents =#{contents}, writer=#{writer}, modifyday= now(),filename=#{uploadedFilename} 
where bidx=#{bidx} and password=#{password} and midx=#{midx}
</update>
  1. 매퍼,xml에 쿼리 구문 만들기
//게시판에서 글 수정과 파일 업로드 기능을 처리
	@RequestMapping(value= "boardModifyAction.aws")
	public String boardModifyAction(
		BoardVo bv, // 게시글 정보를 담고 있는 BoardVo 객체를 매개변수로 받음
		@RequestParam("attachfile") MultipartFile attachfile, // 업로드된 파일을 받기 위한 MultipartFile 객체
		HttpServletRequest request,
		RedirectAttributes rttr
		) throws Exception { // 윗단에 보고를 하는것
		
		MultipartFile file = attachfile; //저장된 파일 이름 꺼내기 
		String uploadedFileName=""; // 파일이 업로드된 후 저장된 파일명을 저장할 변수
			
		if(! file.getOriginalFilename().equals("")) { // 해당 파일이 존재한다면
			 // 파일을 서버에 저장하고 저장된 파일 이름을 반환받음
			uploadedFileName = UploadFileUtiles.uploadFile(uploadPath, file.getOriginalFilename(), file.getBytes());
		}
		
		String midx = request.getSession().getAttribute("midx").toString();
		int midx_int = Integer.parseInt(midx); 
		String ip = getUserIp(request);
			
		bv.setUploadedFilename(uploadedFileName);  // vo에 담아서 가져가기 
		bv.setIp(ip);
		
		//수정 처리
		int value = boardService.boardUpdate(bv); // 서비스에서 만든 메서드 호출하기
			
		String path="";
		if(bv.getMidx() == midx_int) {
	        if(value == 1) {
	           path = "redirect:/board/boardContents.aws?bidx=" + bv.getBidx();
	        }else {
	             rttr.addFlashAttribute("msg", "비밀번호가 틀렸습니다.");
	             path = "redirect:/board/boardModify.aws?bidx=" + bv.getBidx();
	         }
	     }else {
	         rttr.addFlashAttribute("msg", "자신의 게시글만 수정 할 수 있습니다.");
	         path = "redirect:/board/boardModify.aws?bidx=" + bv.getBidx();
	     }
	            
	     return path; 
}		    
  1. 컨트롤러 가서 완성~

처음에는 bv.setMidx(midx_int)를 넣었는데 왜 이제 넣지 않아도 되는건지? ?

네, bv.setMidx(midx_int)를 따로 호출하지 않는 이유는 modify.jsp에서 로 이미 midx 값이 폼 데이터로 전달되기 때문입니다. 이 히든 필드는 boardModifyAction 메서드에서 BoardVo bv 객체의 midx 속성에 자동으로 매핑되어 전달되므로, 컨트롤러 메서드 안에서 bv.setMidx(midx_int)를 다시 호출할 필요가 없습니다.

이 과정이 이루어지는 원리는 Spring MVC의 데이터 바인딩 덕분입니다. HTTP 요청에서 전송된 파라미터 값들이 컨트롤러 메서드의 파라미터에 매핑될 때, @ModelAttribute나 기본적인 바인딩을 통해 bv 객체의 midx 필드에 값을 자동으로 주입하게 됩니다.

요약하자면
modify.jsp에서 미리 설정한 로 인해, midx 값이 BoardVo 객체에 자동으로 들어가므로 boardModifyAction 메서드에서 bv.setMidx(midx_int)를 다시 호출할 필요가 없습니다.

추가로, bv.getMidx()가 현재 로그인한 사용자의 midx_int와 일치하는지 확인하는 로직(if(bv.getMidx() == midx_int))은 글 작성자와 수정 요청 사용자가 같은지 검사하는 중요한 보안 절차입니다. 이를 통해 다른 사용자가 임의로 게시글을 수정하지 못하게 할 수 있습니다.

0개의 댓글