BookController 에 수정 컨트롤러 추가
@GetMapping("/update")
// 책 수정 컨트롤러 , Model은 데이터 전달 객체
public String update(@RequestParam Map<String, Object> map, Model model) {
Map<String, Object> detailMap = bookService.detail(map);
model.addAttribute("data", detailMap);
return "/book/update";
}
create.jsp 페이지를 복사해서 update.jsp를 만든다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>책 수정</h1>
<form method="POST">
<p>제목 : <input type="text" name="title" value="${ data.title }" /></p>
<p>카테고리 : <input type="text" name="category" value="${ data.category }" /></p>
<p>가격 : <input type="text" name="price" value="${ data.price }" /></p>
<p><input type="submit" value="저장" />
</form>
</body>
</html>
실행해서 확인해본다.
현재 bookId = 7인 책의 상세정보임
여기서 수정을 클릭하면 해당 책의 bookId를 가지고 update로 이동한다.
update.jsp
기존 DB에 저장되어있는 정보들이 출력됨
update페이지를 보면 form에 action이 없다.
그러면 submit 버튼 누를 시 POST로 현재 페이지로 전달됨.
그래서 컨트롤러에 updatePost 메소드 만들어줘야함 .
쿼리문 작성이 필요하다.
book_SQL.xml에 update추가
<!-- UPDATE 쿼리문 -->
<update id="update" parameterType="hashMap">
<![CDATA[
UPDATE book SET
title = #{title},
category = #{category},
price = #{price}
WHERE
book_id = #{bookId}
]]>
</update>
sql 작성하면 -> DAO에 간다.
BookDAO 에서 update추가
//책 수정
public int update(Map<String, Object> map) {
return sqlSessionTemplate.update("book.update",map);
}
DAO -> service로 간다
BookServiceImple
//책 수정
@Override
public boolean edit(Map<String, Object>map) {
int affectRowCount = this.bookDao.update(map);
return affectRowCount == 1; //정상적으로 업데이트 시 true 리턴함
}
수정의 경우 입력과는 다르게 PK를 가져오거나 하는 절차가 필요없으므로 그저 1개의 행이 제대로 영향받았는지만 검사하면 된다.
인터페이스는 자동으로 만들어주기 => override 작성하면 오류 뜸 -> 인터페이스 만들어주면 오류 사라짐
package com.demo.sample;
import java.util.Map;
public interface BookService {
String create(Map<String, Object> map);
Map<String, Object> detail(Map<String, Object> map);
boolean edit(Map<String, Object> map);
}
service -> controller post 메소드 추가
@PostMapping("/update")
public String updatePost(@RequestParam Map<String, Object> map, Model model) {
boolean isUpdateSuccess = this.bookService.edit(map);
if(isUpdateSuccess) {
String bookId = map.get("bookId").toString();
return "redirect:/detail?bookId=" + bookId;
}else {
return "/book/update";
}
}
테스트하기
아까 이 책을 아래와 같이 수정한다.
저장 버튼 누르면 책 상세 페이지로 넘어간다.
db확인
정리하기
책 수정 화면에서 책 수정 기능으로 보내주는 파라미터는 총 4개다.
하나는 GET 파라미터로 전달되는 bookId다.
나머지 세개는 <form> 태그를 통해 전달되는 title, category, price다.
스프링은 http 메소드가 GET인지 POST인지 상관하지 않고 @RequestMapping 어노테이션이 있으면
무조건 파라미터를 넣어준다. 따라서 파라미터 map 안에는 4개 데이터가 다 들어있다.
map 데이터 예시는 아래와 같다.
{
"bookId": 1,
"title": "제목 수정",
"category": "IT",
"price", "10000"
}
정상적으로 데이터가 갱신되었을 경우 확인을 위해 상세 페이지로 이동하면 된다.
비정상이면 다시 그전 수정페이지로 이동
https://blog.naver.com/drv982/222914706942
'BACKEND > Spring' 카테고리의 다른 글
DB연결 - 책 목록 보기 (SELECT) (1) | 2023.10.20 |
---|---|
DB연결 - 책 삭제하기 (DELETE) (0) | 2023.10.20 |
DB연결 - 책 상세 보기 (SELECT) (0) | 2023.10.19 |
DB연결 - 책 입력 기능(INSERT) (0) | 2023.10.19 |
LegacyProject 시작하기 , DB 연결을 위한 라이브러리 추가 (1) | 2023.10.19 |