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);
// 수정하기
@Override
public int boardUpdate(BoardVo bv) {
int value = bm.boardUpdate(bv); // bv값 넘겨주기
return value;
}
public int boardUpdate(BoardVo bv);
int value = boardService.boardUpdate(bv); // 서비스에서 만든 메서드 호출하기
<!-- 게시물 수정 쿼리 -->
<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>
//게시판에서 글 수정과 파일 업로드 기능을 처리
@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;
}
처음에는 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))은 글 작성자와 수정 요청 사용자가 같은지 검사하는 중요한 보안 절차입니다. 이를 통해 다른 사용자가 임의로 게시글을 수정하지 못하게 할 수 있습니다.