@Repository
public interface BookRepository {
public void deleteById(Long id);
}
<delete id="deleteById">
DELETE FROM BOOK WHERE ID=#{id}
</delete>
public void remove(Long id){
bookRepository.deleteById(id);
}
// 책 삭제
@DeleteMapping("/book/{id}") //?id=1
// <Rest API 명세서>
// request(요청)
// DELETE : http://localhost:8081/s02/api/book/{id}
// id : 삭제할 책 번호
// response(응답) : Ok
public String remove(@PathVariable Long id){
bookService.remove(id);
return "Ok";
}

html+="<td><button class='btn btn-sm btn-warning' onclick='goDelete("+book.id+")'>삭제</button></td>";
// 백틱이용시
// html+=`<td><button class='btn btn-sm btn-success' onclick='goDelete("${book.id}")'>삭제</button></td>`;
function goDelete(id){
console.log(id);
// DELETE : http://localhost:8081/s02/api/book/{id}
let deleteURL="http://localhost:8081/s02/api/book/"+id;
fetch(deleteURL,{
method : "DELETE"
})
.then(response=>{
if(!response.ok){ // ok=true, false
throw new Error("Network response was not ok");
}
// 다시 리스트 페이지로~~
location.href="/s02/list";
})
.catch(error=>{
console.log(error);
});
}

<button class="btn btn-primary btn-sm" onclick="toggle()">등록</button>
<div id="book_register" class="mt-4" style="display:none;">
<!-- 책 등록 폼 -->
<form>
<div class="form-group">
<label for="title">제목:</label>
<input type="text" class="form-control" placeholder="Enter title" name="title" id="title">
</div>
<div class="form-group">
<label for="price">가격:</label>
<input type="number" class="form-control" placeholder="Enter price" name="price" id="price">
</div>
<div class="form-group">
<label for="author">저자:</label>
<input type="text" class="form-control" placeholder="Enter author" name="author" id="author">
</div>
<div class="form-group">
<label for="page">페이지:</label>
<input type="number" class="form-control" placeholder="Enter page" name="page" id="page">
</div>
<button type="submit" class="btn btn-primary btn-sm" onclick="register()">등록</button>
<button type="reset" class="btn btn-danger btn-sm">취소</button>
</form>
function toggle() {
var reviewForm = document.getElementById("book_register");
if (reviewForm.style.display === "none" || reviewForm.style.display === "") {
reviewForm.style.display = "block";
} else {
reviewForm.style.display = "none";
}
}

function register(){
// title, price, author, page -> JSON으로 변경
let title = document.getElementById("title").value;
let price = document.getElementById("price").value;
let author = document.getElementById("author").value;
let page = document.getElementById("page").value;
// Object
let formData = {
title : title,
price : price,
author : author,
page : page
}; // Dic
console.log(formData); // Object -> JSON(String)
// POST : http://localhost:8081/s02/api/book
fetch("http://localhost:8081/s02/api/book", {
method : "POST",
headers : {
"Content-Type" : "application/json"
},
body : JSON.stringify(formData)
})
.then(response=>{
if(!response.ok){ // ok=true, false
throw new Error("Network response was not ok");
}
location.href="/s02/list";
})
.catch(error=>{
console.log(error);
});
}

// 책 상세보기
@GetMapping("/book/{id}")
/* request(요청)
GET : http://localhost:8081/s02/api/book/{id}
id : 책번호
response(응답) : {"id":2,"title":"Python","price":40000,"author":"사과파이","page":400}
*/
public Book getByBook(@PathVariable long id){
// Book book = bookService.view(id);
return bookService.view(id);
}

html+=`<td><a href="/s02/view/${book.id}">${book.title}</a></td>`;
// 책 상세보기
@GetMapping("/view/{id}")
public String view(@PathVariable Long id, Model model){
model.addAttribute("id",id);
return "view"; // view.jsp
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>view</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="${cpath}/resources/js/view.js"></script>
<script>
bookView("${id}");
</script>
</head>
<body>
<div class="container mt-4">
<h2>Restful Service(SOA), Rest API</h2>
<div class="card mt-3">
<div class="card-header">Book</div>
<div class="card-body" id="bookView">
</div>
<div class="card-footer">AISCHOOL2024 - Fighting :]</div>
</div>
</div>
</body>
</html>
function bookView(id){
console.log(id);
// GET : http://localhost:8081/s02/api/book/{id}
fetch("http://localhost:8081/s02/api/book/"+id)
.then(response=>response.json())
.then(book=>{
let html="";
html+="<table class='table table-bordered'>";
html+="<tr>";
html+="<td>번호</td>"
html+=`<td>${book.id}</td>`
html+="</tr>";
html+="<tr>";
html+="<td>제목</td>"
html+=`<td>${book.title}</td>`
html+="</tr>";
html+="<tr>";
html+="<td>가격</td>"
html+=`<td>${book.price}</td>`
html+="</tr>";
html+="<tr>";
html+="<td>저자</td>"
html+=`<td>${book.author}</td>`
html+="</tr>";
html+="<tr>";
html+="<td>페이지</td>"
html+=`<td>${book.page}</td>`
html+="</tr>";
html+="</table>"
document.getElementById("bookView").innerHTML=html;
})
.catch(error=>{
console.log(error);
});
}