처음 프로젝트를 시작할때 난 내가 맡은 파트를 제대로 이해하지 못 했다.
왜 ProductOrder 테이블과 OrderDetail테이블이 1:N 관계인지 몰랐다.
그래서 사실 개발 초반에는 이 부분을 이해하는데 시간이 걸렸다.
추후에 한 주문에 여러가지 물건을 살 수 있고, 그 물건들의 상세 주문 내역도 포함되어 있어야 한다는걸 알고 이 부분이
관계형테이터베이스를 뜻하는걸 알았다.
오라클db에 테이블 만들고, dto 만들고, dao 만들고 controller를 만들기 시작했다.
제일 먼저 주문 정보 등록 쿼리문을 작성하는데 처음에는 order_no values 값에 ?가 아닌 order_detail_seq.nextval 를 작성했는데 주문,주문상세 테이블에 다른 orderNo가 들어갔다.
그래서 order_detail_seq.nextval가 아닌 ?를 작성했다.
주문번호(시퀀스) = 주문테이블에서의 주문번호와 주문상세테이블에서의 주문번호는 동일해야한다.(같은 시퀀스부여)-등록할때만 시퀀스!
package com.petpal.controller;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.AddReads;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.jaxb.SpringDataJaxb.OrderDto;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.support.RequestContextUtils;
import com.petpal.dao.CartDao;
import com.petpal.dao.MemberDao;
import com.petpal.dao.OrderDao;
import com.petpal.dao.ProductDao;
import com.petpal.dao.ProductWithImageDao;
import com.petpal.dto.CartDto;
import com.petpal.dto.CategoryCountDto;
import com.petpal.dto.MemberDto;
import com.petpal.dto.OrderDetailDto;
import com.petpal.dto.ProductDto;
import com.petpal.dto.ProductOrderDto;
import com.petpal.dto.ProductWithImageDto;
import com.petpal.vo.PaginationVO;
@Controller
@RequestMapping("/shop")
public class OrderController {
@Autowired
private OrderDao orderDao;
@Autowired
private CartDao cartDao;
@Autowired
private MemberDao memberDao;
@Autowired
private ProductWithImageDao productWithImageDao;
@Autowired
private ProductDao productDao;
//주문내역 (cartDao에서 가져옴) , 주문자 이름,이메일 가져오기
@GetMapping("/order")
public String order(HttpSession session, Model model) {
String memberId = (String) session.getAttribute("memberId");
//주문내역 (장바구니에 있는 이름, 이미지,수량,가격 불러오기)
List<CartDto> cartList= cartDao.getCart(memberId);
model.addAttribute("cartList",cartList);
//구매자 (MEMBER테이블에 있는 이름,이메일,전화번호 불러오기)
MemberDto findDto = memberDao.selectOne(memberId);
model.addAttribute("findDto",findDto);
return "/WEB-INF/views/shop/order.jsp";
}
//2.주문정보 등록
@PostMapping("/order")
public String insert(@ModelAttribute ProductOrderDto productOrderDto,HttpSession session,RedirectAttributes attr) {
String memberId = (String) session.getAttribute("memberId");
//주문번호(시퀀스) = 주문테이블에서의 주문번호와 주문상세테이블에서의 주문번호는 동일해야한다.(같은 시퀀스부여)-등록할때만 시퀀스!
int orderNo = orderDao.sequence();
//주문정보 등록
productOrderDto.setMemberId(memberId);
productOrderDto.setOrderNo(orderNo);
orderDao.insert(productOrderDto);
//주문상세정보 등록(주문번호,아이디는 가져오고, 상품번호,수량,가격은 jsp에서 등록한다.
for(OrderDetailDto orderDetailDto : productOrderDto.orderDetailDto) { //값:리스트
orderDetailDto.setMemberId(memberId);
orderDetailDto.setOrderNo(orderNo);
orderDao.insert2(orderDetailDto);
}
attr.addAttribute("orderNo",orderNo); //redirect로 보낼때 쓰는 코드(RedirectAttributes),orderFinish로 보냄
// //주문완료 후 상품 수량 수정
for(OrderDetailDto orderDetailDto : productOrderDto.orderDetailDto) {
int productCount = orderDetailDto.getProductCount();
int productNo = orderDetailDto.getProductNo();
productDao.update(productCount, productNo);
}
//주문완료 후 장바구니 상품 삭제
cartDao.orderCartDelete(memberId);
return "redirect:orderFinish";
}
//결제완료페이지에 주문정보 뿌려주기
@GetMapping("/orderFinish")
public String orderFinish(Model model,@ModelAttribute ProductOrderDto productOrderDto, @RequestParam int orderNo) { //위에있는orderno를 @RequestParam 어노테이션으로 받아옴
ProductOrderDto dto = orderDao.select(orderNo);
model.addAttribute("dto",dto);
return "/WEB-INF/views/shop/orderFinish.jsp";
}
}
위 코드는 order의 전체 controller다.
내가 혼자 세미 프로젝트를 할때 가장 어렸웠던 부분은 결제금액 부분이였다.
jsp에서 따로 코드를 계산해서 넣어야 하는게 가장 어려웠고, 할인금액을 따로 계산하는 코드가 이해가 안됐다.
배송비는 사실 다 무료라고 적었다 ㅎ..
<div class="bunle-info__item-list">
<c:forEach items="${cartList}" var="list" varStatus="status">
<div class="bundle-info__vendor-tiem-box">
<div style="position: absolute;">
<img src="${pageContext.request.contextPath}/attachment/download?attachmentNo=${list.attachmentNo}"
height="50px">
</div>
<div class="bundle-info__vendor-item" style="padding-left: 50px;width: 100%;">
<p class ="p">
<span class="bundle-info__vendor-item__offer-condition">${list.productName} ${list.initSaleTotal()}</span>
<br>
<span>수량 : ${list.productCount}개<br>가격 : ${list.productCount*list.salePrice}</span>
<input type="hidden" value="${list.productCount*list.productPrice}" id="basicPrice">
<!-- public List<OrderDetailDto> orderDetailDto 를 화면에서 불러올수있는 코드 // varStatus="status" //이친구들을 날릴꺼면 form태그안에 생성-->
<input type="hidden" name="orderDetailDto[${status.index}].productPrice" value="${list.productCount*list.salePrice}" id="salePrice">
<input type="hidden" name="orderDetailDto[${status.index}].productCount" value="${list.productCount}" id="productCount">
<input type="hidden" name="orderDetailDto[${status.index}].productNo" value="${list.productNo}" id="productNo">
<input type="hidden" value="${totalPrice}" id="disCountPrice">
<input type="hidden" value="${list.productName}" id="productName">
<!-- input type hidden으로 하면 j쿼리에서도 값을 불러와서 사용가능(값을불러와서 변수로 넣고 사용해야함) -->
<c:set var="productName" value="${list.productName}"/>
<c:set var="totalPrice" value="${totalPrice+list.totalPrice}"/>
<c:set var="basicPrice" value="${productPrice+list.totalBasicPrice}"/>
<c:set var="salePrice" value="${(productPrice+list.totalBasicPrice)-(totalPrice+list.totalPrice)}"/>
<!-- c태그 set으로 var로 변수를 넣으면 jsp에서만 불러와서 사용가능 -->
</p>
</div>
<div class="bundel-info__delivery-service" style="padding-left: 50px;width: 100%;"></div>
<div class="bundle-info__item-description" style="padding-left: 50px; width: 100%;"></div>
</div>
</c:forEach>
주문내역 부분은 사실상 cartDao에서 가져오면 되서 쉽게 jsp에서 가져왔던 것 같다.
하지만 결제금액 부분에서 총 상품가격, 할인금액, 총 결제금액을 가져오는데 오류가 많이 나고 어려웠다.
결국 내가 해결한 방법으로는 위의 방식으로 hidden으로 값을 불러온 후, jquery,javascript에서 값을 불러와 사용했다.
근데 여기서도 바로 불러와서 사용할 수 있는게 아니라 변수로 넣고 사용해야 했다.
'Project > 펫팔(반려 동물 용품 판매 사이트)' 카테고리의 다른 글
세미 프로젝트 - ProductOrderDto에 orderDetailDto 추가? (0) | 2023.07.01 |
---|---|
세미 프로젝트 - 결제 (0) | 2023.07.01 |
세미 프로젝트 (0) | 2023.06.30 |
세미 프로젝트(README.md) (0) | 2023.06.30 |
깃허브 옮기기 (0) | 2023.06.30 |