20221202(금)
- 목차
- 주문하기 코드모음(Order ~)
- 상품 상세페이지
- 상품 후기 작성
< 주문하기 코드모음 (Order ~) >
sql 추가필요
< OrderDetailProductVO 생성필요>
< OrderMapper.java >
package com.docmall.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;
public interface OrderMapper {
//1)주문정보 저장하기
void orderSave(OrderVO vo); // odr_code NULL상태
//2-1)주문상세 저장하기. 장바구니테이블의 데이타를 참조해서, 주문상세테이블에 저장한다.
void orderDetailSave(@Param("odr_code") Long odr_code, @Param("mem_id") String mem_id);
//2-2)주문상세 저장하기. 바로구매에서 주문상세저장하기(장바구니 사용안함)
void orderDirectDetailSave(OrderDetailVO vo);
//3)결제정보 저장하기
void paymentSave(PaymentVO vo);
//바로구매에서 보여줄 주문내역
CartVOList directOrder(CartVO vo);
//시퀀스 가져오기
long getOrderSequence();
// 진행 주문건수
int getOrderProcessCount(String mem_id);
// 주문내역
List<OrderVO> getOrderList(@Param("mem_id") String mem_id, @Param("cri") Criteria cri);
int getOrderTotalCount(String mem_id);
List<OrderDetailProductVO> getOrderDetailList(Long odr_code);
}
< OrderMapper.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="com.docmall.mapper.OrderMapper">
<select id="getOrderSequence" resultType="long">
SELECT SEQ_ORD_CODE.NEXTVAL FROM DUAL
</select>
<insert id="orderSave" parameterType="com.docmall.domain.OrderVO">
<!--
<selectKey keyProperty="odr_code" order="BEFORE" resultType="long">
SELECT SEQ_ORD_CODE.NEXTVAL FROM DUAL
</selectKey>
-->
INSERT INTO ORDER_TBL
(ODR_CODE, MEM_ID, ODR_NAME, ODR_ZIPCODE, ODR_ADDR, ODR_ADDR_D, ODR_PHONE, ODR_TOTAL_PRICE)
VALUES
(#{odr_code}, #{mem_id}, #{odr_name}, #{odr_zipcode}, #{odr_addr}, #{odr_addr_d}, #{odr_phone}, #{odr_total_price})
</insert>
<!-- 장바구니에서 주문상세작성 -->
<insert id="orderDetailSave">
INSERT INTO ORDER_DETAIL_TBL
(ODR_CODE, PDT_NUM, ODR_AMOUNT, ODR_PRICE)
SELECT
#{odr_code}, C.PDT_NUM, C.CART_AMOUNT, P.PDT_PRICE * C.CART_AMOUNT
FROM
CART_TBL C INNER JOIN PRODUCT_TBL P
ON
C.PDT_NUM = P.PDT_NUM
WHERE
C.MEM_ID = #{mem_id}
</insert>
<!-- 바로구매에서 주문상세작성 -->
<insert id="orderDirectDetailSave">
INSERT INTO ORDER_DETAIL_TBL
(ODR_CODE, PDT_NUM, ODR_AMOUNT, ODR_PRICE)
VALUES
(#{odr_code}, #{pdt_num}, #{odr_amount}, #{odr_price})
</insert>
<!-- SEQ_PAYMENT_CODE.NEXTVAL -->
<insert id="paymentSave">
INSERT INTO PAYMENT_TBL
(PAY_CODE, ODR_CODE, MEM_ID, PAY_METHOD, PAY_TOT_PRICE, PAY_NOBANK_PRICE, PAY_NOBANK_USER, PAY_NOBANK)
VALUES
(SEQ_PAYMENT_CODE.NEXTVAL, #{odr_code}, #{mem_id}, #{pay_method}, #{pay_tot_price}, #{pay_nobank_price}, #{pay_nobank_user}, #{pay_nobank})
</insert>
<select id="directOrder" resultType="com.docmall.domain.CartVOList">
SELECT
PDT_IMG_FOLDER,
PDT_IMG,
PDT_PRICE,
#{cart_amount} as CART_AMOUNT,
PDT_PRICE * #{cart_amount} AS SALES_PRICE,
#{mem_id} as MEM_ID,
PDT_NUM,
pdt_name
FROM
PRODUCT_TBL
WHERE
PDT_NUM = #{pdt_num}
</select>
<select id="getOrderProcessCount" resultType="int">
<![CDATA[
SELECT
COUNT(*)
FROM
ORDER_TBL
WHERE
MEM_ID = #{mem_id}
AND
ODR_STATUS <> '배송완료'
]]>
</select>
<select id="getOrderList" resultType="com.docmall.domain.OrderVO">
<![CDATA[
SELECT
RN, ODR_CODE, ODR_DATE, MEM_ID, ODR_NAME, ODR_TOTAL_PRICE, ODR_STATUS
FROM (
SELECT
/*+ INDEX_DESC(ord PK_ORDER_CODE) */
ROWNUM RN, ORD.ODR_CODE, ORD.ODR_DATE, ORD.MEM_ID, ORD.ODR_NAME, ORD.ODR_TOTAL_PRICE, ORD.ODR_STATUS
FROM
ORDER_TBL ord
WHERE
ORD.MEM_ID = #{mem_id}
AND
ROWNUM <= #{cri.pageNum} * #{cri.amount}
)
WHERE RN > (#{cri.pageNum}-1) * #{cri.amount}
]]>
</select>
<select id="getOrderTotalCount" resultType="int">
SELECT
COUNT(*)
FROM
ORDER_TBL
WHERE
MEM_ID = #{mem_id}
</select>
<resultMap type="com.docmall.domain.OrderDetailVO" id="orderDetailMap">
<id property="odr_code" column="odr_code"/>
<id property="pdt_num" column="pdt_num"/>
<result property="odr_amount" column="odr_amount"/>
<result property="odr_price" column="odr_price"/>
</resultMap>
<resultMap type="com.docmall.domain.ProductVO" id="productMap">
<id property="pdt_num" column="pdt_num"/>
<result property="cate_code" column="cate_code"/>
<result property="cate_code_prt" column="cate_code_prt"/>
<result property="pdt_name" column="pdt_name"/>
<result property="pdt_price" column="pdt_price"/>
<result property="pdt_discount" column="pdt_discount"/>
<result property="pdt_company" column="pdt_company"/>
<result property="pdt_detail" column="pdt_detail"/>
<result property="pdt_img_folder" column="pdt_img_folder"/>
<result property="pdt_img" column="pdt_img"/>
<result property="pdt_amount" column="pdt_amount"/>
<result property="pdt_buy" column="pdt_buy"/>
<result property="pdt_date_sub" column="pdt_date_sub"/>
<result property="pdt_date_up" column="pdt_date_up"/>
</resultMap>
<resultMap type="com.docmall.domain.OrderDetailProductVO" id="orderDetailProductMap">
<collection property="orderDetailVO" resultMap="orderDetailMap" />
<collection property="productVO" resultMap="productMap" />
</resultMap>
<!-- resultMap 을 사용목적으로 주석처리. 주문 상세정보2 -->
<select id="getOrderDetailList" resultMap="orderDetailProductMap">
SELECT
OD.ODR_CODE, OD.PDT_NUM, P.PDT_NAME, P.PDT_PRICE, OD.ODR_AMOUNT, OD.ODR_PRICE, P.PDT_IMG_FOLDER, P.PDT_IMG
FROM
ORDER_DETAIL_TBL OD INNER JOIN PRODUCT_TBL P
ON
OD.PDT_NUM = P.PDT_NUM
WHERE
ODR_CODE = #{odr_code}
</select>
</mapper>
< OrderService >
package com.docmall.service;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;
public interface OrderService {
List<CartVOList> cart_list(String mem_id);
// 장바구니 -> 주문
void orderSave(OrderVO o_vo, PaymentVO p_vo); // String type 제거
// 바로구매 -> 주문
void orderDirectSave(OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo); // 추가
CartVOList directOrder(CartVO vo);
long getOrderSequence();
int getOrderProcessCount(String mem_id);
// 주문내역
List<OrderVO> getOrderList(String mem_id, Criteria cri);
int getOrderTotalCount(String mem_id);
List<OrderDetailProductVO> getOrderDetailList(Long odr_code);
}
< OrderServiceImpl >
package com.docmall.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;
import com.docmall.mapper.CartMapper;
import com.docmall.mapper.OrderMapper;
import lombok.Setter;
@Service
public class OrderServiceImpl implements OrderService {
//주입
@Setter(onMethod_ = {@Autowired})
private OrderMapper orderMapper;
@Setter(onMethod_ = {@Autowired})
private CartMapper cartMapper;
@Override
public List<CartVOList> cart_list(String mem_id) {
// TODO Auto-generated method stub
return cartMapper.cart_list(mem_id);
}
// 서비스의 메서드안에서 하나라도 에러가 발생하면, 정상적으로 실행되는 다른 메서드의 작업도 롤백처리를 시키는 기능.
// 장바구니에서 주문하기
@Transactional
@Override
public void orderSave(OrderVO o_vo, PaymentVO p_vo) {
//1)주문정보 저장하기(주문자와배송지 정보)
orderMapper.orderSave(o_vo);
//2)주문상세 저장하기(주문상품정보)
orderMapper.orderDetailSave(o_vo.getOdr_code(), o_vo.getMem_id());
//3)결제정보 저장하기
p_vo.setOdr_code(o_vo.getOdr_code());
orderMapper.paymentSave(p_vo);
//4)장바구니 비우기
cartMapper.cart_empty(o_vo.getMem_id());
}
// 상품리스트에서 바로구매
@Transactional
@Override
public void orderDirectSave(OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo) {
// TODO Auto-generated method stub
//1)주문정보 저장하기(주문자와배송지 정보)
orderMapper.orderSave(o_vo);
//2)주문상세 저장하기(주문상품정보)
orderMapper.orderDirectDetailSave(od_vo);
//3)결제정보 저장하기
p_vo.setOdr_code(o_vo.getOdr_code());
orderMapper.paymentSave(p_vo);
}
@Override
public CartVOList directOrder(CartVO vo) {
// TODO Auto-generated method stub
return orderMapper.directOrder(vo);
}
@Override
public long getOrderSequence() {
// TODO Auto-generated method stub
return orderMapper.getOrderSequence();
}
@Override
public int getOrderProcessCount(String mem_id) {
// TODO Auto-generated method stub
return orderMapper.getOrderProcessCount(mem_id);
}
@Override
public List<OrderVO> getOrderList(String mem_id, Criteria cri) {
// TODO Auto-generated method stub
return orderMapper.getOrderList(mem_id, cri);
}
@Override
public int getOrderTotalCount(String mem_id) {
// TODO Auto-generated method stub
return orderMapper.getOrderTotalCount(mem_id);
}
@Override
public List<OrderDetailProductVO> getOrderDetailList(Long odr_code) {
// TODO Auto-generated method stub
return orderMapper.getOrderDetailList(odr_code);
}
}
< OrderController.java >
package com.docmall.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.MemberVO;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;
import com.docmall.dto.PageDTO;
import com.docmall.kakaopay.ApproveResponse;
import com.docmall.kakaopay.ReadyResponse;
import com.docmall.service.CartService;
import com.docmall.service.KakaoPayServiceImpl;
import com.docmall.service.OrderService;
import com.docmall.util.FileUtils;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@Log4j
@RequestMapping("/order/*")
@Controller
public class OrderController {
//주입
@Setter(onMethod_ = {@Autowired})
private OrderService orderService;
@Setter(onMethod_ = {@Autowired})
private CartService cartService;
@Setter(onMethod_ = {@Autowired})
private KakaoPayServiceImpl kakaoPayServiceImpl;
//업로드폴더 주입
@Resource(name = "uploadPath") // servlet-context.xml 설정.
private String uploadPath; // "C:\\doccomsa\\upload\\goods\\"
//1)바로주문 ->주문작성하기(장바구니 사용안함) 2)장바구니 -> 주문작성하기.
@GetMapping("/orderListInfo")
public void orderListInfo(@ModelAttribute("type") String type, @RequestParam(value = "pdt_num", required = false ) Integer pdt_num,
@RequestParam(value = "odr_amount", required = false ) Integer odr_amount, HttpSession session, Model model) {
String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
List<CartVOList> orderList = null;
if(type.equals("direct")) { // 바로주문. Integer pdt_num, Integer odr_amount, mem_id
CartVO cartVO = new CartVO(null, pdt_num, mem_id, odr_amount);
CartVOList cartVOList = orderService.directOrder(cartVO);
orderList = new ArrayList<>();
orderList.add(cartVOList);
}else if(type.equals("cart")) { //장바구니
orderList = orderService.cart_list(mem_id);
}
orderList.forEach(vo -> {
vo.setPdt_img_folder(vo.getPdt_img_folder().replace("\\", "/"));
});
//주문내역
model.addAttribute("orderList", orderList);
}
// 1)클라이언트에서 카카오페이 결제버튼 클릭하면
@GetMapping(value = "/orderPay", produces = "application/json")
public @ResponseBody ReadyResponse payReady(String type, OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo, int totalamount, HttpSession session, Model model) {
log.info("주문정보: " + o_vo);
log.info("결제정보: " + p_vo);
log.info("총주문금액: " + totalamount);
String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
//장바구니 내역불러오기. 바로구매에서는 장바구니를 사용하지 않는다.
List<CartVOList> cartList = cartService.cart_list(mem_id);
// 카카오페이 결제 상품명
String itemName = "";
int quantity = 0;
//주문번호가 시퀀스 작업(중요)
o_vo.setOdr_code(orderService.getOrderSequence());
o_vo.setMem_id(mem_id);
p_vo.setMem_id(mem_id);
// 오라클에서는 "" -> Null 처리 됨.
p_vo.setPay_nobank_user("");
p_vo.setPay_nobank("");
od_vo.setOdr_code(o_vo.getOdr_code());
//주문정보 저장하기.
if(type.equals("cart")) {
orderService.orderSave(o_vo, p_vo); // 주문상세정보를 장바구니를 참조하여, 확보
}else if(type.equals("direct")) {
orderService.orderDirectSave(o_vo, od_vo, p_vo);
}
if(type.equals("cart")) {
for(int i=0; i<cartList.size(); i++) {
itemName += cartList.get(i).getPdt_name() + ",";
}
itemName = itemName.substring(0, itemName.lastIndexOf(",")-1);
quantity = cartList.size();
}else if(type.equals("direct")) {
itemName = "개별상품";
quantity = 1;
}
//카카오페이 서버에 1차 준비요청
ReadyResponse readyResponse = kakaoPayServiceImpl.payReady(o_vo.getOdr_code(), itemName, quantity, mem_id, totalamount);
log.info("결제고유번호: " + readyResponse.getTid());
log.info("결제요청 URL: " + readyResponse.getNext_redirect_pc_url()); // 카카오 페이 API서버에서 보내오는 url
session.setAttribute("tid", readyResponse.getTid());
session.setAttribute("odr_code", o_vo.getOdr_code()); // 주문번호
return readyResponse;
}
//2)ajax요청이 성공된 후에 호출되는 주소
//결제승인요청
@GetMapping("/orderApproval")
public String orderApproval(@RequestParam("pg_token") String pgToken, HttpSession session) {
String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
String tid = (String) session.getAttribute("tid");
Long odr_code = (Long) session.getAttribute("odr_code");
ApproveResponse approveResponse = kakaoPayServiceImpl.payApprove(odr_code, tid, pgToken, mem_id);
// 카카오페이에서 넘어 온 정보를 DB에 저장해야 할 경우. -> update작업
//세션으로 저장한 정보는 사용후 즉시 소멸시킨다.
session.removeAttribute("tid");
session.removeAttribute("odr_code");
return "redirect:/order/orderComplete";
}
// 무통장 결제. /orderSave
@PostMapping("/orderSave")
public String orderSave(String type, OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo, HttpSession session, Model model) {
p_vo.setPay_tot_price(p_vo.getPay_nobank_price());
log.info("주문정보: " + o_vo);
log.info("주문상세정보: " + od_vo);
log.info("결제정보: " + p_vo);
String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
//주문번호가 시퀀스 작업(중요)
o_vo.setOdr_code(orderService.getOrderSequence());
o_vo.setMem_id(mem_id);
p_vo.setMem_id(mem_id);
od_vo.setOdr_code(o_vo.getOdr_code());
//주문정보 저장하기.
if(type.equals("cart")) {
orderService.orderSave(o_vo, p_vo); // 주문상세정보를 장바구니를 통하여, 데이타 작업
}else if(type.equals("direct")) {
orderService.orderDirectSave(o_vo, od_vo, p_vo); // 주문작성하기 페이지에서 바로구매 상품정보 데이타 작업
}
return "redirect:/order/orderComplete";
}
//클라이언트에게 보여줄 결제및주문이 완료되었습니다.
@GetMapping("/orderComplete")
public void orderComplete() {
}
@GetMapping("/orderCancel")
public void orderCancel() {
}
@GetMapping("/orderFail")
public void orderFail() {
}
// 주문내역
@GetMapping("/orderList")
public void orderList(HttpSession session, @ModelAttribute("cri") Criteria cri, Model model) {
String mem_id = ((MemberVO) session.getAttribute("loginStatus")).getMem_id();
// 주문목록
List<OrderVO> orderList = orderService.getOrderList(mem_id, cri);
model.addAttribute("orderList", orderList);
// 페이징정보
int totalCount = orderService.getOrderTotalCount(mem_id);
model.addAttribute("pageMaker", new PageDTO(cri, totalCount));
}
//주문상세
@GetMapping("/orderDetail")
public void orderDetail2(Long odr_code, Model model) {
List<OrderDetailProductVO> odList = orderService.getOrderDetailList(odr_code);
odList.forEach(vo -> {
vo.getProductVO().setPdt_img_folder(vo.getProductVO().getPdt_img_folder().replace("\\", "/"));
});
//주문상세정보. OrderDetailVO
model.addAttribute("odList", odList);
}
//상품목록에서 이미지 보여주기.
@ResponseBody
@GetMapping("/displayFile")
public ResponseEntity<byte[]> displayFile(String folderName, String fileName) throws IOException {
// C:\\doccomsa\\upload\\goods\\2022\\11\\22\\
return FileUtils.getFile(uploadPath + folderName, fileName);
}
}
+) KakaoPayServiceImpl 변경부분
목록 (여러개 상품)
- 다른정보를 선택한 버튼(this)을 기준으로 상대적으로 참조해줘야 한다.
상세 (1개 상품)
- 직접적으로 참조해야 한다.
< 상품 상세페이지 >
(1) Product Controller.java
아래 두 개 같은 의미
(2) Product 매퍼 & 서비스
(3) productList 복사해서 productDetail.jsp 파일 만들기
부트스트랩 코드 복사 jsp에 추가 / 수정이 필요한 부분은 수정했음
https://getbootstrap.com/docs/4.6/components/card/
- 수정이 필요한 부분은 수정했음
<div class="container">
<div class="row">
<div class="col-md-4">
<img src="/product/displayFile?folderName=${productVO.pdt_img_folder }&fileName=${productVO.pdt_img}" width="100%" height="400">
</div>
<div class="col-md-8">
<b>${productVO.pdt_name}</b>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="tabs">
<ul>
<li><a href="#product_desc">상품설명</a></li>
<li><a href="#product_qna">상품후기</a></li>
</ul>
<div id="product_desc">
상품설명
</div>
<div id="product_qna">
상품후기
</div>
</div>
</div>
</div>
(4) productList.jsp 코드추가
(5) ProductController.java
ex) 실행화면
< 상품 상세페이지 > - 디테일 추가
- productDetail.jsp 코드추가 (script)
<div class="container">
<div class="row">
<div class="col-md-4">
<img src="/product/displayFile?folderName=${productVO.pdt_img_folder }&fileName=${productVO.pdt_img}" style = "width : 350px; height : 380px;" alt = "">
</div>
<div class="col-md-8 pl-8">
<div class="card-body">
<h5 class="card-title">${productVO.pdt_name}</h5>
<p class="card-text">test</p>
<p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="tabs">
<ul>
<li><a href="#product_desc">상품설명</a></li>
<li><a href="#product_qna">상품후기</a></li>
</ul>
<div id="product_desc">
상품설명
${productVO.pdt_detail }
</div>
<div id="product_qna">
상품후기
</div>
</div>
</div>
</div>
</div>
ex) 실행화면
< 상품 후기 작성 >
(1) SQL
--8. 상품후기 테이블
CREATE TABLE REVIEW_TBL(
RV_NUM NUMBER CONSTRAINT PK_REVIEW_NUM PRIMARY KEY,
MEM_ID VARCHAR2(15) NOT NULL,
PDT_NUM NUMBER NOT NULL,
RV_CONTENT VARCHAR2(200) NOT NULL,
RV_SCORE NUMBER NOT NULL,
RV_DATE_REG DATE DEFAULT SYSDATE NOT NULL
);
CREATE SEQUENCE SEQ_REVIEW_NUM;
(2) ReviewVO 클래스 생성
(3) Review Controller
** 주입하기 서비스임플에 매퍼 ➡ 컨트롤러에 서비스
**productDetail.jsp 코드추가 및 화면 확인
ex) 실행화면
😎 이제 평점 누르면 색상이 변하도록 해보자!
누르는 애 그 전까지 모두~ 색칠해버리기. 가운데 누르면 별 3개 찍히도록!!
$(this).parent().children().removeClass("on");
선택시 p태그 입장에서 자식 a태그의 class = "on" 을 모두 제거하라.
$(this).addClass("on").prevAll("a").addClass("on");
선택했던 부모로 올라가 자식을
**productDetail.jsp 코드추가 및 화면 확인
ex) 실행화면
'🏫 Open API_JAVA' 카테고리의 다른 글
[94일차] 코틀린(변수와 함수 / 기초 데이타 타입) / 상품후기댓글 수정/삭제 버튼 (0) | 2022.12.07 |
---|---|
[93일차] 안드로이드 코틀린 / 상품 후기 등록, 댓글 리스트 및 페이징 (0) | 2022.12.05 |
[91일차] 카카오페이 연결 / 상품 목록에서 바로구매 진행하기 (0) | 2022.12.01 |
[90일차] 카카오페이 결제시스템 적용 / 카카오페이 클릭 후 작업 / 결제승인요청 / 주문하기 기능 안에서 일어나는 작업 (0) | 2022.12.01 |
[89일차] 주문하기 / 주문자 정보 & 배송지 정보 폼 / 카카오페이 결제 (0) | 2022.12.01 |