Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

soozya

[BACK] 상품 결제하기 본문

👩🏻‍💻프로젝트/👥팀프로젝트

[BACK] 상품 결제하기

soozya 2023. 8. 28. 18:53

[👩🏻‍💻소스코드]

(OrderPayDAO.java)

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;

public class OrderPayDAO {

  private DBConnectionMgr pool=null; //1)연결할 클래스 객체 선언
	  //공통
  private Connection con=null;
  private PreparedStatement pstmt=null;
  private ResultSet rs=null; //select
  private String sql=""; //실행시킬 SQL구문 저장용

  public OrderPayDAO() {
	try {
	  pool=DBConnectionMgr.getInstance();
	}catch(Exception e) {
		System.out.println("DB 접속 오류="+e);
	}
  }//생성자

  //회원정보 불러오기
  public ArrayList<OrderPayDTO> getOrderMemList(String mem_id){
	 ArrayList<OrderPayDTO> orderList=new ArrayList<>();
	// Timestamp post_date = new Timestamp(new Date().getTime());
	 // int order_num=0;
	 OrderPayDTO order= new OrderPayDTO();
	  try {
		con=pool.getConnection();
  	    sql="select i.*, m.* from item_depth i, mem_depth m where m.mem_id=?";
	    pstmt=con.prepareStatement(sql);

	    pstmt.setString(1, mem_id);
	    System.out.println("getOrderMemList()에서 회원정보 불러오기");
	    rs=pstmt.executeQuery();
	    if(rs.next()) {

	    	order=makeOrderMemResult();
	    	System.out.println("OrderMemList"+order);
	    	orderList.add(order);
	    }
	  }catch (Exception e){
		  System.out.println("getOrderMemList sql 에러: "+e);
	  }finally {
			pool.freeConnection(con, pstmt, rs);
	  }
	  return orderList;
  }

  //주문하기
  public int insertOrder (OrderPayDTO order) {
	  java.util.Date now = new java.util.Date();
	     SimpleDateFormat vans = new SimpleDateFormat("yy/MM/dd");
	  String order_date=LocalDate.now().toString();
	  int check=0;
	  int pay_num=0;
	  try {
		con=pool.getConnection();
		sql="select max(pay_num) from pay";
		pstmt=con.prepareStatement(sql);
		rs=pstmt.executeQuery();
		if(rs.next()) {//보여주는 결과가 있다면
			pay_num=rs.getInt(1)+1;//최대값+1
		}else {
			pay_num=1;//테이블에 한개의 데이터가 없다면
		}
	    sql="insert into pay (pay_num, mem_id, order_date, pay_meth, pay_amt, pay_total, item_name) values(?,?,?,?,?,?,?)";
		pstmt=con.prepareStatement(sql);
		pstmt.setInt(1, pay_num); //주문 번호
		pstmt.setString(2, order.getMem_id()); //주문자 아이디
		pstmt.setString(3, order_date); //주문 날짜
		pstmt.setString(4, order.getPay_meth()); //결제방법
		pstmt.setInt(5, order.getPay_amt()); //결제상품 합계 금액
		pstmt.setInt(6, order.getPay_total()); // 총 결제 가격
		pstmt.setString(7, order.getItem_name()); // 총 결제 가격
		check=1;
		int insert=pstmt.executeUpdate();
	    System.out.println("주문하기 성공 확인: "+insert);
	}catch(Exception e) {
		System.out.println("insertOrder 오류확인 :"+ e);
	}finally {
		pool.freeConnection(con, pstmt, rs);
	}
	  return check;
  }

  //주문 내용 전송하기
  public int getOrderInsert(OrderPayDTO order){
	  java.util.Date now = new java.util.Date();
	     SimpleDateFormat vans = new SimpleDateFormat("yyyyMMdd");
	     String order_num = vans.format(now);
	     String order_date=LocalDate.now().toString();
	    int x=0;
	     try {
	 		con=pool.getConnection();
		     //주문번호 생성을 위한 sequence를 받아옵니다.
	    	 sql = "SELECT seq_ordercode.NEXTVAL seq_num FROM dual";
	    	 pstmt=con.prepareStatement(sql);
	    	 rs = pstmt.executeQuery();
	    	if (rs.next()) {
	    	 int ordercode = rs.getInt("seq_num");
	    	 // 주문 번호를 생성
	    	 String  trade_code = order_num+"-"+String.format("%04d",  ordercode);
	    	 order_num=trade_code;
	 	    System.out.println("order_num: "+order_num+ ", ordercode"+ordercode);
	    	}
	    	// rs.close();
			//주문번호, 회원 아이디
			//con.setAutoCommit(false); //트랜잭션 처리
			sql = "insert into order_check (order_date, mem_id, item_img, item_su, item_name,  pay_amt, pay_total, item_num, order_num) ";
			sql+= "values(?,?,?,?,?,?,?,?,?)";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, order_date); //주문 날짜
			pstmt.setString(2, order.getMem_id()); //주문자 아이디
			pstmt.setString(3, order.getItem_img()); //결제방법
			pstmt.setInt(4, order.getItem_su()); //상품 수
			pstmt.setString(5, order.getItem_name()); //상품이름
			pstmt.setInt(6, order.getPay_amt()); //결제상품 합계 금액
			pstmt.setInt(7, order.getPay_total()); // 총 결제 가격
			pstmt.setInt(8, order.getItem_num()); //상품번호
			pstmt.setString(9, order_num);
			int insert=pstmt.executeUpdate();
		    System.out.println("주문 결과 보냈을까?: "+insert);
			//con.commit();
			x = 1;

		} catch (Exception e) {
			System.out.println("getOrderInsert()에러유발->" + e);
		} finally {// 3.메모리해제
			pool.freeConnection(con, pstmt, rs);
		}
		return x;
	}

  //pay에 해당하는 모든 정보
  private OrderPayDTO makeOrderMemResult() throws Exception {
	    OrderPayDTO order = new OrderPayDTO();
	    order.setItem_num(rs.getInt("item_num"));
	    order.setItem_name(rs.getString("item_name"));
	    order.setItem_pay(rs.getInt("item_pay"));
	    order.setItem_su(rs.getInt("item_su"));
	    order.setItem_img(rs.getString("item_img"));
	    order.setMem_id(rs.getString("mem_id"));
	    order.setMem_name(rs.getString("mem_name"));
	    order.setMem_phone(rs.getString("mem_phone"));
	    order.setMem_email(rs.getString("mem_email"));
	    order.setMem_zipcode(rs.getInt("mem_zipcode"));
	    order.setMem_addr1(rs.getString("mem_addr1"));
	    order.setMem_addr2(rs.getString("mem_addr2"));

	    return order;
	}

}

 

(OrderPayAction.java)

package action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.OrderPayDAO;
import model.OrderPayDTO;

public class OrderPayAction implements CommandAction {

	@Override
	public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
		// TODO Auto-generated method stub

		//int item_num=0;
		int pay_num=0;
		int btn= Integer.parseInt(request.getParameter("btn"));
		System.out.println("OrderPayAction의 btn "+btn);//1

		//System.out.println("OrderPayListAction의 전달된 pay_num=>"+pay_num);
		int item_num = Integer.parseInt(request.getParameter("item_num"));
		String mem_id = request.getParameter("mem_id"); //회원아이디
		System.out.println("OrderPayAction의 mem_id : "+mem_id);//1

		System.out.println("여기로 오는 item_num: "+item_num);


		OrderPayDAO orderpay = new OrderPayDAO();
		List<OrderPayDTO> orderList = orderpay.getOrderMemList(mem_id);

		System.out.println("orderlist size =====: "+ orderList.size());

		request.setAttribute("pay_num",pay_num);
		request.setAttribute("orderList",orderList);
		request.setAttribute("orderpay",orderpay);
		request.setAttribute("mem_id",mem_id);

		request.setAttribute("btn",btn);
		//3.공유해서 이동할 수 있도록 페이지를 지정
		  return "/OrderPay.jsp";

	}

}

 

(OrderPayProAction.java)

package action;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.OrderPayDAO;
import model.OrderPayDTO;

public class OrderPayProAction implements CommandAction {

	@Override
	public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
		// TODO Auto-generated method stub

		request.setCharacterEncoding("utf-8");
		//int pay_num = 0;
        OrderPayDTO order=new OrderPayDTO();
        List<OrderPayDTO> orderList = new ArrayList<OrderPayDTO>();

        System.out.println("pro가 시작됩니다.111"+order);
        //System.out.println("pro가 시작됩니다.222"+orderList);

	    order.setMem_id(request.getParameter("mem_id"));
        System.out.println("pro가 시작됩니다.");

	   order.setItem_su(Integer.parseInt(request.getParameter("item_su")));    
	   System.out.println(request.getParameter("item_su"));
	   order.setItem_num(Integer.parseInt(request.getParameter("item_num")));
        System.out.println(request.getParameter("item_num"));
	    order.setPay_amt(Integer.parseInt(request.getParameter("pay_amt")));

        System.out.println("====amt====: "+request.getParameter("pay_amt"));
	    order.setPay_meth(request.getParameter("pay_meth"));
	    order.setItem_img(request.getParameter("item_img"));
	    order.setItem_name(request.getParameter("item_name"));

	    System.out.println("pro야 잘 받았니?");

	   // order.setPay_num(Integer.parseInt(request.getParameter("pay_num")));
	    order.setPay_total(Integer.parseInt(request.getParameter("pay_total")));
	   // order.setOrder_date(String.valueOf(request.getParameter("order_date")));

	    System.out.println("pro야 잘 받았을까?222");

	    OrderPayDAO opPro=new OrderPayDAO();
		int check=opPro.insertOrder(order);
		int x=opPro.getOrderInsert(order);

		System.out.println("insertOrder=>"+check);
		System.out.println("getOrderInsert=>"+x);

		System.out.println("pro, 여기까지 왔니?");

		request.setAttribute("order",order);
	//	request.setAttribute("pay_num", pay_num);
		request.setAttribute("orderList",orderList);
		request.setAttribute("mem_id",request.getParameter("mem_id"));


		//3.공유해서 이동할 수 있도록 페이지를 지정
		  return "/OrderPaypro.jsp";

	}

}


(js 파일)

$(function(){
  $("#name_error").hide();
  $("#addr_error").hide();
  $("#addr2_error").hide();
  $("#phone_error").hide();

  $('#pay_btn').click(function(){
	//1. 이름 체크
	var name=$("#mem_name").val();
	 if(name.length == null || name.length ==""){
		$('#name_error').show();
		return false;
	 }else{
		$('#name_error').hide();
	}
	//2. 주소1 체크
	var addr=$("#mem_addr1").val(); 
	 if(addr.length ==null || addr.length ==""){
		$('#addr_error').show();
		return false;
	 }else{
		$('#addr_error').hide();
	}
	//3. 주소2 체크
	var addr2=$("#mem_addr2").val();
	 if(addr2.length ==null || addr2.length ==""){
		$('#addr2_error').show();
		return false;
	 }else{
		$('#addr2_error').hide();
	}
	//4. 연락처 체크
	var phone=$("#mem_phone").val();
	 if(phone.length ==null || phone.length ==""){
		$('#phone_error').show();
		return false;
	 }else{
		$('#phone_error').hide();
	}
	//5. 결제 방법 선택
	var payment = $("input[type=radio][name=pay_meth]:checked").val();
	  if(payment==null){
		alert("결제방법을 체크해주세요");
		return false;
	  }
	  alert("결제가 완료되었습니다.");	
	});	
  });

[💬설명]

1️⃣ 회원정보와 상품 정보 불러오기

- 결제 페이지에서  회원 정보(이름, 주소 등)가 필요했기 때문에 상품정보와 함께 불러오기!

(OrderPayDAO)

 

2️⃣ 회원정보 오류 시 경고 메시지 띄우기 (js)

- 주문 페이지 프론트 코딩은 내 담당이 아니었으나 백부분 구현하면서 이것저것 기능 추가를 많이 했다.

  기본적인 틀은 팀원이 짜고, 기능은 내가 이것저것 추가 함ㅎ

- 주문하기 페이지를 맡으면서 오류 날 때 빨간색 글씨로 경고메시지 띄우는걸 꼭 해보고 싶었는데,

  팀원들도 너무 시간을 잡아먹거나 어려운거 아니면 하고 싶은거 해봐라 주의였던지라 얼른 추가함!😉

 

(OrderPay.jsp)

 

실행했을 때 나타나는 화면 (가입시 작성한 회원정보가 나타난다) 

 회원정보 js 파일 (동일 형식이라 이름 체크 부분만 작성함)

 

(OrderPay.jsp)

1) (129라인) jsp 파일에서 name_error라는 id를 설정한 후, 해당 메시지를 작성 

 

(js파일)

2) js파일에서 해당 메세지를 숨김(~.hide();)

3) pay_btn(결제하기 버튼)을 클릭시 해당 함수 실행됨

4) name에 해당하는 데이터가 비어있거나 작성되지 않았다면 해당 메시지를 보여줌

5) 값이 잘 들어가있다면 에러 메시지를 숨기면 됨!

     

주소칸/연락처칸이 비워졌을 때 나타나는 화면

 - 이게 뭐라고 구현해놓고 뿌듯해서 자랑했던 기억이..ㅋㅋㅋㅋㅋ

  생전 처음 해보는거니까 뚝딱이긴 했지만 쓰면 쓰는대로 실행돼서 기분 좋았다 ㅎ..

 

결제 방법 js 파일

1) 각 결제수단을 체크 했을 때 payment라는 변수에 저장될 수 있도록 설정

2) payment의 값이 null일 경우, 결제방법을 체크해달라는 경고창이 뜨도록 설정

 

3️⃣ 상품 주문 후 마이페이지에서 확인하기 (주문번호 출력)

◼ 주문번호 설정을 위한 시퀀스 생성

1) 주문번호를 설정하기 위한 시퀀스를 생성했는데, 사용한 sql 구문은 

     create sequence seq_ordercode start with 1 increment by 1 nocycle nocache 

     1부터 시작, 1씩 증가, 최대값에 도달하면 멈춤..인데 최대값 설정을 안했음...메모리에는 저장하지 않음

2) NEXTVAL를 사용한 이유 : 시퀀스를 처음 생성했을 때는 값이 없기 때문에 CURRVAL 사용이 불가능함

  - 처음 생성 할 때에는 반드시 nextval로 값을 넣어주어야 currval에 값이 저장되고 사용 가능

3) seq테이블의 ordercode라는 필드명의 다음값을 가져와 seq_num를 출력

 

 

주문번호 생성하기

1) 주문번호(날짜-0001 형식) 생성하기 위해 자료형이 String인 trade_code 변수를 설정함

2) 95라인에서 설정한 order_num에 시퀀스를 생성해서 만든 seq_num을 가져오되, 4자리 형식으로 불러오도록 함

 

 


[💻결과]

 

[주문 내역 확인]

'👩🏻‍💻프로젝트 > 👥팀프로젝트' 카테고리의 다른 글

[BACK] 상품 검색하기  (0) 2023.08.09
[BACK] 글 삭제하기  (0) 2023.08.03
[BACK] 글 수정하기  (0) 2023.08.02
[BACK] 게시판 글 쓰기, 상세보기  (0) 2023.07.29
[BACK] 게시판 글 목록 보기  (0) 2023.07.20