주요 기능 소개(도서구매) - rarararararaa/project_lm GitHub Wiki

📌 도서 구매(도서 선택, 장바구니, 주문 결제)

👉 도서 구매

  • 도서 구매 순서 :
    • 메인 페이지/전체 도서 목록/베스트셀러/신규 도서에서 구매하고 싶은 도서를 확인
    • 바로 구매/장바구니 선택
    • (장바구니 선택 시)수량 및 구매할 도서 선택
    • 배송지 입력 및 선택/포인트 입력/결제 수단 선택 -> 결제완료
  • 메인 페이지/베스트셀러/신규 도서는 도서 선택 후 상세 도서 페이지에서 결제 진행 가능
  • 장바구니에선 도서/중고 도서를 구분해서 화면에 보여주고, 상단의 세 버튼과 체크 박스로 간편하게 원하는 도서만 구매가 가능하다.
  • 장바구니에서 수량을 변경해 주문하기 버튼을 클릭 시 자동으로 변경된 수량이 저장된다.
  • 배송지 등록 버튼 클릭 시 현재 등록된 배송지 목록이 보이고 해당 창에서 배송지 등록/삭제/수정과 기본배송지 변경이 가능하다.
  • 포인트는 보유한 포인트 이상을 입력할 수 없고 상품 금액 이상의 포인트 또한 입력할 수 없다.
  • 상품 금액이 5만원 이하일 시 배송비가 3000원 추가되고 입력한 포인트에 따라 결제 금액이 차감된다. 해당 정보는 우측에 보여준다.
  • 결제 수단을 선택해 결제 후 영수증을 User에게 보여준다.

🖥️ code_Controller

ProductViewController.java
@Controller
@Slf4j
@ToString
public class ProductViewController {
	@Autowired
	ProductService 	productService; 
	//전체 도서
	@RequestMapping("/bookstore/product/productCeteList.do")
	public String listProduct(HttpSession session, Model model, 
			@RequestParam(value="pageNum",defaultValue="1") int currentPage,
			@RequestParam(defaultValue="4") int order,
			@RequestParam(defaultValue="국내도서")String cate, //1:국내도서
			@RequestParam(defaultValue="소설")String detail,
			@RequestParam(defaultValue="10") int count_num) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("store_product_searchcategoryName", cate);
		map.put("store_product_categoryname", detail);
		int count = productService.selectCategoryCount(map);
		PagingUtil page = 
				new PagingUtil(null,null,
						currentPage,count,count_num,10,
						"/bookstore/product/productCeteList.do","&detail="+detail+"&order="+order+"&count_num="+count_num+"&cate="+cate);
		map.put("start", page.getStartRow());
		map.put("end", page.getEndRow());
		map.put("order", order);
		List<ProductVO> list = productService.selectCategoryBook(map);
		String[] category = category();
		model.addAttribute("category", category);
		model.addAttribute("list", list);
		model.addAttribute("page", page.getPage());
		model.addAttribute("count", count);
		model.addAttribute("categoryTitle", detail);
		model.addAttribute("order", order);
		model.addAttribute("count_num", count_num);
		model.addAttribute("cate", cate);
		
		LocalDate now = LocalDate.now();
		model.addAttribute("now", now); 
		return "productListAll";
	}
	//베스트 도서
	@RequestMapping("/bookstore/product/productBestList.do")
	public ModelAndView BestListProduct() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("productListBest");
		//분야별 TOP 3
		String[] category = category();
		Map<String, List<ProductVO>> top3 = new HashMap<String, List<ProductVO>>();
		for(String cate : category) {
			List<ProductVO> top = productService.selectCateTop3(cate);
			top3.put(cate, top);
		}
		mav.addObject("top3", top3);
		mav.addObject("category", category);
		//월간 베스트 도서
		List<ProductVO> best = productService.selectBestBookList(0,1);
		//연간 베스트 도서
		List<ProductVO> best_y = productService.selectBestBookList(1,12);
		
		mav.addObject("bestList", best);
		mav.addObject("bestYear", best_y);
		log.debug("<<베스트 셀러>> : "+top3);
		return mav;
	}
	//베스트 도서
	@RequestMapping("/bookstore/product/productNewList.do")
	public ModelAndView NewListProduct() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("productListNew");
		//분야별 신규
		String[] category = category();
		Map<String, List<ProductVO>> new3 = new HashMap<String, List<ProductVO>>();
		for(String cate : category) {
			List<ProductVO> top = productService.selectCateNew(cate);
			new3.put(cate, top);
		}
		mav.addObject("new3", new3);
		mav.addObject("category", category);
		//국내&외국도서별 신규 도서
		List<ProductVO> inNew = productService.selectNew("국내도서");
		List<ProductVO> outNew = productService.selectNew("외국도서");
		mav.addObject("inNew", inNew);
		mav.addObject("outNew", outNew);
		return mav;
	}

	public String[] category(){
		String[] list = {"소설/시/희곡","인문학","컴퓨터","종교/역학","예술/대중문화","자기계발","외국어",
				"역사","경제경영","사회과학","과학","유아","어린이","소년",
				"수험서/자격증","참고서","만화","대학교재",
				"달력/기타","잡지","에세이","건강/취미"};
		return list;
	}
}
BookStorePaymentController.java
@Controller
@Slf4j
public class BookStorePaymentController {
	
	public static final String IMPORT_TOKEN_URL = "https://api.iamport.kr/users/getToken";
	public static final String IMPORT_CANCEL_URL = "https://api.iamport.kr/payments/cancel";
	public static final String KEY = "";  
	public static final String SECRET = "";
	
	@Autowired
	private BookStorePaymentService bookStorePaymentService;
	@Autowired
	private BookStorePaymentOrderService bookStorePaymentOrderService; 
	@Autowired
	private MemberService memberService;
	@Autowired
	
	//초기화
	@ModelAttribute
	public MemberVO initCommand() {
		return new MemberVO();
	}
	//장바구니 추가
	@PostMapping("/bookstore/payment/cart.do")
	@ResponseBody
	public Map<String,String> insertcartForm(HttpSession session, Model model, BookStorePaymentCartVO product) {
		String mem_id = (String)session.getAttribute("mem_id");
		Map<String, String> mapJson = new HashMap<String, String>();
		if(mem_id == null) {
			mapJson.put("result", "logout");
			return mapJson;
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		log.debug("<<도서 정보>> : "+product);
		product.setMem_num(mem_num);
		Boolean check = true;
		if(product.getUsed_product_num() != 0) {//중고 확인
			//중고 중복 상품 확인
			BookStorePaymentCartVO used = bookStorePaymentService.selectEmptyUsed(product.getUsed_product_num(),mem_num);
			if(used != null) {
				mapJson.put("result", "existBook");
				return mapJson;
			}
			product.setCart_quantity(1);
			bookStorePaymentService.insertCart(product);
			check = false;
		}else {//신상
			List<BookStorePaymentCartVO> db_cartVO = bookStorePaymentService.selectCartList(mem_num);
			for(BookStorePaymentCartVO vo : db_cartVO) {//중복 상품 확인
				log.debug("<<신상 중복 확인>> : "+vo.getStore_product_num()+','+product.getStore_product_num()+','+vo.getStore_product_status());
				if(vo.getStore_product_num() == product.getStore_product_num() && vo.getStore_product_status() == 0) {
					int total = vo.getCart_quantity() + product.getCart_quantity();
					product.setCart_quantity(total);
					product.setMem_cart_num(vo.getMem_cart_num());
					bookStorePaymentService.updateCart(product);
					check = false;
					break;
				}
			}
			if(check) {//새상품 추가
				log.debug("<<카트 도서 추가>>"+product);
				bookStorePaymentService.insertCart(product);
			}
		}
		mapJson.put("result", "success");
		
		return mapJson;
	}
	//======================API 관련===========================//  
	//Token 값 발급
	public String tokenTest() {
		String token = "";
		try {
			token = bookStorePaymentService.getToken();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return token;//결제 취소로 보내줘야 함
	}
	//주문 취소
	@RequestMapping("/bookstore/payment/cancelPay.do")
	@ResponseBody
	public Map<String, Object> cancelPay(int order_num){
		Map<String, Object> mapJson = new HashMap<String, Object>();
		try {
			String token = tokenTest();
			if(token == null) {
				throw new Exception();
			}
			//주문 정보 가져오기
			String IMP_UID = bookStorePaymentOrderService.selectImp_uid(order_num);
			String reason = "단순 변심";
			int amount = bookStorePaymentService.paymentInfo(token, IMP_UID);
			bookStorePaymentService.cancelPay(token, IMP_UID, amount,reason);
			//주문 취소 정보 추가
			bookStorePaymentOrderService.updateCancelInfo(order_num, reason);
			//재고 변경
			List<BookStorePaymentOrderVO> list = bookStorePaymentOrderService.listOrder(order_num);
			bookStorePaymentOrderService.updateQuantity(list);
			//주문 취소 포인트 전환
			String point_reason = String.valueOf(order_num);
			//해당 주문 건의 포인트 조회
			bookStorePaymentOrderService.selectPoint(point_reason);
			mapJson.put("result", "success");
		} catch (Exception e) {
			e.printStackTrace();
			mapJson.put("result", "errorCancel");
		}
		log.debug("<<주문 취소-map>> : "+mapJson);
		return mapJson;
	}
	//======================장바구니FORM===========================//  
	@GetMapping("/bookstore/payment/cart.do")
	public String cartForm(HttpSession session, Model model, HttpServletRequest request) {
		log.debug("<<세션 확인 >> : "+session.getAttribute("cartList"));
		
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			return "redirect:/lm/login/template/loginMain.do?lo=1";
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		int grade = (Integer)session.getAttribute("mem_grade");
		
		double point = getPoint(grade);
		List<BookStorePaymentCartVO> list = bookStorePaymentService.selectCartList(mem_num);
		List<ProductVO> book_list = new ArrayList<ProductVO>();
		for(BookStorePaymentCartVO vo : list) {
			log.debug("<<중고 확인!!!!!!!!>> : "+vo);
			ProductVO product = bookStorePaymentService.selectDetailBook(vo.getStore_product_num());
			if(vo.getStore_product_status() == 1) {
				UsedVO used = bookStorePaymentService.selectUsedBook(vo.getUsed_product_num());
				log.debug("<<도서 중고 정보>> : "+used);
				product.setUsed_product_price(used.getUsed_product_price());
				product.setUsed_product_status(used.getUsed_product_status());
				product.setUsed_product_num(used.getUsed_product_num());
			}
			book_list.add(product);
		}
		
		log.debug("<<cart>> : "+list);
		log.debug("<<cart_book>> : "+book_list);
		
		model.addAttribute("list", list);
		model.addAttribute("book_list", book_list);
		model.addAttribute("point", point);
		log.debug("<<grade>>"+point);
		return "cart";
	}
	//책 삭제
	@RequestMapping("/bookstore/payment/Cartdelete.do")
	@ResponseBody
	public Map<String, Object> deleteCartBook(Integer mem_cart_num, HttpSession session){
		String mem_id = (String)session.getAttribute("mem_id");
		Map<String, Object> mapJson = new HashMap<String, Object>();
		if(mem_id == null) {
			mapJson.put("result", "logout");
		}
		log.debug("<<카드 삭제 번호>> : "+mem_cart_num);
		if(mem_id == null) {
			mapJson.put("result", "logout");
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		bookStorePaymentService.deleteCart(mem_cart_num);
		mapJson.put("result", "success");
		return mapJson;
	}
	//======================장바구니 > 결제 페이지===========================//  
	@PostMapping("/bookstore/payment/cartAction.do")
	@ResponseBody 
	public Map<String, Object> actionCart(@RequestParam Map<String, Object> data, HttpSession session, int total){
		log.debug("<<total>>"+total);
		Map<String, Object> mapJson = new HashMap<String, Object>();
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			mapJson.put("result", "logout");
			return mapJson;
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		log.debug("<<ACTION!>> : "+data.get("data"));
		String test = (String)data.get("data");
		try {
			
			JSONArray array = JSONArray.fromObject(test);
			List<Map<String, String>> list = new ArrayList<Map<String,String>>();
			for(int i=0;i<array.size();i++) {
				JSONObject obj = (JSONObject)array.get(i);
				log.debug("<<fsjkdlkfjkals>> : "+obj);
				Map<String, String> re = new HashMap<String, String>();
				
				re.put("mem_cart_num", (String)obj.get("mem_cart_num"));
				re.put("used_product_num", (String)obj.get("used_product_num"));
				re.put("cart_quantity",(String)obj.get("cart_quantity"));
				re.put("store_product_num", (String)obj.get("store_product_num"));
				re.put("store_product_pricestandard", (String)obj.get("store_product_pricestandard"));
				
				list.add(re);
			}
			List<BookStorePaymentCartVO> cartList = new ArrayList<BookStorePaymentCartVO>();
			
			for(Map<String, String> map : list) {
				BookStorePaymentCartVO vo = new BookStorePaymentCartVO();
				if(map.get("mem_cart_num")!=null) {
				vo.setMem_cart_num(Integer.parseInt(map.get("mem_cart_num")));
				vo.setUsed_product_num(Integer.parseInt(map.get("used_product_num")));
				}
				vo.setCart_quantity(Integer.parseInt(map.get("cart_quantity")));
				vo.setStore_product_num(Integer.parseInt(map.get("store_product_num")));
				int price = Integer.parseInt(map.get("cart_quantity"))*Integer.parseInt(map.get("store_product_pricestandard").substring(0, map.get("store_product_pricestandard").length()-1));
				vo.setOrder_product_price(price);
				vo.setMem_num(mem_num);
				
				cartList.add(vo);
				log.debug("<<orderList>> : "+cartList);
				bookStorePaymentService.updateCart(vo);
			}
			mapJson.put("result", "success");
			session.setAttribute("cartList", cartList);
			session.setAttribute("total", total);
		} catch (Exception e) {  
			e.printStackTrace(); 
		}
		
		return mapJson;
	}
	
	//주문 페이지
	@GetMapping("/bookstore/payment/order.do")
	public String orderForm(HttpSession session, Model model) {
		log.debug("<<세션 확인 order >> : "+session.getAttribute("cartList"));
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			return "redirect:/lm/login/template/loginMain.do?lo=1";
		}		
		int mem_num = (Integer)session.getAttribute("mem_num");
		int count = 0;
		List<BookStorePaymentCartVO> list = (ArrayList)session.getAttribute("cartList");
		if(list == null) {//장바구니로 돌아가기
			return "redirect:/bookstore/payment/cart.do";
		}
		List<ProductVO> book_list = new ArrayList<ProductVO>();
		//회원 배송지 정보
		List<MemberVO> home_list = new ArrayList<MemberVO>();
		home_list = bookStorePaymentOrderService.selectMemHome(mem_num);
		//총 구매액
		int total = (int)session.getAttribute("total");
		for(BookStorePaymentCartVO vo : list) {
			ProductVO product = bookStorePaymentService.selectDetailBook(vo.getStore_product_num());
			log.debug("<<fjidslkjf>> : "+vo.getUsed_product_num());
			if(vo.getUsed_product_num() != 0) {//중고 상품 추가 정보
				UsedVO used = bookStorePaymentService.selectUsedBook(vo.getUsed_product_num());
				log.debug("<<도서 중고 정보>> : "+used);
				product.setUsed_product_price(used.getUsed_product_price());
				product.setUsed_product_status(used.getUsed_product_status());
				product.setUsed_product_num(used.getUsed_product_num());
			}
			book_list.add(product);
			count += vo.getCart_quantity();
		}
		
		MemberVO member = memberService.selectMember(mem_num);
		//배송정보
		MemberVO home = bookStorePaymentOrderService.selectDefaultHome(mem_num);
		//등급에 따른 포인트 정보
		double point = getPoint(member.getMem_grade());
		//상품 정보
		model.addAttribute("list", list);
		model.addAttribute("book_list", book_list);
		log.debug("<<주문페이지 확인-list>>"+list);
		log.debug("<<주문페이지 확인-book_list>>"+book_list);
		model.addAttribute("count", count);
		//금액 정보&회원 할인 정보
		model.addAttribute("total", total);
		model.addAttribute("mem", member);
		model.addAttribute("point", point);
		//회원 배송 정보
		model.addAttribute("home", home);
		log.debug("<<기본 배송지>> : "+home);	
		model.addAttribute("home_list", home_list);
		//log.debug("<<배송지 리스트>> : "+home_list);
		return "order";
	}
	//결제 검증
	@Value("${imp_key}")
	private String imp_key;
	@Value("${imp_secret}")
	private String imp_secret;

	@RestController
	@RequiredArgsConstructor
	@RequestMapping("/verifyIamport")
	private class VeriyController{
		private IamportClient api = new IamportClient(imp_key, imp_secret);
		
		@RequestMapping("/{imp_uid}")
		@ResponseBody
		public IamportResponse<Payment> paymentByUid(@PathVariable String imp_uid) throws IOException, IamportResponseException{
			log.debug("<<결제 검증>> : "+imp_uid);
			return api.paymentByImpUid(imp_uid);	
		}
	}
	
	//주문 성공시 주문 내역 저장
	@RequestMapping("/bookstore/payment/orderAction.do")
	@ResponseBody
	public Map<String, Object> payBook(String orderInfo, HttpSession session, String notice, int point) {
		log.debug("<<결제 데이터 확인>> : "+orderInfo);
		log.debug("<<배송시 요청사항>> : "+notice);
		int mem_num = (Integer)session.getAttribute("mem_num");		
		org.json.JSONObject jObject = new org.json.JSONObject(orderInfo);
		//boolean result = jObject.getBoolean("success");
		List<BookStorePaymentCartVO> list = (ArrayList)session.getAttribute("cartList");
		log.debug("<<주문완료 - cartList>> : "+list);
		BookStorePaymentOrderVO order = new BookStorePaymentOrderVO();
		//데이터 뽑기
		int total = (int)session.getAttribute("total");
		MemberVO mem_home = bookStorePaymentOrderService.selectDefaultHome(mem_num);
		order.setHome_num(mem_home.getHome_num());
		order.setMem_num(mem_home.getMem_num());
		order.setOrder_total_price(jObject.getInt("paid_amount"));
		order.setOrder_notice(notice);
		
		String type = jObject.getString("pg_provider");
		int payment_type = 1;
		if(type.equals("kakaopay")) {
			payment_type = 2;
		}
		order.setPayment_type(payment_type);
		order.setIMP_UID(jObject.getString("imp_uid"));
		log.debug("<<result-order>> : "+order);
		log.debug("<<result-cartList>> : "+list);
		//order 테이블 insert + 카트 정보 작세 + 재고 변경
		bookStorePaymentOrderService.insertOrder(order, list);
		
		//포인트 증감 - 회원 정보와 총금액
		Map<String, Object> map = new HashMap<String, Object>();
		MemberVO member = memberService.selectMember(mem_num);
		double grade = getPoint(member.getMem_grade());
		int addPoint = (int) Math.round(total*grade);//적립되는 포인트
		map.put("mem_num", mem_num);
		map.put("addPoint", (point*-1));//사용한 포인트
		map.put("order_num", order.getOrder_num());
		log.debug("<<포인트 - controller>> : "+map+','+addPoint);
		bookStorePaymentOrderService.updatePoint(map, addPoint);
		
		//세션 정보 삭제
		session.removeAttribute("cartList");
		session.removeAttribute("total");
		Map<String, Object> mapJson = new HashMap<String, Object>();
		
		mapJson.put("result", "success");
		mapJson.put("order", order);
		return mapJson;
	}

	//배송지 수정
	//폼
	@GetMapping("/bookstore/payment/homeModify.do")
	@ResponseBody
	public Map<String, Object> modifyForm(int home_num, HttpSession session){
		Map<String, Object> mapJson = new HashMap<String, Object>();
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			mapJson.put("result", "logout");
			return mapJson;
		}
		MemberVO homeInfo = bookStorePaymentOrderService.selectHome(home_num);
		log.debug("<<배송 정보 수정>> : "+homeInfo);
		mapJson.put("homeInfo", homeInfo);
		mapJson.put("result", "success");
		return mapJson;
	}
	//동작
	@PostMapping("/bookstore/payment/homeModify.do")
	@ResponseBody
	public Map<String, Object> modifyAction(MemberVO memberVO, HttpSession session){
		Map<String, Object> mapJson = new HashMap<String, Object>();
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			mapJson.put("result", "logout");
			return mapJson;
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		log.debug("<<수정 Action>> : "+memberVO);
		//기본 배송지로 설정한 주소 등록 시
		memberVO.setMem_num(mem_num);
		bookStorePaymentOrderService.updateHome(memberVO);
		if(memberVO.getHome_default() == 0) {
			mapJson.put("default", memberVO);
		}
		//회원 배송지 정보
		List<MemberVO> home_list = new ArrayList<MemberVO>();
		home_list = bookStorePaymentOrderService.selectMemHome(mem_num);
		log.debug("<<수정 ACTION - home_list>> : "+home_list);
		mapJson.put("result", "success");
		mapJson.put("home_list", home_list);
		return mapJson;
	}
	//배송지 등록
	@PostMapping("/bookstore/payment/homeInsert.do")
	@ResponseBody
	public Map<String, Object> insertHome(MemberVO memberVO, HttpSession session){
		Map<String, Object> mapJson = new HashMap<String, Object>();
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			mapJson.put("result", "logout");
			return mapJson;
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		memberVO.setMem_num(mem_num);
		log.debug("<<배송 정보>> : "+memberVO);
		bookStorePaymentOrderService.insertHome(memberVO);
		//회원 배송지 정보
		List<MemberVO> home_list = new ArrayList<MemberVO>();
		home_list = bookStorePaymentOrderService.selectMemHome(mem_num);
		//기본 배송지로 설정한 주소 등록 시
		if(memberVO.getHome_default() == 0) {
			mapJson.put("default", memberVO);
		}
			
		mapJson.put("result", "success");
		mapJson.put("home_list", home_list);
		return mapJson;
	}
	//배송지 삭제
	@RequestMapping("/bookstore/payment/homeDelete.do")
	@ResponseBody
	public Map<String, Object> deleteHome(int home_num, HttpSession session, Model model) {
		Map<String, Object> mapJson = new HashMap<String, Object>();
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			mapJson.put("result", "logout");
			return mapJson;
		}		
		int mem_num = (Integer)session.getAttribute("mem_num");
		bookStorePaymentOrderService.deleteHome(home_num);
		//회원 배송지 정보
		List<MemberVO> home_list = new ArrayList<MemberVO>();
		home_list = bookStorePaymentOrderService.selectMemHome(mem_num);
		mapJson.put("result", "success");
		mapJson.put("home_list", home_list);
		return mapJson;
	}
	//기본 배송지 업데이트
	@RequestMapping("/bookstore/payment/defaultChange.do")
	@ResponseBody
	public Map<String, Object> ChangeDefault(Integer home_num, HttpSession session){
		Map<String, Object> mapJson = new HashMap<String, Object>();
		String mem_id = (String)session.getAttribute("mem_id");
		if(mem_id == null) {
			mapJson.put("result", "logout");
		}
		int mem_num = (Integer)session.getAttribute("mem_num");
		MemberVO memberVO = memberService.selectMember(mem_num);
		memberVO.setMem_num(mem_num);
		bookStorePaymentOrderService.updateNormal(home_num, memberVO);
		//회원 배송지 정보
		List<MemberVO> home_list = new ArrayList<MemberVO>();
		home_list = bookStorePaymentOrderService.selectMemHome(mem_num);	
		log.debug("<<기본 배송지 업데이트>> : "+home_list);
		mapJson.put("result", "success");
		mapJson.put("home_list", home_list);
		return mapJson;
	}
	//영수증 페이지 보여주기
	@RequestMapping("/bookstore/payment/receipt.do")
	public String showReceipt(int order_num, HttpSession session, Model model) {
		log.debug("<<영수증 페이지>> : "+order_num);
		BookStorePaymentOrderVO order = bookStorePaymentOrderService.selectOrder(order_num);
		//책 정보
		List<BookStorePaymentOrderVO> list = bookStorePaymentOrderService.listOrder(order_num);
		String book_name = "";
		int product_num = list.get(0).getStore_product_num();
		ProductVO vo = bookStorePaymentOrderService.selectProductNum(product_num);
		if(list.size()>1) {
			int length = vo.getStore_product_title().length();
			int cut = 5;
			if( length <= 5) {
				cut = length-1;
			}
			book_name = vo.getStore_product_title().substring(0, cut)+"외 "+(list.size()-1)+"권";
		}else {
			book_name = vo.getStore_product_title();
		}
		MemberVO homeInfo = bookStorePaymentOrderService.selectHome(order.getHome_num());
		model.addAttribute("order", order);
		model.addAttribute("book_name", book_name);
		model.addAttribute("homeInfo", homeInfo);
		return "receipt";
	}

	//멤버 등급에 따른 포인드 % 가져오기
	public double getPoint(int grade) {
		double point = 0.005;
		if(grade == 1 ) point = 0.01;
		else if(grade == 2 ) point = 0.015;
		else if(grade == 3 ) point = 0.02;
		else if(grade == 4 ) point = 0.03;
		
		return point;
	}
}

🖥️ code_Service

ProductServiceImpl.java
@Service
@Transactional
public class ProductServiceImpl implements ProductService{
	@Autowired
	ProductMapper productMapper;
	
	@Override
	public ProductVO selectProduct(String store_product_isbn13) {
		return productMapper.selectProduct(store_product_isbn13);
	}

	@Override
	public List<ProductVO> selectList(Map<String, Object> map) {
		return productMapper.selectList(map);
	}

	@Override
	public int selectRowCount(Map<String, Object> map) {
		return productMapper.selectRowCount(map);
	}

	@Override
	public ProductFavVO selectFav(ProductFavVO fav) {
		return productMapper.selectFav(fav);
	}

	@Override
	public int selectFavCount(Integer store_product_num) {
		return productMapper.selectFavCount(store_product_num);
	}

	@Override
	public void insertFav(ProductFavVO fav) {
		productMapper.insertFav(fav);
	}

	@Override
	public void deleteFav(Integer ZZIM_NUM) {
		productMapper.deleteFav(ZZIM_NUM);
	}

	@Override
	public List<UsedVO> selectUsedNum(int store_product_num) {
		return productMapper.selectUsedNum(store_product_num);
	}
	
	@Override
	public List<ProductVO> selectBestBook() {
		return productMapper.selectBestBook();
	}

	@Override
	public List<ProductVO> selectNewBook() {
		return productMapper.selectNewBook();
	}

	@Override
	public List<ProductVO> selectFuture() {
		return productMapper.selectFuture();
	}

	@Override
	public List<ProductVO> selectCategoryBook(Map<String, Object> map) {
		return productMapper.selectCategoryBook(map);
	}

	@Override
	public int selectCategoryCount(Map<String, Object> map) {
		return productMapper.selectCategoryCount(map);
	}

	@Override
	public List<ProductVO> selectBestBookList(int start, int end) {
		List<ProductVO> list = productMapper.selectBestBookList(start, end);
		for(ProductVO vo : list) {
			if(vo.getStore_product_title().length()>=10) {
				String title = vo.getStore_product_title().substring(0, 10)+"...";
				vo.setStore_product_title(title);
			}
		}
		return productMapper.selectBestBookList(start, end);
	}

	@Override
	public List<ProductVO> selectCateTop3(String cate) {
		List<ProductVO> list = productMapper.selectCateTop3(cate);
		for(ProductVO vo : list) {
			if(vo.getStore_product_author().length()>=10) {
				String author = vo.getStore_product_author().substring(0, 10)+"...";
				vo.setStore_product_author(author);
			}
		}
		return list;
	}

	@Override
	public List<ProductVO> selectCateRandom(String cate) {
		return productMapper.selectCateRandom(cate);
	}

	@Override
	public List<ProductVO> selectCateNew(String cate) {
		List<ProductVO> list =  productMapper.selectCateNew(cate);
		for(ProductVO vo : list) {
			if(vo.getStore_product_author().length()>=10) {
				String author = vo.getStore_product_author().substring(0, 10)+"...";
				vo.setStore_product_author(author);
			}
		}
		return list;
	}

	@Override
	public List<ProductVO> selectNew(String cate) {
		List<ProductVO> list =  productMapper.selectNew(cate);
		for(ProductVO vo : list) {
			if(vo.getStore_product_title().length()>=10) {
				String title = vo.getStore_product_title().substring(0, 10)+"...";
				vo.setStore_product_title(title);
			}
		}
		return list;
	}


}
BookStorePaymentServiceImpl.java
@Service
@Transactional
@Slf4j
public class BookStorePaymentServiceImpl implements BookStorePaymentService{
	//api 값 가져오기
	@Value("${imp_key}")
	private String imp_key;
	@Value("${imp_secret}")
	private String imp_secret;
	
	@Data
	private class Response{
		private PaymentInfo response;
	}
	@Data
	private class PaymentInfo{
		private int amount;
	}
	
	@Autowired
	BookStorePaymentCartMapper bookStorePaymentCartMapper;
	//카트 추가
	@Override
	public void insertCart(BookStorePaymentCartVO cartVO) {
		bookStorePaymentCartMapper.insertCart(cartVO);
	}
	//카트 정보
	@Override
	public List<BookStorePaymentCartVO> selectCartList(int mem_num) {
		return bookStorePaymentCartMapper.selectCartList(mem_num);
	}
	//중고도서 중복 확인
	@Override
	public BookStorePaymentCartVO selectEmptyUsed(int used_product_num, int mem_num) {
		return bookStorePaymentCartMapper.selectEmptyUsed(used_product_num, mem_num);
	}
	//도서 상세
	@Override
	public ProductVO selectDetailBook(int store_product_num) {
		return bookStorePaymentCartMapper.selectDetailBook(store_product_num);
	}
	//재고 변경
	@Override
	public void updateBookQuantity(int total, int mem_cart_num) {
		bookStorePaymentCartMapper.updateBookQuantity(total, mem_cart_num);
	}

	@Override
	public void updateCart(BookStorePaymentCartVO cartVO) {
		bookStorePaymentCartMapper.updateCart(cartVO);
	}

	
//토큰 값 받아오기
	@Override
	public String getToken() throws IOException {
		log.debug("<<KEY 값 : >>"+imp_key);
		log.debug("<<Secret 값 : >>"+imp_secret);
		
		BufferedWriter bw = null;
		BufferedReader br = null;
		String token = null;
		//REST API 호출에 사용
		HttpsURLConnection conn = null;

		try {
			//IOException 발생
			URL url = new URL("https://api.iamport.kr/users/getToken");//토큰 값을 받아오는 주소
			conn = (HttpsURLConnection) url.openConnection();
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Content-type", "application/json");
			conn.setRequestProperty("Accept", "application/json");
			conn.setDoOutput(true);
			
			JsonObject json = new JsonObject(); //String 객체를 json 객체로 바꿔줄 때 사용한다 google.gson ~
			json.addProperty("imp_key", imp_key);
			json.addProperty("imp_secret", imp_secret);
			
			bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
			bw.write(json.toString());
			bw.flush();
			bw.close();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
			
			Gson gson = new Gson();//json 구조의 직렬화 된 데이터를 java 객체로 역직렬화 해주는 라이브러리 (직렬화도 해줌)
			//============추가로 설명 작성=====================//
			String response = gson.fromJson(br.readLine(), Map.class).get("response").toString();
			log.debug("<<getToken Method - response>> : "+response);//로그 확인
			//토큰 값 받기
			token = gson.fromJson(response, Map.class).get("access_token").toString();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(bw != null)try {bw.close();} catch(IOException e) {}
			if(br != null)try {br.close();} catch(IOException e) {}
		}
		return token;
	}
	//결제 정보 가져오기
	@Override
	public int paymentInfo(String token, String IMP_UID) throws IOException {
		HttpURLConnection conn = null;
		URL url = new URL("https://api.iamport.kr/payments/"+IMP_UID);
		
		conn = (HttpURLConnection)url.openConnection();
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Authorization", token);
		conn.setDoOutput(true);// OutputStream으로 POST 데이터를 넘겨주겠다는 옵션
		
		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
		Gson gson = new Gson();
		
		Response response = gson.fromJson(br.readLine(), Response.class);
		log.debug("<<response>> : "+response);
		
		br.close();
		conn.disconnect();
		
		return response.getResponse().getAmount();
	}

	//결제 취소하기
	@Override
	public void cancelPay(String token, String IMP_UID, int amount,String reason)throws IOException {
		log.debug("<<토큰 받기 성공!!>> : "+token);
		log.debug("<<주문 정보 가져오기 성공 !!>> : "+amount);
		
		HttpsURLConnection conn = null;
		URL url = new URL("https://api.iamport.kr/payments/cancel");//주문 취소 API주소 > io예외처리 
		conn = (HttpsURLConnection)url.openConnection(); //주소 연결
		
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-type", "application/json");
		conn.setRequestProperty("Authorization", token);
		
		conn.setDoOutput(true);
		
		JsonObject json = new JsonObject();
		json.addProperty("reason", reason);
		json.addProperty("imp_uid", IMP_UID);
		json.addProperty("amount", amount);
		json.addProperty("checksum", amount);//가격 체크
		// Request Body에 Data를 담기위해 OutputStream 객체를 생성. // 데이터를 reqestbody에 담아서 서버로 보냄
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
		bw.write(json.toString());//버퍼에 있는 값 출력
		bw.flush();//남아있는 값 전부 출력
		bw.close();//스트림을 닫음
		//서버로 부터의 응답을 읽음
		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
		Gson gson = new Gson();//json 구조의 직렬화 된 데이터를 java 객체로 역직렬화 해주는 라이브러리 (직렬화도 해줌)
		//============추가로 설명 작성=====================//
		String response = gson.fromJson(br.readLine(), Map.class).get("response").toString();
		log.debug("<<결제 취소 응답>> : "+response);
		br.close();
		conn.disconnect();
	}

	@Override
	public UsedVO selectUsedBook(int used_product_num) {
		return bookStorePaymentCartMapper.selectUsedBook(used_product_num);
	}
	@Override
	public void deleteCart(int mem_cart_num) {
		bookStorePaymentCartMapper.deleteCart(mem_cart_num);
	}
}
BookStorePaymentOrderServiceImpl.java
@Service
@Slf4j
public class BookStorePaymentOrderServiceImpl implements BookStorePaymentOrderService{
	@Autowired
	BookStorePaymentOrderMapper bookStorePaymentOrderMapper;
	@Autowired
	BookStorePaymentCartMapper	bookStorePaymentCartMapper;
	@Autowired
	MemberService memberService;
	@Autowired 
	BsEventMapper bsEventMapper; //포인트 적립 관련
	@Autowired
	PointMapper pointMapper;
	//주문 테이블 저장
	@Override
	public void insertOrder(BookStorePaymentOrderVO bookStorePaymentOrderVO, List<BookStorePaymentCartVO> cartInfo) {
		int order_num = bookStorePaymentOrderMapper.selectOrder_num();
		
		bookStorePaymentOrderVO.setOrder_num(order_num);
		bookStorePaymentOrderMapper.insertOrder(bookStorePaymentOrderVO);
		
		for(BookStorePaymentCartVO vo : cartInfo) {
			log.debug("<<insert-detail>> : "+vo);
			vo.setOrder_num(order_num);
			//도서 상세 등록 후 해당 도서 장바구니에서 삭제
			bookStorePaymentOrderMapper.insertDetailOrder(vo);
			bookStorePaymentCartMapper.deleteCart(vo.getMem_cart_num());
			if(vo.getUsed_product_num() != 0) {
				bookStorePaymentOrderMapper.updateUsed(0,vo.getUsed_product_num());
				continue;
			}
			int quantity = vo.getCart_quantity()*-1;
			bookStorePaymentOrderMapper.updateProduct(vo.getStore_product_num(),quantity);
		}
	}
	

//배송지 관련
	@Override
	public MemberVO selectHome(int home_num) {
		return bookStorePaymentOrderMapper.selectHome(home_num);
	}

	@Override
	public List<MemberVO> selectMemHome(int mem_num) {
		return bookStorePaymentOrderMapper.selectMemHome(mem_num);
	}
//배송지 추가
	@Override
	public void insertHome(MemberVO memberVo) {
		if(memberVo.getHome_default() == 0) {
			MemberVO member = memberService.homeDefault(memberVo.getMem_num());
			log.debug("<<update home>> : "+member);
			bookStorePaymentOrderMapper.updateDefault(member);
		}
		bookStorePaymentOrderMapper.insertHome(memberVo);
	}
	@Override
	public void deleteHome(int home_num) {
		bookStorePaymentOrderMapper.deleteHome(home_num);;
	}
	@Override
	public MemberVO selectDefaultHome(int mem_num) {
		return bookStorePaymentOrderMapper.selectDefaultHome(mem_num);
	}
	@Override
	public void updateHome(MemberVO memberVO) {
		if(memberVO.getHome_default() == 0) {
			MemberVO member = memberService.homeDefault(memberVO.getMem_num());
			bookStorePaymentOrderMapper.updateDefault(member);
		}
		bookStorePaymentOrderMapper.updateHome(memberVO);
	}
	@Override
	public void updateNormal(int home_num, MemberVO mem) {
		bookStorePaymentOrderMapper.updateDefault(mem);
		bookStorePaymentOrderMapper.updateNormal(home_num);
	}
	@Override
	public BookStorePaymentOrderVO selectOrder(int order_num) {
		return bookStorePaymentOrderMapper.selectOrder(order_num);
	}
	@Override
	public List<BookStorePaymentOrderVO> listOrder(int order_num) {
		return bookStorePaymentOrderMapper.listOrder(order_num);
	}
	@Override
	public ProductVO selectProductNum(int product_num) {
		return bookStorePaymentOrderMapper.selectProductNum(product_num);
	}
	//==================주문 취소==========================//
	//imp_uid 값 구하기
	@Override
	public String selectImp_uid(int order_num) {
		return bookStorePaymentOrderMapper.selectImp_uid(order_num);
	}
	@Override
	public void updateCancelInfo(int order_num, String cancel_notice) {
		bookStorePaymentOrderMapper.updateCancelInfo(order_num, cancel_notice);
	}
	@Override
	public void updateQuantity(List<BookStorePaymentOrderVO> order) {
		log.debug("<<결제 취소 재고 변경>> : "+order);
		for(BookStorePaymentOrderVO vo : order) {
			if(vo.getUsed_product_num() != 0) {
				bookStorePaymentOrderMapper.updateUsed(1, vo.getUsed_product_num());
				continue;
			}
			int quantity = vo.getCart_quantity();
			bookStorePaymentOrderMapper.updateProduct(vo.getStore_product_num(),quantity);
		}
	}
	

	@Override
	public void updatePoint(Map<String, Object> map,int addPoint) {
		//포인트 차감 & 적립
		PointVO vo = new PointVO();
		vo.setMem_num((Integer)map.get("mem_num"));
		String order = String.valueOf(map.get("order_num"));
		vo.setPoint_reason(order);
		vo.setPoint_value((Integer)map.get("addPoint"));
		vo.setPoint_status(3);
		bsEventMapper.updateMemberPoint(map);
		//포인트 내역 등록
		pointMapper.insertOrderPoint(vo);
		log.debug("<<포인트 등록>> : "+vo);
		//적립 예정 포인트
		/*map.put("addPoint", addPoint);
		vo.setPoint_value((Integer)map.get("addPoint"));
		vo.setPoint_status(0);
		bsEventMapper.updateMemberPoint(map);
		pointMapper.insertOrderPoint(vo);*/
		//포인트 로그 등록
	}

	//주문 취소 포인트 조회
	@Override
	public void selectPoint(String point_reason) {
		//포인트 조회
		List<PointVO> point = pointMapper.selectPoint(point_reason);
		log.debug("<<주문 취소-포인트 조회>> : "+point);
		Map<String, Object> map = new HashMap<String, Object>();
		for(PointVO vo : point) {
			map.put("mem_num", vo.getMem_num());
			map.put("addPoint", (vo.getPoint_value()*-1));
			//내 포인트 변경
			bsEventMapper.updateMemberPoint(map);
		}
		//포인트 테이블 status 변경
		pointMapper.updatePointStatus(point_reason);
	}
}

🖥️ code_Mapper

ProductMapper.java
@Mapper
public interface ProductMapper { 
	//알라딘 api에서 데이터 추출 후 db연동
	public void fetchData1FromApi();
	public void fetchData2FromApi(String isbn13);
	//api 상품 수정
	public void updateStore_P(ProductVO productVO);
	public void updateStore_Pdetail(ProductVO productVO);
	//책 번호 생성
	@Select("SELECT STORE_PRODUCT_MANAGE_seq.nextval FROM dual")
	public int selectStoreProductNum();	
	public void insertStore_P(ProductVO ProductVO);
	public void insertStore_Pdetail(ProductVO ProductVO);
	
	//상품리스트
	public List<ProductVO> selectList(Map<String,Object> map);
	public int selectRowCount(Map<String,Object> map);
	
	//상품 번호로 중고 상품 번호 리스트
	public List<UsedVO> selectUsedNum(int store_product_num);
	
	//상품 상세
	public ProductVO selectProduct(String store_product_isbn13);
	
	
	//좋아요
	@Select("SELECT * FROM STORE_MEMBER_ZZIM WHERE store_product_num=#{store_product_num} AND mem_num=#{mem_num}")
	public ProductFavVO selectFav(ProductFavVO fav);
	@Select("SELECT COUNT(*) FROM STORE_MEMBER_ZZIM WHERE store_product_num=#{store_product_num}")
	public int selectFavCount(Integer store_product_num);
	@Insert("INSERT INTO STORE_MEMBER_ZZIM (ZZIM_NUM,store_product_num,mem_num) VALUES (STORE_MEMBER_ZZIM_SEQ.nextval,#{store_product_num},#{mem_num})")
	public void insertFav(ProductFavVO fav);
	@Delete("DELETE FROM STORE_MEMBER_ZZIM WHERE ZZIM_NUM=#{ZZIM_NUM}")
	public void deleteFav(Integer ZZIM_NUM);
	@Delete("DELETE FROM STORE_MEMBER_ZZIM WHERE store_product_num=#{store_product_num}")
	public void deleteFavByProductNum(Integer store_product_num);	
	
	//메인 페이지
	//상품 댓글 수 & 평점 수 상위 5개 도서 뽑기
	@Select("SELECT * FROM( SELECT * FROM store_product_manage m JOIN store_product_detail USING(store_product_num) ORDER BY store_product_ratingCount DESC)  WHERE rownum >= 1 AND rownum <=5 ORDER BY store_product_ratingscore DESC")
	public List<ProductVO> selectBestBook();
	//신간 도서
	@Select("SELECT * FROM store_product_manage m JOIN store_product_detail USING(store_product_num) WHERE store_product_pubdate <= SYSDATE  AND rownum <=5 ORDER BY store_product_pubdate DESC")
	public List<ProductVO> selectNewBook();
	//출판 예정 도서
	@Select("SELECT * FROM (SELECT * FROM store_product_manage m JOIN store_product_detail USING(store_product_num) ORDER BY store_product_pubdate DESC) WHERE rownum <= 5")
	public List<ProductVO> selectFuture();
	
	//분야별 랜덤 도서 추천 5개
	public List<ProductVO> selectCateRandom(String cate);
	
	//카테고리 별 도서 검색
	public List<ProductVO> selectCategoryBook(Map<String, Object> map);
	//카데고리 별 도서 개수
	public int selectCategoryCount(Map<String, Object> map);
	//Best 도서
	public List<ProductVO> selectBestBookList(int start, int end);
	//분야별 TOP3
	public List<ProductVO> selectCateTop3(String cate);
	//분야별 신규도서
	public List<ProductVO> selectCateNew(String cate);
	//국내&외국도서 신규
	public List<ProductVO> selectNew(String cate);
	
}
ProductMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.spring.bookstore.product.dao.ProductMapper">
	<!-- api 등록 -->
	<insert id="insertStore_P" parameterType="ProductVO">
		INSERT INTO STORE_PRODUCT_MANAGE(
			STORE_PRODUCT_NUM,
			STORE_PRODUCT_SEARCHCATEGORYID,
			STORE_PRODUCT_ISBN13,
			STORE_PRODUCT_STOCKSTATUS,
			STORE_PRODUCT_SEARCHCATEGORYNAME
		) VALUES (
			#{store_product_num},
			#{store_product_searchcategoryId},
			#{store_product_isbn13},
			#{store_product_stockstatus},
			#{store_product_searchcategoryName}
		)
	</insert>
	<insert id="insertStore_Pdetail" parameterType="ProductVO">
		INSERT INTO STORE_PRODUCT_DETAIL(
			STORE_PRODUCT_NUM,
			store_product_title,
			store_product_author,
			store_product_pubdate,
			store_product_cover,
			store_product_description,
			store_product_categoryid,
			store_product_categoryname,
			store_product_pricesales,
			store_product_pricestandard,
			store_product_publisher,
			store_product_stock,
			store_product_seriesId,
			store_product_seriesName,
			store_product_customerReviewRank,
			store_product_ratingCount,
			store_product_discount,
			store_product_ratingScore,
			store_product_status
			 
		) VALUES (
			#{store_product_num},
			#{store_product_title},
			#{store_product_author},
			#{store_product_pubdate},
			#{store_product_cover},
			#{store_product_description},
			#{store_product_categoryid},
			#{store_product_categoryname},
			#{store_product_pricesales},
			#{store_product_pricestandard},
			#{store_product_publisher},
			#{store_product_stock},
			#{store_product_seriesId},
			#{store_product_seriesName},
			#{store_product_customerReviewRank},
			#{store_product_ratingCount},
			#{store_product_discount},
			#{store_product_ratingScore},
			#{store_product_status}
			
		)
	</insert>
	
	<!-- api 수정 -->	
	<update id="updateStore_P" parameterType="ProductVO">
		UPDATE STORE_PRODUCT_MANAGE SET
			STORE_PRODUCT_SEARCHCATEGORYID=#{store_product_searchcategoryId},
			STORE_PRODUCT_ISBN13=#{store_product_isbn13},
			STORE_PRODUCT_STOCKSTATUS=#{store_product_stockstatus},
			STORE_PRODUCT_SEARCHCATEGORYNAME=#{store_product_searchcategoryName}
		WHERE STORE_PRODUCT_NUM=#{store_product_num}
	</update>
	<update id="updateStore_Pdetail" parameterType="ProductVO">
		UPDATE STORE_PRODUCT_DETAIL SET
			store_product_title=#{store_product_title},
			store_product_author=#{store_product_author},
			store_product_pubdate=#{store_product_pubdate},
			store_product_cover=#{store_product_cover},
			store_product_description=#{store_product_description},
			store_product_categoryid=#{store_product_categoryid},
			store_product_categoryname=#{store_product_categoryname},
			store_product_pricesales=#{store_product_pricesales},
			store_product_pricestandard=#{store_product_pricestandard},
			store_product_publisher=#{store_product_publisher},
			store_product_stock=#{store_product_stock},
			store_product_seriesId=#{store_product_seriesId},
			store_product_seriesName=#{store_product_seriesName},
			store_product_customerReviewRank=#{store_product_customerReviewRank},
			store_product_ratingCount=#{store_product_ratingCount},
			store_product_discount=#{store_product_discount},
			store_product_ratingScore=#{store_product_ratingScore},
			store_product_status=#{store_product_status}
		WHERE STORE_PRODUCT_NUM=#{store_product_num}			
	</update>	
	
	<!-- 게시판 목록 -->
	<sql id="productSearch">
			<if test="keyword != null and keyword != ''">
				<if test="keyfield==1">
					d.STORE_PRODUCT_TITLE LIKE '%' || #{keyword} || '%'
				</if>
				<if test="keyfield==2">
					d.STORE_PRODUCT_DESCRIPTION LIKE '%' || #{keyword} || '%'
				</if>
				<if test="keyfield==3">
					d.STORE_PRODUCT_TITLE LIKE '%' || #{keyword} || '%' or 
					d.STORE_PRODUCT_DESCRIPTION LIKE '%' || #{keyword} || '%'
				</if>
			</if>
	</sql>

	<!-- 중고 -->
	<select id="selectUsedNum" parameterType="integer" resultType="usedVO">
		SELECT 
			* 
		FROM store_product_detail 
		RIGHT OUTER JOIN store_used_product_manage USING(store_product_num)
		RIGHT OUTER JOIN store_used_product_detail USING(used_product_num)
		WHERE store_product_num=#{store_product_num}	
	</select>
	
	<!-- 나중에 판매량 추가 -->
	<sql id="productOrder">
		<if test="order==1">
			ORDER BY d.store_product_num DESC
		</if>
		<if test="order==2">
			ORDER BY d.store_product_pricestandard DESC
		</if>
		<if test="order==3">
			ORDER BY d.store_product_pricestandard ASC
		</if>
		<if test="order==4"><!-- 최신순 -->
			ORDER BY store_product_pubdate DESC
		</if>
	</sql>
	
	<!-- 전체/검색 레코드수 -->
	<select id="selectRowCount" parameterType="map" resultType="integer">
		SELECT
			COUNT(*)
		FROM store_product_detail d JOIN store_product_manage m
		ON d.store_product_num=m.store_product_num
		<where>
			<include refid="productSearch"></include>
			<!-- <include refid="searchCategoryId"></include> -->
		</where>
	</select>
	
	<!-- 국내도서/외국도서 -->
	<sql id="searchCategoryId">
		<if test="store_product_searchcategoryid==0">
			m.store_product_searchcategoryid=0
		</if>
		<if test="store_product_searchcategoryid==1">
			m.store_product_searchcategoryid=1
		</if>
	</sql>
	
	<!-- 전체/검색 목록 -->
	<select id="selectList" parameterType="map" resultType="productVO">
		SELECT
			*
		FROM (SELECT
				a.*,
				rownum rnum
			  FROM (SELECT
						*
			  		FROM store_product_detail d
			  		JOIN store_product_manage m
			  		ON d.store_product_num=m.store_product_num
			  		<where>
				  		<include refid="productSearch"></include>
<!-- 						<include refid="searchCategoryId"></include> -->
			  		</where>
			  		<include refid="productOrder"></include>
			  		)a)
		<![CDATA[
		WHERE rnum>=#{start} AND rnum<=#{end}
		]]>
	</select>	
	
	<!-- 상품 상세 -->
	<select id="selectProduct" parameterType="string">
		SELECT
		  * 
		FROM STORE_PRODUCT_DETAIL d JOIN STORE_PRODUCT_MANAGE p USING(store_product_num)
		WHERE store_product_isbn13=#{store_product_isbn13}
	</select>
	
	
	<!-- 임시) 상품 등록 -->
	<insert id="insertProduct" parameterType="productVO">
	
	
	</insert>
	<!-- 최신글 등등 -->
	<sql id="selectHow">
	
	</sql>
	<!-- 상품 리스트 -->
	<select id="selectCategoryBook" parameterType="map" resultType="productVO">
		SELECT * FROM
		(SELECT a.*, rownum rnum FROM 
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING(store_product_num) 
		WHERE m.store_product_searchcategoryname = #{store_product_searchcategoryName}
		AND d.store_product_categoryname LIKE '%' || #{store_product_categoryname} || '%'
		<include refid="productOrder"></include>)a)
	<![CDATA[
		WHERE rnum>=#{start} AND rnum<=#{end}
		]]>
	</select>
	
	<select id="selectCategoryCount" parameterType="map" resultType="integer">
		SELECT COUNT(*) FROM 
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING(store_product_num) 
		WHERE m.store_product_searchcategoryname = #{store_product_searchcategoryName}
		AND d.store_product_categoryname LIKE '%' || #{store_product_categoryname} || '%')a 
	</select>
	
	<select id="selectBestBookList" parameterType="integer" resultType="productVO">
		SELECT * FROM
		(SELECT a.*, rownum rnum FROM
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING (store_product_num) 
		WHERE MONTHS_BETWEEN(LAST_DAY(SYSDATE),store_product_pubdate) BETWEEN #{start} AND #{end}
		ORDER BY store_product_ratingcount DESC, store_product_ratingscore DESC)a)
			<![CDATA[
			WHERE rnum>=1 AND rnum<=10
			]]>
	</select>
	<!-- 분야별 TOP3 -->
	<select id="selectCateTop3" parameterType="string" resultType="productVO">
		SELECT * FROM
		(SELECT a.*, rownum rnum FROM
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING (store_product_num) 
		WHERE store_product_categoryname LIKE '%' || #{store_product_categoryname} || '%'
		ORDER BY store_product_ratingcount DESC, store_product_ratingscore DESC)a)
			<![CDATA[
			WHERE rnum>=1 AND rnum<=3
			]]>
	</select>
	<!-- 분야별 신규도서 -->
	<select id="selectCateNew" parameterType="string" resultType="productVO">
		SELECT * FROM
		(SELECT a.*, rownum rnum FROM
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING (store_product_num) 
		WHERE store_product_categoryname LIKE '%' || #{store_product_categoryname} || '%'
		<![CDATA[
		 AND store_product_pubdate <= SYSDATE
		 ]]>
		ORDER BY store_product_pubdate DESC)a)
		<![CDATA[
			WHERE rnum>=1 AND rnum<=3
			]]>
	</select>
	<!-- 국내&외국 신규도서 -->
	<select id="selectNew" parameterType="string" resultType="productVO">
		SELECT * FROM
		(SELECT a.*, rownum rnum FROM
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING (store_product_num)
		WHERE store_product_searchcategoryname = #{cate} 
		<![CDATA[
		 AND store_product_pubdate <= SYSDATE
		 ]]>
		ORDER BY store_product_pubdate DESC)a)
		<![CDATA[
			WHERE rnum>=1 AND rnum<=10
			]]>
	</select>
	<!-- 분야 랜덤 추천 -->
	<select id="selectCateRandom" parameterType="string" resultType="productVO">
		SELECT * FROM
		(SELECT a.*, rownum rnum FROM
		(SELECT * FROM store_product_manage m JOIN store_product_detail d USING (store_product_num) 
		WHERE store_product_categoryname LIKE '%' || #{store_product_categoryname} || '%'
		ORDER BY DBMS_RANDOM.VALUE)a)
			<![CDATA[
			WHERE rnum>=1 AND rnum<=5
			]]>	
	</select>
</mapper>
BookStorePaymentCartMapper.java
@Mapper
public interface BookStorePaymentCartMapper {
	@Insert("insert into store_cart (mem_cart_num, mem_num, store_product_num, store_product_status, cart_quantity, used_product_num) values (em_cart_seq.nextval, #{mem_num}, #{store_product_num}, #{store_product_status},#{cart_quantity}, #{used_product_num})")
	public void insertCart(BookStorePaymentCartVO cartVO);
	
	@Select("select * from store_cart where mem_num = #{mem_num}")
	public List<BookStorePaymentCartVO> selectCartList(int mem_num);
	
	//도서 상세 정보
	public ProductVO selectDetailBook(int store_product_num);
	//중고 도서 정보
	@Select("SELECT * FROM store_used_product_detail d JOIN store_used_product_manage m USING(used_product_num) WHERE used_product_num = #{used_product_num}")
	public UsedVO selectUsedBook(int used_product_num);
	//카트 중고도서 중복확인
	@Select("SELECT * FROM store_cart WHERE used_product_num = #{used_product_num} AND mem_num = #{mem_num}")
	public BookStorePaymentCartVO selectEmptyUsed(int used_product_num,int mem_num);
	//중복 도서 합치기
	@Update("UPDATE store_cart SET cart_quantity = #{total} WHERE mem_cart_num = #{mem_cart_num}")
	public void updateBookQuantity(int total, int mem_cart_num);
	
	//주문 시 카트 변경사항 저장
	@Update("UPDATE store_cart SET cart_quantity = #{cart_quantity} WHERE mem_cart_num = #{mem_cart_num}")
	public void updateCart(BookStorePaymentCartVO cartVO);
	
	//장바구니에서 도서 삭제
	@Delete("DELETE FROM store_cart WHERE mem_cart_num = #{mem_cart_num}")
	public void deleteCart(int mem_cart_num);
}
BookStorePaymentCartMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
	namespace="kr.spring.bookstore.payment.dao.BookStorePaymentCartMapper">
	<select id="selectDetailBook" parameterType="integer" resultType="productVO">
		SELECT
		*
		FROM STORE_PRODUCT_DETAIL d JOIN STORE_PRODUCT_MANAGE p
		USING(store_product_num)
		WHERE store_product_num=#{store_product_num}
	</select>   
</mapper>
BookStorePaymentOrderMapper.java
@Mapper
public interface BookStorePaymentOrderMapper {
	//주문번호 생성
	@Select("SELECT store_order_manage_seq.nextval FROM dual")
	public int selectOrder_num();
	//주문 테이블 추가
	public void insertOrder(BookStorePaymentOrderVO bookStorePaymentOrderVO);
	public void insertDetailOrder(BookStorePaymentCartVO bookStorePaymentCartVO);
	
	//주문 정보
	@Select("SELECT * FROM store_order_manage WHERE order_num = #{order_num}")
	public BookStorePaymentOrderVO selectOrder(int order_num);
	//주문 상세 정보
	@Select("SELECT * FROM store_order_detail WHERE order_num = #{order_num}")
	public List<BookStorePaymentOrderVO> listOrder(int order_num);
	
	//배송 정보
	//home_num로 주소 찾기
	@Select("SELECT * FROM store_member_home WHERE home_num = #{home_num}")
	public MemberVO selectHome(int home_num);
	//회원 번호로 주소 찾기
	@Select("SELECT * FROM store_member_home WHERE mem_num = #{mem_num}")
	public List<MemberVO> selectMemHome(int mem_num);
	//회원의 기본 배송지 찾기
	@Select("SELECT * FROM store_member_home WHERE mem_num = #{mem_num} AND home_default = 0")
	public MemberVO selectDefaultHome(int mem_num);
	
	//주소 등록 하기
	@Insert("INSERT INTO store_member_home (home_num,mem_num,home_title,home_zipcode,home_address,home_address_detail,home_cell,home_name,home_default) VALUES (lm_member_manage_seq.nextval,#{mem_num},#{home_title},#{home_zipcode},#{home_address},#{home_address_detail},#{mem_cell},#{mem_name},#{home_default})")
	public void insertHome(MemberVO member);
	//기본 배송지 > 일반 변경
	@Update("UPDATE store_member_home SET home_default = 1 WHERE home_default = 0 AND mem_num = #{mem_num}")
	public void updateDefault(MemberVO memberVO);
	//일반 > 기본 배송지
	@Update("UPDATE store_member_home SET home_default = 0 WHERE home_num = #{home_num}")
	public void updateNormal(int home_num);
	//배송지 수정
	public void updateHome(MemberVO memberVO);
	
	//배송지 삭제
	@Delete("DELETE FROM store_member_home WHERE home_num = #{home_num}")
	public void deleteHome(int home_num);

	//도서 번호 검색
	@Select("SELECT * FROM store_product_detail WHERE store_product_num = #{product_num}")
	public ProductVO selectProductNum(int product_num);
	
	//주문 후 중고 status 값 바꾸기
	@Update("UPDATE store_used_product_manage SET used_product_status = #{num} WHERE used_product_num = #{used_product_num}")
	public void updateUsed(int num, int used_product_num);
	//구매 후 수량 변경
	@Update("UPDATE store_product_detail SET store_product_stock = store_product_stock+#{quantity} WHERE store_product_num = #{store_product_num}")
	public void updateProduct(int store_product_num, int quantity);	
	
	//주문 번호로 imp_uid를 가져오기
	@Select("SELECT imp_uid FROM store_order_manage WHERE order_num = #{order_num}")
	public String selectImp_uid(int order_num);
	//주문 취소후 주문상태와 취소 메시지 넣기
	@Update("UPDATE store_order_manage SET order_pay_status = 0,cancel_notice = #{cancel_notice} WHERE order_num = #{order_num}")
	public void updateCancelInfo(int order_num, String cancel_notice);
	
}
BookStorePaymentOrderMapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
	namespace="kr.spring.bookstore.payment.dao.BookStorePaymentOrderMapper">
	
	<insert id="insertOrder" parameterType="bookStorePaymentOrderVO">
		INSERT INTO store_order_manage
			(order_num,
			 mem_num, 
			 home_num, 
			 order_total_price, 
			 order_notice,
			 payment_type,
			 imp_uid
			 )
			 VALUES(
			 	#{order_num},
			 	#{mem_num},
			 	#{home_num},
			 	#{order_total_price},
			 	#{order_notice},
			 	#{payment_type},
			 	#{IMP_UID}
			 	)
	</insert>
	<insert id="insertDetailOrder" parameterType="bookStorePaymentCartVO">
		INSERT INTO store_order_detail(
			order_detail_num,
			order_num,
			store_product_num,
			order_product_price,
			cart_quantity,
			used_product_num
		)VALUES(
			store_order_detail_seq.nextval,
			#{order_num},
			#{store_product_num},
			#{order_product_price},
			#{cart_quantity},
			#{used_product_num}
		)
	</insert>
	<update id="updateHome" parameterType="memberVO">
		UPDATE store_member_home SET 
			home_title = #{home_title},
			home_zipcode = #{home_zipcode},
			home_address = #{home_address},
			home_address_detail = #{home_address_detail},
			home_cell = #{mem_cell},
			home_name = #{mem_name},
			home_default = #{home_default}
		WHERE home_num = #{home_num}
	</update>
</mapper>

📷 View

전체 도서 목록
베스트셀러
신규도서
장바구니
주문페이지
영수증
⚠️ **GitHub.com Fallback** ⚠️