티스토리 뷰

정리 노트/Spring

Spring Chapter17 [18-1]

eyoadgkn 2024. 2. 5. 10:07

데이터베이스 연동
데이터 삽입, 수정, 삭제

 


CRUD 메서드를 사용해 신규 도서 삽입하기

BookRepositoryImpl.java //수정

public void setNewBook(Book book) {
		// TODO Auto-generated method stub
		
		String SQL = "INSERT INTO book (b_bookId, b_name, b_unitPrice, b_author,"
				+ "b_description, b_publisher, b_category, b_unitsInStock, b_releaseDate,"
				+ "b_condition, b_fileNmae" + "VALUES(?,?,?,?,?,?,?,?,?,?,?)";
		
		template.update(SQL, book.getBookId(),book.getName(),book.getUnitPrice(),
				book.getAuthor(), book.getDescription(), book.getPublisher(), book.getCategory(),
				book.getUnitsInStock(),book.getReleaseDate(),book.getCondition(),book.getFileName());
		
	}

BookController.java

	@PostMapping("/add")
	public String submitAddNewBook(@Valid @ModelAttribute("NewBook") Book book, BindingResult result, HttpServletRequest request) 
	{
		if(result.hasErrors())
		{
			return "addBook";
		}
		
		MultipartFile bookImage = book.getBookImage();
		
		String saveName = bookImage.getOriginalFilename();
		String save = request.getSession().getServletContext().getRealPath("/resources/images");
		File saveFile = new File(save, saveName);
		
		
		if(bookImage !=null && !bookImage.isEmpty())
			try {
				bookImage.transferTo(saveFile);
                //추가 구문
				book.setFileName(saveName);
			}
			catch(Exception e)
			{
				throw new RuntimeException("도서 이미지 업로드가 실패하였습니다.", e);
			}
		
		bookService.setNewBook(book);
		return "redirect:/books";
	}

addBook.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="form" uri="http://www.springframework.org/tags/form" %>
<!--  Chpater12 다국어 처리 태그 추가  -->
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>" rel="stylesheet">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	
	<div class="container">
    //삭제구문..
    
   
   
		<div class="float-right" style="padding-right:30px">
			<a href="?language=ko">Korean</a>|<a href="?language=en">English</a>
		</div>
		
		<br><br>
		<form:form modelAttribute="NewBook"
		action="./add?${_csrf.parameterName}=${_csrf.token}" class="form-horizontal"
		enctype="multipart/form-data">
		<fieldset>
		<%-- <legend><spring:message code="addBook.form.title.label" /></legend> --%>
			<legend>
				<spring:message code="addBook.form.subtitle.label" />
			</legend>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.bookId.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="bookId" class="form-control"/>
				</div>
				<div class="col-sm-6">
					<form:errors path="bookId" cssClass="text-danger"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.name.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="name" class="form-control" />
				</div>
				<div class="col-sm-6">
					<form:errors path="name" cssClass="text-danger"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.unitPrice.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="unitPrice" class="form-control"/>
				</div>
				<div class="col-sm-6">
					<form:errors path="unitPrice" cssClass="text-danger"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.author.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="author" class="form-control"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.description.label" />
				</label>
				<div class="col-sm-5">
					<form:input path="description" cols="50" rows="2"
					class="form-control"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.publisher.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="publisher" class="form-control"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.category.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="category" class="form-control"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.unitsInStock.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="unitsInStock" class="form-control"/>
				</div>
				<div class="col-sm-6">
					<form:input path="unitsInStock" cssClass="text-danger"/>
				</div>
				
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.releaseDate.label" />
				</label>
				<div class="col-sm-3">
					<form:input path="releaseDate" class="form-control"/>
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.condition.label" />
				</label>
				<div class="col-sm-3">
					<form:radiobutton path="condition" value="New"/>New
					<form:radiobutton path="condition" value="Old"/>Old
					<form:radiobutton path="condition" value="E-Book"/>E-Book
				</div>
			</div>
			<div class="form-group row">
				<label class="col-sm-2 control-label">
					<spring:message code="addBook.form.bookImage.label" />
				</label>			
				<div class="col-sm-7">
					<form:input path="bookImage" type="file" class="form-contorl" />
				</div>
			</div>
			<div class="form-group row">
				<div class="col-sm-offset-2 col-sm-10">
					<input type="submit" class="btn btn-primary" value="등록"/>
					<!-- Chapter12 다국어처리 추가 -->
						<spring:message code="addBook.form.button.label" />
				</div>
			</div>
		</fieldset>
		</form:form>

	</div>
</body>
</html>

pom.xml

    <properties>
       <security-version>5.6.3</security-version>
    </properties>
    
    <dependency>
		  <groupId>org.springframework.security</groupId>
		  <artifactId>spring-security-taglibs</artifactId>
		  <version>${security-version}</version>
	 </dependency>

menu.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="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
   <nav class = "navbar navbar-expand navbar-dark bg-dark">
      <div class= "container">
         <div class = "navbar-header">
            <a class="navbar-brand" href="${pageContext.request.contextPath}/home">Book Market</a>
         </div>
         <div>
            <ul class="navbar-nav mr-auto">
               <li class="nav-item"><a class="nav-link" href="<c:url  value="/home"/>">Home</a></li>
               <li class="nav-item"><a class="nav-link" href="<c:url  value="/books"/>">Books</a></li>
               <li class="nav-item"><a class="nav-link" href="<c:url  value="/books/add"/>">Add Book</a></li>
               <li class="nav-item"><a class="nav-link" href="<c:url  value="/cart/"/>">Cart</a></li>
               
               //추가구문 
               <li class="nav-item">
               <sec:authorize access="isAuthenticated()">
               	<form:form action="${pageContext.request.contextPath }/logout" method="POST">
               		<input type="submit" class="btn btn-success" value="Logout"/>
               	</form:form>
               </sec:authorize>
               </li>
               
               <li class="nav-item">
               	<sec:authorize access="!isAuthenticated()">
               		<a class="nav-link" href="<c:url value="/login" />">Login</a>
               	</sec:authorize>
               </li>
               //
            </ul>
         </div>
      </div>
   </nav>
</body>
</html>


CRUD 메서드를 사용하여 도서 정보 수정하기

BookRepository.java 인터페이스에 도서 정보를 수정하는 메서드를 추가합니다.

	void setUpdateBook(Book book);

BookRepositoryImpl.java

@Override
	public void setUpdateBook(Book book) {
		// TODO Auto-generated method stub
		if(book.getFileName() != null)
		{
			String SQL ="UPDATE book SET b_nam=?, b_unitPrice=?,"
					+ " b_author=?, b_description=?, b_publisher=?,"
					+ " b_category=?, b_unitsInStock=?, b_releaseDate=?, b_condition=?,b_fileNmae=?";
			template.update(SQL,book.getBookId(),book.getName(),book.getUnitPrice(),
				book.getAuthor(), book.getDescription(), book.getPublisher(), book.getCategory(),
				book.getUnitsInStock(),book.getReleaseDate(),book.getCondition(),book.getFileName() );
		}
		else if(book.getFileName() == null)
		{
			String SQL = "update Book set b_nam=?, b_unitPrice=?, b_author=?, b_description=?, b_publisher=?,b_category=?, b_unitsInStock=?, b_releaseDate=?, b_condition=? where b_bookId=?";
			template.update(SQL,book.getBookId(),book.getName(),book.getUnitPrice(),
					book.getAuthor(), book.getDescription(), book.getPublisher(), book.getCategory(),
					book.getUnitsInStock(),book.getReleaseDate(),book.getCondition());
		}
	}

BookService.java

	void setUpdateBook(Book book);

BookServiceImpl.java

	@Override
	public void setUpdateBook(Book book) {
		// TODO Auto-generated method stub
		bookRepository.setUpdateBook(book);
	}

BookController.java

	@GetMapping("/update")
	public String getUpdateBookForm(@ModelAttribute("updateBook") Book book,
			@RequestParam("id")String bookId, Model model)
	{
		Book bookById = bookService.getBookById(bookId);
		model.addAttribute("book", bookById);
		return "updateForm";
	}
	@PostMapping("/update")
	public String submitUpdateBookForm(@ModelAttribute("updateBook") Book book)
	{
		MultipartFile bookImage = book.getBookImage();
		String rootDirectory = "/resources/images";
		if(bookImage != null && !bookImage.isEmpty())
		{
			try {
				String fname = bookImage.getOriginalFilename();
				bookImage.transferTo(new File("/resources/images"+fname));
				book.setFileName(fname);
			}
			catch(Exception e)
			{
				throw new RuntimeException("Book Image saving failed", e);
			}
		}
		
		bookService.setUpdateBook(book);
		return "redirect:/books";
	}

book.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="form" uri="http://www.springframework.org/tags/form" %>
     
    
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>" rel="stylesheet">
<meta charset="UTF-8">
<script src="${pageContext.request.contextPath}/resources/js/controllers.js"></script>
<title>Insert title here</title>
</head>
<body>

   <div class="container">
      <div class="row">
         <div class="col-md-4">
            <c:choose>
	            <c:when test="${book.getBookImage()==null }">
	            <!-- chapter 17 DB -->
                 <%--  <img src="<c:url value="/resources/images/${book.getBookId() }.png"/>"style="width:100%"/> --%>
                  <img src="<c:url value="/resources/images/${book.fileName }" />" style="width: 100%"/>
                  
	            </c:when>
	            <c:otherwise>
            		<%-- <img src="<c:url value="/resources/images/${book.getBookImage().getOriginalFilename()}"/>"style="width:100%"/> --%>
            		<img src="<c:url value="/resources/images/${book.fileName }" />" style="width: 100%"/>
                  
	            </c:otherwise>
	         </c:choose>
         </div>
		<div class="col-md-8">
			<h3>${book.name}</h3>
			<p>${book.description}</p>
			<br>
			<p><b>도서코드 : </b><span class="badge badge-info">${book.bookId}</span>
			<p><b>저자</b> : ${book.author}
			<p><b>출판사</b> : ${book.publisher}
			<p><b>출판일</b> : ${book.releaseDate}
			<p><b>분류</b> : ${book.category}
			<p><b>재고수</b> : ${book.unitsInStock}
			<h4>${book.unitPrice}원</h4>
			<br>
			<form:form name="addForm" method="put">
			<p><a href="javascript:addToCart('../cart/add/${book.bookId }')" class="btn btn-primary">도서주문 &raquo;</a>
			<a href="<c:url value="/cart"/>" class="btn btn-warning">장바구니 &raquo;</a>
			<a href="<c:url value="/books"/>" class="btn btn-secondary">도서 목록 &raquo;</a>
			//추가구문
            <sec:authorize access="isAuthenticated()">
				<a href="<c:url value="/books/update?id=${book.bookId }" />" class="btn btn-success">수정&raquo;</a>
				<a href="<c:url value="javascript:deleteConfirm('${book.bookId }')" />" class="btn btn-danger">삭제 &raquo;</a>
				
			</sec:authorize>
            //
			</form:form>
		</div>
		</div>
		<hr>

	</div>
</body>
</html>

updateForm.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="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>"rel="stylesheet" />
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div class="container">
		<div class="row">
			<div class="col-md-4">
				<img src="<c:url value="/resource/images/${book.fimeName }" />" alt="image" 
				style="width:100%"/>
			</div>
			<div class="col-md-7">
				<form:form modelAttribute="updateBook" action="./update?${_csrf.parameterName }=${_csrf.token}" class="form-horizontal"
				enctype="multipart/form-data">
					<fieldset>
						<div class="form-group row">
							<label class="col-sm-2 control-label">도서 ID</label>
							<div class="col-sm-6" style="padding-top : 10px">
								<form:input id="bookId" path="bookId" type="hodden" class="form-control" value="${book.bookId }"/>
								<span class="badge badge-info">${book.bookId }</span>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">도서명</label>
							<div class="col-sm-6">
								<form:input path="name" class="form-control" value="${book.name}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">가격</label>
							<div class="col-sm-6">
								<form:input path="unitPrice" class="form-control" value="${book.unitPrice}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">저자</label>
							<div class="col-sm-6">
								<form:input path="author" class="form-control" value="${book.author}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">상세정보</label>
							<div class="col-sm-10">
								<textarea path="description" cols="50" rows="2" class="form-control">${book.description }</textarea>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">출판사</label>
							<div class="col-sm-6">
								<form:input path="publisher" class="form-control" value="${book.publisher}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">분류</label>
							<div class="col-sm-6">
								<form:input path="category" class="form-control" value="${book.category}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">재고수</label>
							<div class="col-sm-6">
								<form:input path="unitsInStock" class="form-control" value="${book.unitsInStock}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">출판일</label>
							<div class="col-sm-6">
								<form:input path="releaseDate" class="form-control" value="${book.releaseDate}"/>
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">상태</label>
							<div class="col-sm-6">
								<form:radiobutton path="condition" value="New"/>New
								<form:radiobutton path="condition" value="Old"/>Old
								<form:radiobutton path="condition" value="E-Book"/>E-Book
							</div>
						</div>
						<div class="form-group row">
							<label class="col-sm-2 control-label">이미지</label>
							<div class="col-sm-10">
								<form:input path="bookImage" class="form-control" type="file"/>
							</div>
						</div>
						<div class="form-group row">
							<div class="col-sm-offset-2 col-sm-10">
							<input type="submit" class="btn btn-primary" value="수정"/>
							<a href="<c:url value="/books" />" class="btn btn-primary">취소</a>
							</div>
						</div>					
					</fieldset>				
				</form:form>
			</div>
		</div>
	</div>
</body>
</html>

tiles.xml

<tiles-definitions>
    <definition name="updateForm" extends="base-Template">
    	<put-attribute name="title" value="Book" />
    	<put-attribute name="heading" value="도서수정" />
    	<put-attribute name="subheading" value="Book Editing" />
    	<put-attribute name="content" value="/WEB-INF/views/updateForm.jsp" />
    </definition>
</tiles-definitions>


CRUD 메서드를 사용해 도서 삭제하기.

 

BookRepository.java

void setDeleteBook(String bookID);

BookRepositoryImpl.java

	@Override
	public void setDeleteBook(String bookID) {
		// TODO Auto-generated method stub
		String SQL = "delete from Book where b_bookId = ?";
		this.template.update(SQL, bookID);
	}

BookService.java

	void setDeleteBook(String bookID);

BookServiceImpl.java

	@Override
	public void setDeleteBook(String bookID) {
		// TODO Auto-generated method stub
		bookRepository.setDeleteBook(bookID);
	}

BookController.java

	@RequestMapping(value="/delete")
	public String getDeleteBookForm(Model model, @RequestParam("id") String bookId)
	{
		bookService.setDeleteBook(bookId);
		return "redirect:/books";
	}

controllers.js

function deleteConfirm(id)
{
	if(confirm("삭제합니다!!")==true) location.href = "./delete?id=" +id;
	else return;	
}

book.jsp

			<a href="<c:url value="/books"/>" class="btn btn-secondary">도서 목록 &raquo;</a>
			<sec:authorize access="isAuthenticated()">
				<a href="<c:url value="/books/update?id=${book.bookId }" />" class="btn btn-success">수정&raquo;</a>
				//추가 구문
                <a href="<c:url value="javascript:deleteConfirm('${book.bookId }')" />" class="btn btn-danger">삭제 &raquo;</a>
				//
			</sec:authorize>
			</form:form>
		</div>

 

'정리 노트 > Spring' 카테고리의 다른 글

Spring Project[Project]  (0) 2024.02.28
SQL2  (0) 2024.02.07
Spring Chapter17 [17-5]  (0) 2024.02.02
Spring[17-4]  (0) 2024.02.01
Spring Chapter14-Chapter15 [17-3]  (0) 2024.01.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함