BACKEND/Spring

DB연결 - 책 수정 화면 (UPDATE)

죠으닝 2023. 10. 20. 10:35

 

 

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