8/31/2019

스프링 게시판 만들기 #7. 게시물 수정 구현

board 하위의 write.jsp를 복사/붙여넣기(Ctrl+C/V)를 하면 파일이 복사되며 이름을 입력할 수 있습니다. modify.jsp를 입력하고 확인(OK)버튼을 클릭합니다.

수정용 페이지니까, 그게 맞게 약간 수정해줍니다.

컨트롤러(controller)에 게시물 수정용 겟(get) 메서드를 추가합니다.

// 게시물 수정
@RequestMapping(value = "/modify", method = RequestMethod.GET)
public void getModify() throws Exception {

}

조회 페이지에서 수정 페이지로 이동할 수 있도록, view.jsp에 태그를 추가합니다.

<div>
<a href="/board/modify?bno=${view.bno}">게시물 수정</a>
</div>

조회 페이지에 추가된 링크를 클릭해서 수정 페이지로 이동할 수 있습니다.

내용이 텅 비어있으니 내용을 채워줘야합니다.

굳이 새로 만들 필요없이, 게시물 조회 구현에서 사용된 메서드를 그대로 이용하면 됩니다.

게시물 조회에서 사용한 동일한 코드입니다.

// 게시물 수정
@RequestMapping(value = "/modify", method = RequestMethod.GET)
public void getModify(@RequestParam("bno") int bno, Model model) throws Exception {

 BoardVO vo = service.view(bno);
   
 model.addAttribute("view", vo);
}

인풋(input)과 텍스트에어리어(textarea)에 모델의 데이터를 넣어줍니다.

프로젝트를 시작하고 수정 페이지에 접속해보면, 내용이 들어가있는것을 확인할 수 있습니다.

이제 DBMS에서 수정용 쿼리를 작성해보고, 확인해봅니다.

작성한 쿼리문을 매퍼(mapper)에 추가합니다.

<!-- 게시물 수정 -->
<update id="modify" parameterType="com.board.domain.BoardVO" >
 update tbl_board
  set
   title = #{title},
   content = #{content},
   writer = #{writer}
  where bno = #{bno}
</update>

BoardDAO와 BoardDAOImpl에 코드를 추가합니다.

// 게시물 수정
public void modify(BoardVO vo) throws Exception;
// 게시물 수정
@Override
public void modify(BoardVO vo) throws Exception {
 sql.update(namespace + ".modify", vo);
}

BoardService와 BoardServiceImpl에 코드를 추가합니다.

// 게시물 수정
public void modify(BoardVO vo) throws Exception;
// 게시물 수정
@Override
public void modify(BoardVO vo) throws Exception {
  
 dao.modify(vo);
}

다음은 컨트롤러에 포스트(post) 메서드를 추가합니다.

// 게시물 수정
@RequestMapping(value = "/modify", method = RequestMethod.POST)
public String postModify(BoardVO vo) throws Exception {

 service.modify(vo);
   
 return "redirect:/board/view?bno=" + vo.getBno();
}

service.modify(vo); 에서 뷰에서 컨트롤러로 넘어온 데이터(BoardVO)를 이용해 수정을 끝내고, return "redirect:/board/view?bno=" + vo.getBno();에서 현재 bno에 해당되는 조회 페이지로 이동되도록 했습니다.

제대로 작동되는지 확인하기 위해, 수정 페이지에서 내용을 수정한 뒤 완료 버튼을 클릭합니다.

정상적으로 수정된걸 확인할 수 있습니다.

게시물 수정
  1. 진짜 정말정말 감사합니다!!
    이런 귀중한 자료.. ㅏㅎ악하악

    답글삭제
  2. 익명5/28/2020

    워낙 친절하게 설명을 잘 해주셔서 기초 예제 만드는데 많은 도움이 되고 있습니다.
    감사합니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      이번 프로젝트가 끝나는 5월말이나 6월초..아 벌써 5월말이니; 6월초부터 주기적으로 작성하겠습니다..ㅠㅠ

      삭제
  3. 안녕하세요 정말 친절하게 설명해주셔서 하나하나 잘 따라하고 있습니다.
    궁금한것이 있는데요. 서버 모듈에서 /로바꾼다음
    모든 a링크에 /board/write이런식으로 링크를 걸고 컨트롤러에서 맵핑을 작성자님처럼 하는것이
    전형적인 스프링에서의 맵핑방법인가요?
    맵핑하는 방법이 하도많아서 뭐가 정형화된 방법인지 모르겠습니다.ㅠㅠ
    그리고 css는 논외로 백엔드로만 보면 실무에서 이정도의 코딩을 쓰나요??
    사실 대부분의 홈페이지들이 대부분 데이터의 이동이고 게시판정도가 crud의 정석인거 같은데
    딱 작성자님처럼 코딩을하면 그럴듯한 게시판이 완성되고 그것들은 저희들이 대부분사용하는사이트와 디자인만 다를 뿐 이지 기능은 거의 비슷하다고 느끼는데요,
    실제로 쇼핑몰을 운영하거나 서비스사이트를 운영하는 회사들은 이정도의 백엔드코딩만을 사용하는건 아닐것같아서 여쭤봅니다!(사실 이정도는 암기만으로도 가능하다고 느껴지는 부분이라ㅠㅠ)
    만약 글쓴이님이 글올리신 아작스배열정보 주고받는거정도까지 자유자재로 할 수 있다면 무엇을 더 공부하는게 좋을까요 스프링에서??조언 부탁드립니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      첫번째로
      컨트롤러에 매핑(/board/)해주고, 컨트롤러 하위의 메서드에 또다시 매핑(/writer) 하거나
      컨트롤러의 하위에 매핑만(/board/writer)하는등의 방법이 있습니다.

      전형적이라면 전형적일텐데, 질문하시는게 명확히 어느부분인지 잘 모르겠네요.


      두번째로
      이 블로그는 입문자를 대상으로하기 때문에 블로그 본문에 나온 코드들은 실무에서 쓰는것과는 많이 비어있고, 말그대로 crud를 다루는 정도의 코드로 되어있습니다.

      그렇다고해서 실무에서는 비교도 안될 정도로 복잡한 코드는 사용하지 않고, 몇가지의 로직이 추가되는 형태라고 보시면 되겠습니다.


      세번째로

      스프링(그외에 웹 포함)으로 공부를 한다면, 일단 프로젝트를 만들어보시는게 좋을거라 생각합니다.
      마땅한 아이디어가 없어도, 주로 접속하시는 사이트가 있다면 그걸 그대로 따라 만드셔도 됩니다. (물론, 실제로 서비스하거나 웹에 올릴때에는 저작권등을 살펴봐야겠지요)

      삭제
  4. 이해가 안되는 것이 있습니다. modify.jsp에서 form의 action="/board/modify" methos="post" 라고 하면 왜 view에서
    /board/view?bno=0 이러고 뜨면서 제대로 불러외 못하는 걸까요? action을 빼면 제대로 뜨더라고요 이해가 안되서 질문 드립니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      게시물 본문에서는 게시물의 고유 번호, 즉 bno를 form이 아닌 url을 통해서 보내주고 있습니다.
      그렇기 때문에 조회 페이지에서 modify?bno=99 이런식으로 넘어왔지요.

      만약, form을 이용하여 수정을 하고싶으신 경우
      form에 <input type="hidden" name="bno" value="??"> 처럼
      인풋박스를 추가해주고, 그 인풋박스에 bno의 값을 넣어주어야 정상적으로 동작이 됩니다.

      삭제
  5. ╰(*°▽°*)╯ 감사해요

    답글삭제
  6. 다 했는데 500 오류 뜨면

    mapper 설정하실때 tbl_board 를 board.tbl_board로 수정하니까 잘 되네요

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      db 스키마(board)를 지정해야할 경우, 말씀하신대로 mapper에서 설정해주셔도 되나
      db접속 설정 파일에서 [ip]:[port]/[스키마] 처럼 입력해두면 mapper에서 입력하지 않아도 됩니다.

      삭제
  7. Form에서 boardVO를 오토매틱으로 자동 할당되게 하려면 form 의 id를 일치 시켜야 하나요 아니면 name를 일치시켜야 하나요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      각 항목의 name을 일치시켜주시면 됩니다.

      삭제
  8. write.jsp의 폼에는 bno가 없는데 어떻게 데이터가 넘어오는 거죠?

    답글삭제
    답글
    1. get에서 넘겨준 boardvo에서 name으로 boardvo와 동일한 변수명을 가진것만 덮어씌워지고 post로 되돌아오는 메커니즘 인가요??

      삭제
    2. 안녕하세요? 방문해주셔서 감사합니다.

      bno는 form에 없으나, url에 있는 값이므로 @RequestParam("bno") int bno를 이용하여 받을 수 있습니다.

      삭제
  9. 익명8/21/2023

    선생님 깊은 감사를 드립니다!!!!!!!

    답글삭제