스프링 MVC

준비중..

스프링 MVC

스프링을 사용한 웹서비스 만들기

09 데이터 수정하기(update)

# 데이터 수정하기(update) ### 이번 수업 개요 저장된 데이터를 수정하여, 다시 DB에 저장해보도록 하겠습니다. ![Imgur](https://i.imgur.com/rH3cs38.png) ### URL 만들기 데이터 수정페이지로 이동할 수 있도록 URL을 만들어 줍니다. + 수정페이지 URL : /books/edit/{id} 만들어진 URL로 접속할 수 있도록 `index.jsp`페이지에 링크를 추가해줍시다. **views/books/index.jsp** ```jsp ... <div class="row"> <c:forEach var="book" items="${books}" varStatus="status"> <div class="col-md-4"> <div class="thumbnail"> <img src="${ book.image }" /> <div class="caption"> <h3>${ book.title } <small>${ book.author }</small></h3> <a href="<c:url value='/books/edit/${ book.id }' />" class="btn btn-info">수정</a> </div> </div> </div> </c:forEach> </div> ... ``` ![Imgur](https://i.imgur.com/iN1VvRL.png) > 전체 소스코드가 궁금하신 분은 [이전수업](http://cloudstudying.kr/lectures/121)을 참조하세요 ### 수정페이지 만들기 수정하기위핸 페이지인 `edit.jsp` 파일을 만들어 줍니다. **views/books/edit.jsp** ```jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page pageEncoding="utf-8" session="false"%> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="<c:url value="/css/bootstrap.min.css" />" rel="stylesheet"> <title>Books EDIT</title> </head> <body> <div class="container"> <div class="jumbotron"> <h1>Books EDIT</h1> <p>views/books/edit.jsp</p> </div> </div> </body> </html> ``` ### 수정페이지와 URL 연결시키기 BooksController의 edit() 메소드를 만들고 URL을 부여 한 뒤, `edit.jsp` 페이지를 연결시켜줍니다. **BooksController.java** ```java ... @RequestMapping(value = "/books/edit/{id}", method = RequestMethod.GET) public String edit(@PathVariable int id) { return "books/edit"; } ... ``` > @PathVariable 어노테이션은 URL로부터 변수 값을 받아올 수 있게 합니다. 연결이 잘 되었는지 확인해줍니다. ![Imgur](https://i.imgur.com/2INoJ49.png) ### 수정페이지 폼 추가하기 수정페이지(`edit.jsp`)에 폼 태그를 추가해줍니다. 수정페이지는 생성페이지(`new.jsp`)와 거의 흡사합니다. 따라서 생성페이지에서 폼태그를 복사해서 붙여넣어 준 뒤, 폼 태그 action 속성의 값을 바꾸어 줍니다. **views/books/edit.jsp** ```jsp ... <body> <div class="container"> <div class="jumbotron"> <h1>Books EDIT</h1> <p>views/books/edit.jsp</p> </div> <!-- action 값을 잘 설정해 주세요 --> <form action="<c:url value='/books/update' />" method="post"> <div class="form-group form-group-lg"> <label class="control-label">도서 제목</label> <input name="title" type="text" class="form-control"> </div> <div class="form-group form-group-lg"> <label class="control-label">저자</label> <input name="author" type="text" class="form-control"> </div> <div class="form-group form-group-lg"> <label class="control-label">이미지</label> <input name="image" type="text" class="form-control"> </div> <button type="submit" class="btn btn-lg btn-primary">전송</button> </form> </div> </body> ... ``` 추가로 폼 전송버튼위에 히든인풋을 만들어 주어 데이터의 id값을 저장 하도록 합니다. (데이터 등록의 경우, id를 DB에서 자동적으로 만들어 주기때문에 폼 데이터에 id값을 가지고 있지 않음. 하지만 데이터 수정의 경우, id값이 있어야 수정을 할 수 있음) **views/books/edit.jsp** ```jsp ... <input name="id" type="hidden"> <button type="submit" class="btn btn-lg btn-primary">전송</button> ... ``` ![Imgur](https://i.imgur.com/2INoJ49.png) ### 수정 페이지 값 불러오기 수정페이지에서 이전 데이터를 출력하게 해줍시다. 컨트롤러에서 맵퍼를 사용해 데이터를 가져오게 합니다. **BooksController.java** ```java @RequestMapping(value = "/books/edit/{id}", method = RequestMethod.GET) public String edit(@PathVariable int id) { // id 값을 통해 데이터를 가져옴 Book book = bookMapper.getBook(id); return "books/edit"; } ``` BookMapper에 `getBook()` 메소드를 생성하여 에러를 없애줍니다. **BookMapper.java** ```java package com.mycompany.mapper; import java.util.List; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import com.mycompany.vo.Book; public interface BookMapper { @Insert("insert into books (title, author, image) values (#{title}, #{author}, #{image})") public boolean create(Book book); @Select("select * from books") public List<Book> getList(); @Select("select * from books where id = #{id}") public Book getBook(int id); } ``` 이제 맵퍼를 통해 가져온 데이터를 뷰 페이지로 전달해줍시다. **BooksController.java** ```java @RequestMapping(value = "/books/edit/{id}", method = RequestMethod.GET) public String edit(@PathVariable int id, Model model) { Book book = bookMapper.getBook(id); // 뷰 페이지로 데이터를 전달(key/value 형식) model.addAttribute("book", book); return "books/edit"; } ``` 가져온 데이터를 수정페이지에서 출력하도록 해줍니다. 각각의 인풋 태그의 value 값을 적어주세요. **views/books/edit.jsp** ```jsp ... <form action="<c:url value='/books/update' />" method="post"> <div class="form-group form-group-lg"> <label class="control-label">도서 제목</label> <input name="title" type="text" class="form-control" value="${ book.title }"> </div> <div class="form-group form-group-lg"> <label class="control-label">저자</label> <input name="author" type="text" class="form-control" value="${ book.author }"> </div> <div class="form-group form-group-lg"> <label class="control-label">이미지</label> <input name="image" type="text" class="form-control" value="${ book.image }"> </div> <input name="id" type="hidden" value="${ book.id }"> <button type="submit" class="btn btn-lg btn-primary">전송</button> </form> ... ``` 잘 수행되는지 확인해 봅시다. ![Imgur](https://i.imgur.com/MulIybI.png) ### 폼데이터 받아오기 수정을 위한 폼 태그는 action의 값에 적혀있는 URL로 데이터를 전송합니다. BooksController에 `update()` 메소드를 추가하여 데이터를 받아봅시다. **BooksController.java** ```java ... @RequestMapping(value = "/books/update", method = RequestMethod.POST) public String update(@ModelAttribute Book book) { System.out.println(book.toString()); return ""; } ... ``` 잘 받아지는지 확인해 볼까요? ![Imgur](https://i.imgur.com/t4tEACK.png) 골뱅이(`@`)들이 잘 추가되어 전달되었네요~ ![Imgur](https://i.imgur.com/otTffIS.png) ### DB 수정하기 수정할 데이터도 다 받아왔으니, 맵퍼를 사용해 DB를 수정해줍시다. **BooksController.java** ```java ... @RequestMapping(value = "/books/update", method = RequestMethod.POST) public String update(@ModelAttribute Book book) { bookMapper.update(book); return ""; } ... ``` BookMapper 인터페이스에 `update()` 메소드를 추가합니다. **BookMapper.java** ```java ... @Update("update books set title = #{title}, author = #{author}, image = #{image} where id = #{id}") public boolean update(Book book); ... ``` 데이터 수정이 끝나면, 인덱스 페이지를 볼 수 있게 해줍시다. **BooksController.java** ```java ... @RequestMapping(value = "/books/update", method = RequestMethod.POST) public String update(@ModelAttribute Book book) { bookMapper.update(book); return "redirect:/books"; } ... ``` ### 잘 동작하는지 확인해 봅시다 기본 페이지에서 수정 버튼을 클릭합니다. ![Imgur](https://i.imgur.com/0mcmUrT.png) 마지막 책의 제목과 저자, 그리고 이미지주소를 변경해 주었습니다. ![Imgur](https://i.imgur.com/zxER96I.png) 책 정보가 수정되고 리다이렉트된 결과화면입니다! ![Imgur](https://i.imgur.com/rtrh4VQ.png)