본문 바로가기

웹 개발/쇼핑몰 프로젝트(개인)

쇼핑몰 만들기(6)-상품 관리(상품 수정, 삭제)

728x90

 

 

쇼핑몰 만들기(5)-상품 관리

쇼핑몰 만들기(4)-관리자 상세보기, 부트스트랩 적용 2024.04.05 - [웹 개발] - 쇼핑몰 만들기(3)-관리자 리스트, 관리자 메뉴, 권한 변경 쇼핑몰 만들기(3)-관리자 리스트, 관리자 메뉴, 권한 변경 쇼핑

broad-backend.tistory.com

 

일단 상품 삭제먼저 하겠다.

 

deleteGoodsForm.jsp

<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<%
	/* session의 정보 가져오기(상품 삭제 시 로그인한 id 표시 및 요청 값으로 넘기기 위해) */
	HashMap<String, Object> getSessionMap = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>

<%
	// 요청 값
	String goodsNo = request.getParameter("goodsNo");

	// 요청 값 디버깅
	System.out.println("deleteGoodsForm - goodsNo = " + goodsNo);
%>

<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	// [DB]shop.goods의 정보 일부분 가져오는 쿼리
	String getGoodsInfoSql = "SELECT category, goods_title goodsTitle, img_name imgName FROM goods WHERE goods_no = ?";
	PreparedStatement getGoodsInfoStmt = null;
	ResultSet getGoodsInfoRs = null;
	
	getGoodsInfoStmt = conn.prepareStatement(getGoodsInfoSql);
	getGoodsInfoStmt.setString(1, goodsNo);
	getGoodsInfoRs = getGoodsInfoStmt.executeQuery();
	
	HashMap<String, Object> goodsInfo = new HashMap<String, Object>();
	
	if(getGoodsInfoRs.next()) {
		goodsInfo.put("category", getGoodsInfoRs.getString("category"));
		goodsInfo.put("goodsTitle", getGoodsInfoRs.getString("goodsTitle"));
		goodsInfo.put("imgName", getGoodsInfoRs.getString("imgName"));
	}
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>title</title>
	<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>

	<div class="col"></div>
	
	<div class="col-4">
		<div class="w3-container w3-dark-grey w3-border w3-round" style="padding: 10px; margin-top: 10px">
			<h1>상품 삭제</h1>
		</div>
		
		<div class="w3-card-4" style="padding-top: 15px;">
			<form class="w3-container" action="/shop/emp/goods/deleteGoodsAction.jsp">	
			
				<div>
					<label>상품 번호</label>
					<input class="w3-input" type="text" name="goodsNo" value="<%=goodsNo%>" readonly="readonly">
				</div>
				
				<div>
					<label>카테고리</label>
					<input class="w3-input" type="text" name="goodsNo" value="<%=goodsInfo.get("category")%>" readonly="readonly">
				</div>
				
				<div>
					<label>상품명</label>
					<input class="w3-input" type="text" name="goodsNo" value="<%=goodsInfo.get("goodsTitle")%>" readonly="readonly">
				</div>
				
				<div>
					<img alt="" src="/shop/upload/<%=goodsInfo.get("imgName")%>">
				</div>
				
				<div>
					해당 상품을 삭제하시려면 pw를 입력해주세요.
				</div>
			
				<input class="w3-input" type="hidden" name="goodsNo" value="<%=goodsNo%>">
				<input class="w3-input" type="hidden" name="imgName" value="<%=goodsInfo.get("imgName")%>">
				
				<div style="margin-top: 10px;">
					<label>id</label>
					<input class="w3-input" type="text" name="empId" value="<%=getSessionMap.get("empId")%>" readonly="readonly">
				</div>
				
				<div>
					<label>pw</label>
					<input class="w3-input" type="password" name="empPw">
				</div>
				
				<div>
					<button class="w3-button w3-section w3-block w3-dark-grey w3-ripple"  type="submit">삭제</button>
				</div>
			</form>
			
		</div>

	</div>
	
	<div class="col"></div>
</div>
	
</body>
</html>

 

로그인돼있는 관리자가 누군지 알기위해 세션변수를 가져온다.

 

삭제버튼을 눌렀을 때 goodsNo가 넘어오고, 요청값으로 받는다.

goodsNo를 조건으로 [DB]shop.goods에서 SELECT쿼리를 날려 필요한 데이터를 가져온다

어떤 상품을 삭제하는지 정보들을 조금 보여주고자 했기 때문이다.

 

그리고 폼으로 id, pw를 입력받게 한다.

단 id는 로그인돼있는 관리자의 id를 세션에서 가져온다.

아래에 삭제버튼을 눌렀을경우 표시되는 페이지이다.

상품 삭제

 

pw를 입력하여 삭제버튼을 누르면 deleteGoodsActon.jsp로 넘어가게된다.

 

deleteGoodsAction.jsp

<%@page import="java.io.File"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<%
	// 요청 값
	String goodsNo = request.getParameter("goodsNo");
	String imgName = request.getParameter("imgName");
	String empId = request.getParameter("empId");
	String empPw = request.getParameter("empPw");
	
	// 요청 값 디버깅
	System.out.println("deleteGoodsAction - goodsNo = " + goodsNo);
	System.out.println("deleteGoodsAction - empId = " + empId);
	System.out.println("deleteGoodsAction - empPw = " + empPw);
%>

<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	// [DB]shop.emp에서 id,pw 확인
	String checkEmpSql = "SELECT emp_id empId FROM emp WHERE emp_id = ? AND emp_pw = PASSWORD(?)";
	PreparedStatement checkEmpStmt = null;
	ResultSet checkEmpRs = null;
	
	checkEmpStmt = conn.prepareStatement(checkEmpSql);
	checkEmpStmt.setString(1, empId);
	checkEmpStmt.setString(2, empPw);
	checkEmpRs = checkEmpStmt.executeQuery();
	
	// id, pw가 일치한다면
	if(checkEmpRs.next()) {
		
		// 상품 삭제 쿼리
		String deleteGoodsSql = "DELETE FROM goods WHERE goods_no = ?";
		PreparedStatement deleteGoodsStmt = null;
		deleteGoodsStmt = conn.prepareStatement(deleteGoodsSql);
		deleteGoodsStmt.setString(1, goodsNo);
		
		// 이미지 삭제하기
		String imgPath = request.getServletContext().getRealPath("upload");
		System.out.println("deleteGoodsAction - imgPath = " + imgPath);
		
	 	File deleteFile = new File(imgPath, imgName);
	 	deleteFile.delete();
	 	
		// DELETE 쿼리 실행 확인
		int row = deleteGoodsStmt.executeUpdate();
		System.out.println("deleteGoodsAction - row = " + row);
		
		System.out.println("상품 삭제 성공");
		response.sendRedirect("/shop/emp/goods/goodsList.jsp");
		
		
	} else {
		// 상품 삭제 실패
		System.out.println("상품 삭제 실패");
		response.sendRedirect("/shop/emp/goods/goodsOne.jsp?goodsNo=" + goodsNo);
	}
%>

 

deleteGoodsForm에서 goodsNo, imgName, empId, empPw를 요청값으로 받아온다.

 

id, pw를 DB에서 일치하는지 , 불일치하는지 확인한다.

일치하게되면 그때 goodsNo르 조건으로하고 DELETE쿼리를 날려 상품을 지운다.

상품을 삭제하게되면 이미지가 있는 폴더에 해당 상품의 이미지도 지워야한다.

그 때 요청값으로 받아온 imgName과 delete()메소드를 사용해 파일을 지우면 삭제 완료이다!

상품 삭제 후 상품 리스트

 

다음은 수정이다.

 

 updateGoodsForm.jsp

<%@page import="java.awt.font.ImageGraphicAttribute"%>
<%@page import="java.sql.*"%>
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<%
	// 요청 값 확인
	String goodsNo = request.getParameter("goodsNo");
	// 요청 값 디버깅
	System.out.println("goodsOne - goodsNo = " + goodsNo);
%>

<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	/* 상품 하나의 모든 정보 가져오는 쿼리 */
	String getGoodsInfoSql = "SELECT category, emp_id empId, goods_title goodsTitle, img_name imgName, goods_content goodsContent, goods_price goodsPrice, goods_amount goodsAmount, create_date createDate FROM goods WHERE goods_no = ?";
	PreparedStatement getGoodsInfoStmt = null;
	ResultSet getGoodsInfoRs = null;
	getGoodsInfoStmt = conn.prepareStatement(getGoodsInfoSql);
	getGoodsInfoStmt.setString(1, goodsNo);
	getGoodsInfoRs = getGoodsInfoStmt.executeQuery();
	
	HashMap<String, Object> goodsInfo = new HashMap<String, Object>();
	while(getGoodsInfoRs.next()) {
		goodsInfo.put("category", getGoodsInfoRs.getString("category"));
		goodsInfo.put("empId", getGoodsInfoRs.getString("empId"));
		goodsInfo.put("goodsTitle", getGoodsInfoRs.getString("goodsTitle"));
		goodsInfo.put("imgName", getGoodsInfoRs.getString("imgName"));
		goodsInfo.put("goodsContent", getGoodsInfoRs.getString("goodsContent"));
		goodsInfo.put("goodsPrice", getGoodsInfoRs.getString("goodsPrice"));
		goodsInfo.put("goodsAmount", getGoodsInfoRs.getString("goodsAmount"));
		goodsInfo.put("createDate", getGoodsInfoRs.getString("createDate"));

	}
	
	String getCategorySql = "SELECT category FROM category";
	PreparedStatement getCategoryStmt = null;
	ResultSet getCategoryRs = null;
	getCategoryStmt = conn.prepareStatement(getCategorySql);
	getCategoryRs = getCategoryStmt.executeQuery();
	
	ArrayList<String> categoryList = new ArrayList<String>();
	while(getCategoryRs.next()) {
		categoryList.add(getCategoryRs.getString("category"));
	}
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>title</title>
	<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>

	<div class="col"></div>
	
	<div class="col-6">
		<div class="w3-container w3-dark-grey w3-border w3-round" style="padding: 10px; margin-top: 10px">
			<h1>상품 수정</h1>
		</div>
		
		<div class="w3-card-4" style="padding-top: 15px;">
			<form class="w3-container" action="/shop/emp/goods/updateGoodsAction.jsp" method="post" enctype="multipart/form-data">
			
				<div>
					<label>상품 번호</label>
					<input class="w3-input" type="text" name="goodsNo" value="<%=goodsNo%>" readonly="readonly">
				</div>
				
				<div>
					<label>카테고리</label>
					<select class="w3-select" name="category" required="required">
						<option value="">선택</option>
						<%
							for(String s : categoryList) {
								if(goodsInfo.get("category").equals(s)) {
						%>
									<option value="<%=s%>" selected="selected"><%=s%></option>
						<%
								} else {
						%>
									<option value="<%=s%>"><%=s%></option>
						<%
								}
							}
						%>
					</select>
				</div>
				
				<!-- emp_id값은 action쪽에서 세션변수에서 바인딩 -->
				<div>
					<label>관리자</label>
					<input class="w3-input" type="text" name="empId" value="<%=goodsInfo.get("empId")%>" readonly="readonly">
				</div>
				
				<div>
					<label>상품명</label>
					<input class="w3-input" type="text" name="goodsTitle" value="<%=goodsInfo.get("goodsTitle")%>" required="required">
				</div>
				
				<div>
					<div>
						<div>
							<label>기존 이미지</label>
						</div>
						<img alt="" src="/shop/upload/<%=goodsInfo.get("imgName")%>">
						<input class="w3-input" type="hidden" name="existImgName" value="<%=goodsInfo.get("imgName")%>">
					</div>
					
					<label>변경할 이미지</label>
					<input class="w3-input" type="file" name="newGoodsImg">
				</div>
				
				<div>
					<label>가격</label>
					<input class="w3-input" type="number" name="goodsPrice" value="<%=goodsInfo.get("goodsPrice")%>" required="required">
				</div>
				
				<div>
					<label>수량</label> 
					<input class="w3-input" type="number" name="goodsAmount" value="<%=goodsInfo.get("goodsAmount")%>" required="required">
				</div>
				
				<div>
					<div>
						<label>설명</label>
					</div>
					 
					<textarea class="w3-input" rows="5" cols="50" name="goodsContent"><%=goodsInfo.get("goodsContent")%></textarea>
				</div>
				
				<div>
					<button class="w3-button w3-section w3-block w3-dark-grey w3-ripple" type="submit">상품 수정</button>
				</div>
			</form>
		</div>
	</div>

	<div class="col"></div>
</div>

</body>
</html>

 

마찬가지로 goodsNo를 요청값으로 받아온다.

 

goodsNo를 조건으로, DB에서 필요한 데이터를 SELECT로 뽑아온다.

 

그리고 폼에서 카테고리를 변경할 수도 있으므로 category 테이블도 SELECT하여 모두 가져온다.

그리고 수정 폼에 맞게 값들을 변경하고 입력하면 된다!

이미지의 경우는 변경할거면 변경할 이미지를 올리고, 그렇지 않다면 그냥 수정을 하면 된다

updateGoodsAction.jsp

<%@page import="java.nio.file.Files"%>
<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>
<%@page import="java.io.*"%>
<%@page import="java.nio.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<%
	// 요청 값 
	String goodsNo = request.getParameter("goodsNo");
	String category = request.getParameter("category");
	String empId = request.getParameter("empId");
	String goodsTitle = request.getParameter("goodsTitle");
	String existImgName = request.getParameter("existImgName");
	String goodsPrice = request.getParameter("goodsPrice");
	String goodsAmount = request.getParameter("goodsAmount");
	String goodsContent = request.getParameter("goodsContent");
	
	String newImgName = "";
	Part part = request.getPart("newGoodsImg");
	
	if(part != null) {
		newImgName = existImgName;
	}
	
	// 요청 값 디버깅
	System.out.println("updateGoodsAction - goodsNo = " + goodsNo);
	System.out.println("updateGoodsAction - category = " + category);
	System.out.println("updateGoodsAction - empId = " + empId);
	System.out.println("updateGoodsAction - goodsTitle = " + goodsTitle);
	System.out.println("updateGoodsAction - existImgName = " + existImgName);
	System.out.println("updateGoodsAction - newImgName = " + newImgName);
	System.out.println("updateGoodsAction - goodsPrice = " + goodsPrice);
	System.out.println("updateGoodsAction - goodsAmount = " + goodsAmount);
	System.out.println("updateGoodsAction - goodsContent = " + goodsContent);
	
%>

<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	/* 상품 하나의 정보를 업데이트 하는 쿼리 */
	String updateGoodsSql = "UPDATE goods SET category = ?, goods_title = ?, goods_content = ?, goods_price = ?, goods_amount = ?, update_date = NOW()";
	PreparedStatement updateGoodsStmt = null;
	
	
	// 새로운 이미지 업로드 x -> 기존 이미지 사용 ()
	if(newImgName.equals("")) {
		updateGoodsSql = updateGoodsSql + " " + "WHERE goods_no = ?";
		updateGoodsStmt = conn.prepareStatement(updateGoodsSql);
		updateGoodsStmt.setString(1, category);
		updateGoodsStmt.setString(2, goodsTitle);
		updateGoodsStmt.setString(3, goodsContent);
		updateGoodsStmt.setString(4, goodsPrice);
		updateGoodsStmt.setString(5, goodsAmount);
		updateGoodsStmt.setString(6, goodsNo);
	} else {
		// 새로운 이미지 업로드!
		updateGoodsSql = updateGoodsSql + ",img_name = ? WHERE goods_no = ?";
		updateGoodsStmt = conn.prepareStatement(updateGoodsSql);
		updateGoodsStmt.setString(1, category);
		updateGoodsStmt.setString(2, goodsTitle);
		updateGoodsStmt.setString(3, goodsContent);
		updateGoodsStmt.setString(4, goodsPrice);
		updateGoodsStmt.setString(5, goodsAmount);
		updateGoodsStmt.setString(6, newImgName);
		updateGoodsStmt.setString(7, goodsNo);
	}
	
	int row = updateGoodsStmt.executeUpdate();

	if(row == 1) {
		// 상품 등록 성공
		
		// part -> 1. inputStream -> 2. outputStream -> 3. 빈 파일 생성
		if(newImgName != null) {
			// 1번
			InputStream is = part.getInputStream();
			// 3번 + 2번 같이
			String imgPath = request.getServletContext().getRealPath("upload");
			System.out.println("updateGoodsAction - imgPath = " + imgPath);
			System.out.println("updateGoodsAction - newImgName = " + newImgName);
			File image = new File(imgPath, newImgName);	// 빈 파일 생성
			OutputStream os = Files.newOutputStream(image.toPath());	// os + file
			is.transferTo(os);
			
			os.close();
			is.close();
		}
		
		
		System.out.println("상품 수정 성공");
		response.sendRedirect("/shop/emp/goods/goodsOne.jsp?goodsNo=" + goodsNo);
	} else {
		// 상품 등록 실패
		System.out.println("상품 수정 실패");
		response.sendRedirect("/shop/emp/goods/addGoodsForm.jsp");
		response.sendRedirect("/shop/emp/goods/goodsOne.jsp?goodsNo=" + goodsNo);
	}
	
%>

 

 

수정 폼에서의 요청값들을 받고, 

이미지를 변경하지 않으면, 이미지이름을 그대로 사용!

변경하게된다면, 이미지를 upload폴더에 생성! addGoodsForm에서 사용했던 방식그대로 사용했다.

 

그 후 이미지가 그대로인지, 이미지를 변경했는지에 따라 분기하여 UPDATE 쿼리를 실행했다

뒷 부분은 addGoodsAction과 마찬가지로 inputStream에서 outputStream으로 보내고, 생성된 빈파일에 덮어주면 끝!

아래에 수정 페이지와 수정 후를 보여주는 사진이 있다

 

상품 수정 페이지
상품 수정 후

 

728x90