본문 바로가기
수업(국비지원)/Spring

[Spring] (MVC 2) 상품 주문 확정(CartController, SaleItem, Sale, ShopService, end, SaleDao, saleItemDao)

by byeolsub 2023. 4. 21.

📌 CartController.java 내용 추가

package controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import logic.Cart;
import logic.Item;
import logic.ItemSet;
import logic.Sale;
import logic.ShopService;
import logic.User;

@Controller
@RequestMapping("cart")
public class CartController {
	@Autowired
	private ShopService service;
	//http://localhost:8088/springmvc1/cart/cartAdd?id=1&quantity=1
	@RequestMapping("cartAdd")
	public ModelAndView add(Integer id, Integer quantity, HttpSession session) {
		ModelAndView mav = new ModelAndView("cart/cart"); //뷰 이름
		Item item = service.getItem(id); //상품 정보를 db에서 읽어 오기
		//session의 "CART" 속성에 장바구니 정보를 저장.
		Cart cart = (Cart)session.getAttribute("CART");
		if(cart == null) {
			cart = new Cart();
			session.setAttribute("CART", cart); //CART 객체를 속성에 등록
		}
		//cart의 itemSetList에 추가
		//itemSetList 존재하는 상품이 추가 되는 경우 수량만 증가시킴
		cart.push(new ItemSet(item, quantity));
		mav.addObject("cart",cart);
		mav.addObject("message", item.getName() + ":" + quantity + "개 장바구니 추가");
		return mav;
	}
	//http://localhost:8088/springmvc1/cart/cartDelete?index=0
	@RequestMapping("cartDelete")
	public ModelAndView delete(int index, HttpSession session) {
		//index : cart.getItemSetList()의 인덱스.
		ModelAndView mav = new ModelAndView("cart/cart");
		Cart cart = (Cart)session.getAttribute("CART");
		//요소 List.remove(index) : 삭제되는 해당 요소를 전달(리턴)
		//delSet : 삭제되는 ItemSet 객체
		ItemSet delSet = cart.getItemSetList().remove(index);
		mav.addObject("cart", cart);
		mav.addObject("message", delSet.getItem().getName() + " 이(가) 장바구니에서 삭제.");
		return mav;
	}
	//http://localhost:8088/springmvc1/cart/cartView
	@RequestMapping("cartView")
	public ModelAndView view(HttpSession session) {
		ModelAndView mav = new ModelAndView("cart/cart");
		Cart cart = (Cart)session.getAttribute("CART");
		mav.addObject("cart", cart);
		return mav;
	}
/* 
 * AOP 클래스 : CartAspect 클래스
 * 로그인이 되어야 실행 가능하도록 AOP 부분 추가하기
 * 장바구니에 주문상품이 없는 경우 실행 불가 AOP 부분 추가하기
 */	
	@RequestMapping("checkout")
	   public String checkout(HttpSession session) {
	      return null;
	   }
**/*
 * 주문 확정 : end 요구
 *   1. 로그인, 장바구니 상품 검증 필요 =>aop로 설정하기
 *   2. 장바구니 상품을 saleitem 테이블에 저장하기
 *   3. 로그인 정보로 주문정보(sale)테이블에 저장
 *   4. 장바구니 상품제거
 *   5. 주문정보 end.jsp 페이지로 출력  
 */**	
	**@RequestMapping("end")
	public ModelAndView checkend(HttpSession session) {
		ModelAndView mav = new ModelAndView();
		Cart cart = (Cart)session.getAttribute("CART");
		User loginUser = (User)session.getAttribute("loginUser");
		Sale sale = service.checkend(loginUser, cart); //sale, saleitem 테이블에 데이터 저장
		cart.getItemSetList().clear(); //장바구니 상품제거
		mav.addObject("sale", sale);
		return mav;
	}**
}

 

 

📌 SaleItem.java 생성

package logic;

public class SaleItem {
	private int saleid;
	private int seq;
	private int itemid;
	private int quantity;
	private Item item;
	public SaleItem() {}
	public SaleItem(int saleid, int seq, ItemSet itemSet) {
		this.saleid = saleid;
		this.seq = seq;
		this.item = itemSet.getItem();
		this.itemid = itemSet.getItem().getId();
		this.quantity = itemSet.getQuantity();
	}
	//getter, setter, toString
	public int getSaleid() {
		return saleid;
	}
	public void setSaleid(int saleid) {
		this.saleid = saleid;
	}
	public int getSeq() {
		return seq;
	}
	public void setSeq(int seq) {
		this.seq = seq;
	}
	public int getItemid() {
		return itemid;
	}
	public void setItemid(int itemid) {
		this.itemid = itemid;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}
	public Item getItem() {
		return item;
	}
	public void setItem(Item item) {
		this.item = item;
	}
	
	@Override
	public String toString() {
		return "SaleItem [saleid=" + saleid + ", seq=" + seq + ", itemid=" + itemid + ", quantity=" + quantity
				+ ", item=" + item + "]";
	}
}

 

 

📌 Sale.java 생성

package logic;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Sale {
	private int saleid;
	private String userid;
	private Date saledate;
	private User User;
	private List<SaleItem> itemList = new ArrayList<>();
	public int getTotal() {
		int sum = 0;
		for(SaleItem si : itemList) {
			sum += si.getItem().getPrice() * si.getQuantity();
		}
		return sum;
	}
	//getter, setter, toString
	public int getSaleid() {
		return saleid;
	}
	public void setSaleid(int saleid) {
		this.saleid = saleid;
	}
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public Date getSaledate() {
		return saledate;
	}
	public void setSaledate(Date saledate) {
		this.saledate = saledate;
	}
	public User getUser() {
		return User;
	}
	public void setUser(User user) {
		User = user;
	}
	public List<SaleItem> getItemList() {
		return itemList;
	}
	public void setItemList(List<SaleItem> itemList) {
		this.itemList = itemList;
	}
	
	@Override
	public String toString() {
		return "Sale [saleid=" + saleid + ", userid=" + userid + ", saledate=" + saledate + ", User=" + User
				+ ", itemList=" + itemList + "]";
	}
}

 


 📌 ShopService.java 내용 추가

package logic;

import java.io.File;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import dao.ItemDao;
**import dao.SaleDao;**
import dao.UserDao;
import dao.saleItemDao;

/*
 *  @Component : 해당 클래스를 객체화
 *     - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
 */

@Service //@Component + Service 기능
public class ShopService {
	@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
	private ItemDao itemDao;
	@Autowired
	private UserDao userDao;
	**@Autowired
	private SaleDao saleDao;**
	
	public List<Item> itemList() { 
		return itemDao.list();
	}

	public Item getItem(Integer id) {
		return itemDao.getItem(id);
	}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용	
	public void itemCreate(@Valid Item item, HttpServletRequest request) {
		//item.getPicture() : 업로드 된 파일의 내용
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
			String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
			uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
		}
		//maxid : item테이블 중 최대 id 값
		int maxid = itemDao.maxId(); 
		item.setId(maxid+1);
		itemDao.insert(item);
	}

	private void uploadFileCreate(MultipartFile file, String uploadPath) {
		//uploadPath : 파일이 업로드 되는 폴더
		String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
		File fpath = new File(uploadPath);
		if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
		try { 
			//파일의 내용 => uploadPath + orgFile 로 파일 저장
			file.transferTo(new File(uploadPath + orgFile)); //파일업로드
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void itemUpdate(Item item, HttpServletRequest request) {
		//item.getPicture() : 업로드 된 파일의 내용
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
			String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
			uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
		}
		itemDao.update(item);
	}

	public void itemDelete(Integer id) {
		 itemDao.delete(id);
	}

	public void userInsert(@Valid User user) {
		userDao.insert(user);
	}
	
	public User getUser(String userid) {
		return userDao.selectOne(userid);
	}

	public void userUpdate(@Valid User user) {
		userDao.update(user);
	}

	public void userDelete(String userid) {
		userDao.delete(userid);
		
	}

	public void userChgPass(String userid, String pass) {
		userDao.chgpass(userid,pass);
	}

	public String getSearch(User user, String url) {
		return userDao.search(user, url);
	}

	public List<User> userlist() {
		return userDao.list();
	}
**/*
 * 로그인 정보, 장바구니 정보에서 sale, saleitem 테이블에 데이터 저장
 *  결과를 Sale 객체로 저장
 *  1. sale 테이블의 saleid의 최대 값 조회 : 최대값+1
 *  2. sale 테이블에 userid,sysdate 등록
 *  3. Cart 데이터에서 saleitem 데이터 추출. insert
 *  4. saleitem 정보를 sale객체에 모든 데이터 저장
 *  5. sale 데이터 리턴  
 */
public Sale checkend(User loginUser, Cart cart) {
		//1. sale 테이블의 saleid의 최대 값 조회 
		int maxid = saleDao.getMaxSaleId();
		//2. sale 테이블 등록 
		Sale sale = new Sale();
		sale.setSaleid(maxid + 1);
		sale.setUserid(loginUser.getUserid());
		sale.setUser(loginUser);
		saleDao.insert(sale);
		//3. Cart 데이터에서 saleitem 데이터 추출. insert
		int seq = 0;
		for(ItemSet is : cart.getItemSetList()) {
			SaleItem salitem = new SaleItem(sale.getSaleid(), ++seq, is);
			sale.getItemList().add(salitem);
			saleItemDao.insert(saleitem);
		}
		return sale;
	}**
}

 

 

📌 end.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="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 
<%-- /springmvc1/src/main/webapp/WEB-INF/view/cart/end.jsp --%>
<!DOCTYPE html><html><head><meta charset="UTF-8">
<title>주문 확정 상품</title></head>
<body><h2>${sale.user.username}님이 주문하신 정보 입니다.</h2>
<h2>배송지 정보</h2>
<table><tr><td width="30%">주문아이디</td>
      <td width="70%">${sessionScope.loginUser.userid}</td></tr>
  <tr><td width="30%">이름</td>
      <td width="70%">${sessionScope.loginUser.username}</td></tr>
  <tr><td width="30%">우편번호</td>
      <td width="70%">${sessionScope.loginUser.postcode}</td></tr>
  <tr><td width="30%">주소</td>
      <td width="70%">${sessionScope.loginUser.address}</td></tr>
  <tr><td width="30%">전화번호</td>
      <td width="70%">${sessionScope.loginUser.phoneno}</td></tr>
</table>
<h2>주문 완료 상품 </h2>
<table>
  <tr><th>상품명</th><th>가격</th><th>수량</th><th>합계</th></tr>
  <c:forEach items="${sale.itemList}" var="saleitem" >
   <tr><td>${saleitem.item.name}</td>
   <td><fmt:formatNumber value="${saleitem.item.price}" pattern="###,###"/></td>
   <td>${saleitem.quantity}</td>
   <td><fmt:formatNumber value="${saleitem.item.price *saleitem.quantity}" pattern="###,###"/></td></tr>
  </c:forEach>
  <tr><td colspan="4" align="right">
      총 구입 금액 : <fmt:formatNumber value="${sale.total}" pattern="###,###"/>원
  </td></tr>
  <tr><td colspan="4">
     <a href="../item/list">상품 목록</a>&nbsp;
  </td></tr></table></body></html>

 

📌 SaleDao.java 생성

package dao;

import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

import logic.Sale;

@Repository
public class SaleDao {
	private NamedParameterJdbcTemplate template;
	private Map<String, Object> param = new HashMap<>();
	private RowMapper<Sale> mapper = new BeanPropertyRowMapper<>(Sale.class);

	@Autowired
	public void setDataSource(DataSource dataSource) {
		template = new NamedParameterJdbcTemplate(dataSource);
	}

	public int getMaxSaleId() {
		return template.queryForObject("select nvl(max(saleid),0) from sale", param, Integer.class);
	}

	public void insert(Sale sale) {
		String sql = "insert into sale (saleid, userid, saledate) values (:saleid, :userid, sysdate)";
		SqlParameterSource param = new BeanPropertySqlParameterSource(sale);
		template.update(sql, param);
	}

}

 

📌 saleItemDao.java 생성

package dao;

import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

import logic.Sale;
import logic.SaleItem;

@Repository
public class SaleItemDao {
	private NamedParameterJdbcTemplate template;
	private Map<String, Object> param = new HashMap<>();
	private RowMapper<Sale> mapper = new BeanPropertyRowMapper<>(Sale.class);
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		template = new NamedParameterJdbcTemplate(dataSource);
	}
	
	public void insert(SaleItem saleitem) {
		String Sql = "insert into saleitem (saleid, seq, itemid, quantity, price)"
				+ " values(:saleid, :seq, :itemid, :quantity, :item.price)";
		SqlParameterSource param = new BeanPropertySqlParameterSource(saleitem);
		template.update(Sql, param);
	}
}