몰입하며 나아가는 개발이란

Toy

Coffee Order Program(kiosk)

류하을 2020. 1. 2. 15:58

012345
Coffee Order Program (mvc model2)

 

폴더구조

main - mainClass

package main;

import singleton.Singleton;

public class mainClass {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		singleton.memCtrl.login();
	}
}

singleton - Singleton

싱글톤 글래스, view와 controller 사이에서 대화를 쉽게 하기 위한 수단으로,

현재는 Swing으로 프론트를 구성 하여 세션및 Ajax를 사용하지 않기 때문에

로그인 아이디와 표기 하기위한 목록 인덱스 값, 주문내역 임시저장도 함께 맡고있으며,

해당 임시 저장 내용은 각 view 클래스에서 입력값을 가지고 저장이 되거나 초기화 시켜 들어오게된다. 

package singleton;

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

import controller.MemberController;
import controller.OrderController;
import controller.SelectController;
import dto.OrderDto;

public class Singleton {
	
	public static Singleton singleton = null;
	
	public MemberController memCtrl = null;
	public SelectController selectCtrl = null;
	public OrderController orderCtrl = null;
	
	private Singleton() {
		memCtrl = new MemberController();
		selectCtrl = new SelectController();
		orderCtrl = new OrderController();
	}
	
	public static Singleton getInstance() {
		if ( singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
	// 여기까지 싱글톤 패턴 기본//
    
	// 아래로 세션에서 저장되어야할 로그인 아이디 getter setter, 주문내역, 목록 임시저장//
	private String loginID = null;
	
	public List<OrderDto> orderList = new ArrayList<OrderDto>();
	
	public int selectedIndex = -1;
	public String text = "";
	public int rowEndNum = 0;
	public int rowStartNum = 0;
	public int rowSetNum = 1;

	public String getLoginID() {
		return loginID;
	}

	public void setLoginID(String loginID) {
		this.loginID = loginID;
	}

}

view - LoginView

가입된 아이디와 비밀번호를 매치하여 로그인을 할 수있게 구현되어있다.

로그인시에 이곳에서 Singleton에 id가 저장되어 앞으로 어떤 회원이 로그인 되었는지 확인을 하게된다.

package view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import singleton.Singleton;

public class LoginView extends JFrame{
	
	public LoginView() {

		setTitle("로그인화면");
		setSize(420, 230);
		setLayout(null);
		
		JLabel idLabel = new JLabel("ID");
		idLabel.setBounds(50, 35, 45, 25);
		add(idLabel);
		
		JTextField idTextf = new JTextField(20);
		idTextf.setBounds(95, 37, 140, 25);
		idTextf.setText("");
		add(idTextf);
		
		JLabel pwLabel = new JLabel("PW");
		pwLabel.setBounds(50, 70, 45, 25);
		add(pwLabel);
	
		JPasswordField pwTextf = new JPasswordField(20);
		pwTextf.setBounds(95, 70, 140, 25);
		pwTextf.setText("");
		add(pwTextf);
		
		JButton btnlogin = new JButton("로그인");
		btnlogin.setBounds(250, 35, 80, 60);
		btnlogin.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Singleton singleton = Singleton.getInstance();
				if (!idTextf.getText().trim().equals("") && !pwTextf.getText().trim().equals("")) {
					if (singleton.memCtrl.checkLogin(idTextf.getText(), pwTextf.getText()).getId() != null) {
						singleton.selectCtrl.menu();
						singleton.setLoginID(idTextf.getText());
						dispose();
					}
				}else {
					JOptionPane.showMessageDialog(null, "아이디 또는 비밀번호를 입력해주세요.");
				}
				
			}
		});
		add(btnlogin);
		
		JButton btnsign = new JButton("회원가입");
		btnsign.setBounds(95, 110, 235, 25);
		btnsign.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Singleton singleton = Singleton.getInstance();
				singleton.memCtrl.sign();
				dispose();
			}
		});
		add(btnsign);
		
		setLocation(600, 100);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	}

}

view - SignView

회원가입 메뉴이며, 아이디 체크부분은 Dao에서 미구현상태이다.

주석처리한 코드를 활용하여 충분히 구현가능하며, 아이디와 비밀번호 글자수 제한 또한 구현되지 않았다.

정규표현식을 통하여 구현 할 수 있으며, 회원가입부분은 이 프로젝트의 목적이 아니기에 가볍게 구현되었다.

package view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import dto.MemberDto;
import singleton.Singleton;

public class SignView extends JFrame{
	
	public SignView() {
		
		setTitle("회원가입 화면");
		setSize(420, 330);

		setLayout(null);

		JLabel idLabel = new JLabel("ID");
		idLabel.setBounds(70, 15, 45, 30);
		add(idLabel);

		JTextField idTextf = new JTextField(20);
		idTextf.setBounds(120, 15, 125, 25);
		idTextf.setText("");
		add(idTextf);

		JLabel pwLabel = new JLabel("PW");
		pwLabel.setBounds(70, 55, 45, 30);
		add(pwLabel);

		JTextField pwTextf = new JTextField(20);
		pwTextf.setBounds(120, 55, 200, 25);
		pwTextf.setText("");
		add(pwTextf);

		JLabel nameLabel = new JLabel("NAME");
		nameLabel.setBounds(70, 95, 45, 30);
		add(nameLabel);

		JTextField nameTextf = new JTextField(20);
		nameTextf.setBounds(120, 95, 200, 25);
		nameTextf.setText("");
		add(nameTextf);

		JLabel ageLabel = new JLabel("AGE");
		ageLabel.setBounds(70, 135, 45, 30);
		add(ageLabel);

		JTextField ageTextf = new JTextField(20);
		ageTextf.setBounds(120, 135, 200, 25);
		ageTextf.setText("");
		add(ageTextf);
		
		JLabel phoneLabel = new JLabel("PHONE");
		phoneLabel.setBounds(70, 175, 45, 30);
		add(phoneLabel);

		JTextField phoneTextf = new JTextField(20);
		phoneTextf.setBounds(120, 175, 200, 25);
		phoneTextf.setText("");
		add(phoneTextf);
		
		JButton btnSgin = new JButton("회원가입");
		btnSgin.setBounds(200, 215, 120, 30);
		btnSgin.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Singleton singleton = Singleton.getInstance();
				MemberDto dto = new MemberDto();
				dto.setId(idTextf.getText());
				dto.setPwd(pwTextf.getText());
				dto.setName(nameTextf.getText());
				dto.setAge(Integer.parseInt(ageTextf.getText()));
				dto.setPhone(phoneTextf.getText());
				dto.setAuth(0);
				System.out.println(dto.toString());
				singleton.memCtrl.addMember(dto);
				dispose();
				singleton.memCtrl.login();
			}
		});
		add(btnSgin);

		JButton btnReturn = new JButton("돌아가기");
		btnReturn.setBounds(70, 215, 120, 30);
		btnReturn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Singleton singleton = Singleton.getInstance();
				singleton.memCtrl.login();
				dispose();
			}
		});
		add(btnReturn);

		JButton btnCheck = new JButton("check");
		btnCheck.setBounds(250, 15, 70, 25);
		btnCheck.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
//				Singleton s = Singleton.getInstance();
//				
//				if (idTextf.getText().trim().equals("")) {
//					JOptionPane.showMessageDialog(null, "id를 입력해주세요");
//					return;
//				}
//				boolean b = s.memCtrl.idCheck(idTextf.getText().trim());
//				if (b) {
//					JOptionPane.showMessageDialog(null, "사용할 수 없는 id입니다.");
//					idTextf.setText("");
//				} else {
//					JOptionPane.showMessageDialog(null, "id는 사용하실수 있습니다.");
//				}
			}
		});
		add(btnCheck);

		setLocation(600, 100);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

}

view - MenuView

Swing에서 리스트를 뽑아주는 Jtable을 사용 하였으며,

위쪽 Jtable에서는 커피 메뉴를 출력하고, 아래쪽 Jtable에서는 선택한 내역을 임시로 출력한다.

커피메뉴에서 다음페이지와 이전페이지 버튼은 정상적으로 작동이 되며,

선택한 주문내역에서도 마찬가지로 구현이 가능하지만 Dao부분에서 Query문으로는 미구현 상태이므로 다음페이지 버튼을 추가하지 않았고, Jtable에 스크롤을 구현해 놓았으므로 화면을 넘어간 주문내역은 스크롤을 내려 확인이 가능하다.

package view;

import java.awt.Choice;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import dto.CoffeeDto;
import dto.OrderDto;
import singleton.Singleton;

public class MenuView extends JFrame implements MouseListener {

	private JTable jtable1;
	private JTable jtable2;
	private JScrollPane jscrPane1;
	private JScrollPane jscrPane2;

	String menuNames[] = { "Espresso Beverages", "Shot", "Tall", "Grande" };
	String orderMenuRow[] = { "Espresso Beverages", "시럽", "샷추가 or 휘핑추가", "크기", "잔", "가격" };

	Object menuRowData[][];
	Object orderRowData[][];

	DefaultTableModel model;
	DefaultTableModel model2;

	List<CoffeeDto> menuList = null;
	List<OrderDto> orderList = null;

	public MenuView() {

		setTitle("메뉴화면");
		setSize(650, 550);

		setLayout(null);

		JLabel label = new JLabel();
		label.setBounds(10, 10, 120, 15);
		add(label);

		Singleton singleton = Singleton.getInstance();
		menuList = singleton.selectCtrl.getBbsList(singleton.selectedIndex, singleton.text, singleton.rowEndNum,
				singleton.rowStartNum, singleton.rowSetNum);

		// jtable에 row를 생성
		menuRowData = new Object[menuList.size()][4];
		// list에서 테이블로 데이터를 삽입하기 위한 처리
		for (int i = 0; i < menuList.size(); i++) {
			CoffeeDto dto = menuList.get(i);
			menuRowData[i][0] = dto.getName(); // 종류
			menuRowData[i][1] = dto.getSize_short(); // szie 1
			menuRowData[i][2] = dto.getSize_tall(); // size 2
			menuRowData[i][3] = dto.getSize_grande(); // size 3
		}
		// 테이블 관련
		// 테이블 폭을 설정하기 위한 Model
		model = new DefaultTableModel(menuNames, 0);
		model.setDataVector(menuRowData, menuNames); // 2차원 배열을 사용했음. 이게 뭥미

		jtable1 = new JTable(model);
		jtable1.addMouseListener(this);
		// column의 폭을 설정하는 방법
		jtable1.getColumnModel().getColumn(0).setMaxWidth(300); // 메뉴
		jtable1.getColumnModel().getColumn(1).setMaxWidth(150); // size1
		jtable1.getColumnModel().getColumn(2).setMaxWidth(150); // size2
		jtable1.getColumnModel().getColumn(3).setMaxWidth(150); // size3

		jscrPane1 = new JScrollPane(jtable1);
		jscrPane1.setBounds(10, 50, 600, 183);
		add(jscrPane1);

		JLabel menuTitle = new JLabel("가격표");
		menuTitle.setBounds(40, 10, 100, 22);
		add(menuTitle);

		JButton returnBtn = new JButton("목록으로");
		returnBtn.setBounds(110, 10, 100, 22);
		returnBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.selectedIndex = -1;
				singleton.selectCtrl.menu();
				dispose();
			}
		});
		add(returnBtn);

		Choice searchChoice = new Choice();
		searchChoice.add("None");
		searchChoice.add("Americano");
		searchChoice.add("Latte");
		searchChoice.add("Mocca");
		searchChoice.setBounds(270, 10, 90, 20);
		add(searchChoice);

		JTextField searchTextf = new JTextField(50);
		searchTextf.setBounds(365, 10, 140, 22);
		searchTextf.setText("");
		add(searchTextf);

		JButton searchBtn = new JButton("검색");
		searchBtn.setBounds(510, 10, 100, 22);
		searchBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.selectedIndex = searchChoice.getSelectedIndex();
				singleton.text = searchTextf.getText();
				if (singleton.selectedIndex == 0 && searchTextf.getText().trim().equals("")) {
					JOptionPane.showMessageDialog(null, "검색어를 입력해 주세요.");
				}else {
					dispose();
					singleton.selectCtrl.menu();
				}
			}
		});
		add(searchBtn);

		JButton nextBtn = new JButton("다음페이지");
		nextBtn.setBounds(510, 245, 100, 22);
		nextBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.selectedIndex = -1;
				singleton.rowEndNum = menuList.size();
				if (singleton.rowEndNum % 10 == 0) {
					JOptionPane.showMessageDialog(null, "마지막 페이지 입니다.");
				} else if (singleton.rowEndNum == singleton.selectCtrl.rowNum20(singleton.rowStartNum)) {
					singleton.rowStartNum = singleton.rowStartNum + 1;
					dispose();
					singleton.selectCtrl.menu();
				} else if (singleton.rowEndNum != singleton.selectCtrl.rowNum20(singleton.rowStartNum)) {
					JOptionPane.showMessageDialog(null, "마지막 페이지 입니다.");
				}

			}
		});
		add(nextBtn);

		JButton backTBtn = new JButton("이전페이지");
		backTBtn.setBounds(410, 245, 100, 22);
		backTBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.selectedIndex = -1;
				if (singleton.rowStartNum <= 0) {
					JOptionPane.showMessageDialog(null, "첫 페이지 입니다.");
				} else {
					singleton.rowStartNum = singleton.rowStartNum - 1;
					dispose();
					singleton.selectCtrl.menu();
				}
			}
		});
		add(backTBtn);
		
		JLabel orderMenu = new JLabel("주문내역");
		orderMenu.setBounds(40, 270, 100, 22);
		add(orderMenu);
		orderList = singleton.orderList;

		if (orderList != null) {
			orderRowData = new Object[orderList.size()][6];
			// list에서 테이블로 데이터를 삽입하기 위한 처리
			for (int i = 0; i < orderList.size(); i++) {
				OrderDto orderDto = orderList.get(i);
				orderRowData[i][0] = orderDto.getCoffeeName();
				orderRowData[i][1] = orderDto.getSyrupAdd();
				orderRowData[i][2] = orderDto.getOtherAdd();
				orderRowData[i][3] = orderDto.getSize();
				orderRowData[i][4] = orderDto.getEA();
				orderRowData[i][5] = orderDto.getPrice();
			}
		}

		model2 = new DefaultTableModel(orderMenuRow, 0);
		model2.setDataVector(orderRowData, orderMenuRow); // 2차원 배열을 사용했음.

		jtable2 = new JTable(model2);
		jtable2.addMouseListener(this);
		// column의 폭을 설정하는 방법
		jtable2.getColumnModel().getColumn(0).setMaxWidth(300); // 메뉴
		jtable2.getColumnModel().getColumn(1).setMaxWidth(150); // 시럽
		jtable2.getColumnModel().getColumn(2).setMaxWidth(150); // 샷추가
		jtable2.getColumnModel().getColumn(3).setMaxWidth(150); // 휘핑
		jtable2.getColumnModel().getColumn(4).setMaxWidth(150); // 크기
		jtable2.getColumnModel().getColumn(5).setMaxWidth(150); // 잔수

		jscrPane2 = new JScrollPane(jtable2);
		jscrPane2.setBounds(10, 300, 600, 140);
		add(jscrPane2);

		JButton logoutBtn = new JButton("로그아웃");
		logoutBtn.setBounds(10, 450, 100, 22);
		logoutBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.memCtrl.login();
				singleton.orderList.clear();
				dispose();
			}
		});
		add(logoutBtn);

		JButton memberBtn = new JButton("이전 주문 내역");
		memberBtn.setBounds(120, 450, 150, 22);
		memberBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();
				singleton.orderCtrl.oldOrderView();
			}
		});
		add(memberBtn);
		
		JButton orderBtn = new JButton("주문하기");
		orderBtn.setBounds(510, 450, 100, 22);
		orderBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();
				singleton.orderCtrl.orderView();
			}
		});
		add(orderBtn);

		JButton orderResetBtn = new JButton("주문내역 비우기");
		orderResetBtn.setBounds(350, 450, 150, 22);
		orderResetBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				orderList.clear();
				dispose();
				singleton.selectCtrl.menu();
			}
		});
		add(orderResetBtn);

		setLocation(600, 100);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		Singleton singleton = Singleton.getInstance();
		if (e.getSource() == jtable1) {
			int rowMenu = jtable1.getSelectedRow();
			singleton.selectCtrl.selectMenu(null, menuList.get(rowMenu));
			dispose();
		} else if (e.getSource() == jtable2) {
			int rowOrder = jtable2.getSelectedRow();
			CoffeeDto coffeeDto = singleton.selectCtrl.selectOne(orderList.get(rowOrder).getCoffeeName());
			singleton.selectCtrl.selectMenu(orderList.get(rowOrder), coffeeDto);
			dispose();
		}

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub

	}
}

view - SelectView

메뉴를 클릭하였을때와 주문을 수정할때 등장하는 UI이며,

parameter로 Object와 CoffeeDto를 받아 해당 클릭 내역이

수정주문인지, 신규 주문인지 파악하고 임시로 주문내역에 추가된다.

package view;

import java.awt.Choice;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import dto.CoffeeDto;
import singleton.Singleton;

public class SelectView extends JFrame {

	public SelectView(Object objDto, CoffeeDto dto) {

		setTitle("선택화면");
		setSize(650, 230);
		setLayout(null);

		Singleton singleton = Singleton.getInstance();

		JLabel menuNameLabel = new JLabel(dto.getName());
		menuNameLabel.setBounds(35, 30, 300, 25);
		add(menuNameLabel);

		JLabel syrupLabel = new JLabel("시럽추가");
		syrupLabel.setBounds(35, 80, 100, 25);
		add(syrupLabel);

		Choice syrupChoice = new Choice();
		syrupChoice.add("none");
		syrupChoice.add("Vanilla");
		syrupChoice.add("Caramel");
		syrupChoice.add("Hazelnut");
		syrupChoice.setBounds(20, 110, 90, 20);
		add(syrupChoice);

		JLabel otherLabel = new JLabel("기타");
		otherLabel.setBounds(165, 80, 100, 25);
		add(otherLabel);

		Choice otherChoice = new Choice();
		otherChoice.add("none");
		otherChoice.add("Shot Add");
		otherChoice.add("Whipped Cream Add");
		otherChoice.setBounds(120, 110, 120, 20);
		add(otherChoice);

		JLabel sizeLabel = new JLabel("사이즈 선택");
		sizeLabel.setBounds(260, 80, 100, 25);
		add(sizeLabel);

		Choice sizeChoice = new Choice();
		sizeChoice.add("Short");
		sizeChoice.add("Tall");
		sizeChoice.add("Grande");
		sizeChoice.setBounds(250, 110, 90, 20);
		add(sizeChoice);

		JLabel eaLabel = new JLabel("몇 잔");
		eaLabel.setBounds(365, 80, 100, 25);
		add(eaLabel);

		JTextField eaChoice = new JTextField(10);
		eaChoice.setBounds(350, 110, 70, 23);
		eaChoice.setText("1");
		add(eaChoice);

		JButton logoutBtn = new JButton("메뉴로 돌아가기");
		logoutBtn.setBounds(440, 30, 150, 25);
		logoutBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.selectCtrl.menu();
				dispose();
			}
		});
		add(logoutBtn);

		JButton selectBtn = new JButton("선택완료");
		selectBtn.setBounds(440, 110, 150, 25);
		selectBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.orderCtrl.orderAdd(objDto, dto, dto.getName(), sizeChoice.getSelectedIndex(), syrupChoice.getSelectedIndex(), otherChoice.getSelectedIndex(), eaChoice.getText());
				singleton.selectCtrl.menu();
				dispose();
			}
		});
		add(selectBtn);

		setLocation(600, 250);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

}

view - OrderView

주문하기를 눌었을때 최종적으로 주문을 확인해주며, 결제확인을 하는 UI이다.

결제하기 버튼을 누르면 주문이 완료되었습니다. 라는 메세지와 함께 자동으로 로그아웃된다.

요즘 가게에서 자주 보이는 kiosk와 동일하게 동작하는 원리이며, 실제 결제 되는 부분은 구현 하지 않았다.

결제하기 버튼을 누르게되면 데이터베이스에 해당 주문내역과 시간, 금액이 저장된다.

package view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import dto.OrderDto;
import singleton.Singleton;

public class OrderView extends JFrame{
	
	private JTable jtable2;
	private JScrollPane jscrPane2;

	String orderMenuRow[] = { "Espresso Beverages", "시럽", "샷추가 or 휘핑추가", "크기", "잔", "가격" };

	Object orderRowData[][];

	DefaultTableModel model2;
	
	
	public OrderView() {
		
		setTitle("주문확인 및 결제");
		setSize(650, 300);
		setLayout(null);
		
		Singleton singleton = Singleton.getInstance();
		
		JLabel orderMenu = new JLabel("주문내역");
		orderMenu.setBounds(40, 20, 100, 22);
		add(orderMenu);
		
		if (singleton.orderList != null) {
			orderRowData = new Object[singleton.orderList.size()][6];
			for (int i = 0; i < singleton.orderList.size(); i++) {
				OrderDto orderDto = singleton.orderList.get(i);
				orderRowData[i][0] = orderDto.getCoffeeName();
				orderRowData[i][1] = orderDto.getSyrupAdd();
				orderRowData[i][2] = orderDto.getOtherAdd();
				orderRowData[i][3] = orderDto.getSize();
				orderRowData[i][4] = orderDto.getEA();
				orderRowData[i][5] = orderDto.getPrice();
			}
		}
		
		model2 = new DefaultTableModel(orderMenuRow, 0);
		model2.setDataVector(orderRowData, orderMenuRow); // 2차원 배열을 사용했음. 이게 뭥미

		jtable2 = new JTable(model2);
		// column의 폭을 설정하는 방법
		jtable2.getColumnModel().getColumn(0).setMaxWidth(300); // 메뉴
		jtable2.getColumnModel().getColumn(1).setMaxWidth(150); // 시럽
		jtable2.getColumnModel().getColumn(2).setMaxWidth(150); // 샷추가
		jtable2.getColumnModel().getColumn(3).setMaxWidth(150); // 휘핑
		jtable2.getColumnModel().getColumn(4).setMaxWidth(150); // 크기
		jtable2.getColumnModel().getColumn(5).setMaxWidth(150); // 잔수

		jscrPane2 = new JScrollPane(jtable2);
		jscrPane2.setBounds(10, 50, 600, 100);
		add(jscrPane2);
		
		ArrayList<OrderDto> list = (ArrayList<OrderDto>) singleton.orderList;
		int totalPrice = 0;
		int totalEA = 0;
		for (OrderDto orderDto : list) {
			 totalPrice += Integer.parseInt(orderDto.getPrice());
			 totalEA += Integer.parseInt(orderDto.getEA());
		}
		
		JLabel totalPriceLabel = new JLabel("총 금액");
		totalPriceLabel.setBounds(500, 20, 100, 22);
		add(totalPriceLabel);
		
		JLabel orderPrice = new JLabel(totalPrice+"");
		orderPrice.setBounds(550, 20, 100, 22);
		add(orderPrice);
		
		JLabel totalEALabel = new JLabel("총 개수");
		totalEALabel.setBounds(400, 20, 100, 22);
		add(totalEALabel);
		
		JLabel orderEA = new JLabel(totalEA+"");
		orderEA.setBounds(450, 20, 100, 22);
		add(orderEA);
		
		JButton orderStart = new JButton("결제하기");
		orderStart.setBounds(500, 200, 110, 30);
		orderStart.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				singleton.orderCtrl.addOrder(singleton.orderList);
				JOptionPane.showMessageDialog(null, singleton.getLoginID()+" 님의 주문이 결제 완료 되었습니다.");
				dispose();
				singleton.orderList.clear();
				singleton.memCtrl.login();
			}
		});
		add(orderStart);
		
		JButton returnBtn = new JButton("메뉴로 돌아가기");
		returnBtn.setBounds(320, 200, 150, 30);
		returnBtn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();
				singleton.selectCtrl.menu();
			}
		});
		add(returnBtn);
		
		setLocation(600, 100);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

}

view - OldOrderView

로그인 이후 이용이 가능한 kiosk 이므로, 해당 회원의 id로 이전 주문내역 확인이 가능하다.

추가적으로 추천메뉴 또는 마일리지 등등도 구현이 가능할것 같지만, 이전주문내역만 확인하는 용도로 작성 하였으며,

DB 테이블이 있어 저장하고 그 내역을 보여준다.

package view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import dto.OrderDto;
import singleton.Singleton;

public class OldOrderView extends JFrame{
	
	private JTable jtable2;
	private JScrollPane jscrPane2;

	String orderMenuRow[] = { "Espresso Beverages", "주문시간", "사이즈", "잔", "가격" };

	Object orderRowData[][];

	DefaultTableModel model2;
	
	public OldOrderView() {

		setTitle("이전 주문내역 확인");
		setSize(650, 330);
		setLayout(null);
		
		Singleton singleton = Singleton.getInstance();
		
		JLabel orderMenu = new JLabel("이전 주문내역");
		orderMenu.setBounds(40, 20, 100, 22);
		add(orderMenu);
		
		singleton.orderList = singleton.orderCtrl.selectOne(singleton.getLoginID());
		
		if (singleton.orderList != null) {
			orderRowData = new Object[singleton.orderList.size()][5];
			for (int i = 0; i < singleton.orderList.size(); i++) {
				OrderDto orderDto = singleton.orderList.get(i);
				orderRowData[i][0] = orderDto.getCoffeeName();
				orderRowData[i][1] = orderDto.getOrderDate();
				orderRowData[i][2] = orderDto.getSize();
				orderRowData[i][3] = orderDto.getEA();
				orderRowData[i][4] = orderDto.getPrice();
			}
		}
		
		model2 = new DefaultTableModel(orderMenuRow, 0);
		model2.setDataVector(orderRowData, orderMenuRow); // 2차원 배열을 사용했음. 이게 뭥미

		jtable2 = new JTable(model2);
		// column의 폭을 설정하는 방법
		jtable2.getColumnModel().getColumn(0).setMaxWidth(300); // 메뉴
		jtable2.getColumnModel().getColumn(1).setMaxWidth(300); // 주문시간
		jtable2.getColumnModel().getColumn(2).setMaxWidth(150); // 사이즈
		jtable2.getColumnModel().getColumn(3).setMaxWidth(150); // 잔
		jtable2.getColumnModel().getColumn(4).setMaxWidth(150); // 가격

		jscrPane2 = new JScrollPane(jtable2);
		jscrPane2.setBounds(10, 50, 600, 183);
		add(jscrPane2);
		
		int totalPrice = 0;
		int totalEA = 0;
		for (OrderDto orderDto : singleton.orderList) {
			 totalPrice += Integer.parseInt(orderDto.getPrice());
			 totalEA += Integer.parseInt(orderDto.getEA());
		}
		
		JLabel totalPriceLabel = new JLabel("총 금액");
		totalPriceLabel.setBounds(500, 20, 100, 22);
		add(totalPriceLabel);
		
		JLabel orderPrice = new JLabel(totalPrice+"");
		orderPrice.setBounds(550, 20, 100, 22);
		add(orderPrice);
		
		JLabel totalEALabel = new JLabel("총 개수");
		totalEALabel.setBounds(400, 20, 100, 22);
		add(totalEALabel);
		
		JLabel orderEA = new JLabel(totalEA+"");
		orderEA.setBounds(450, 20, 100, 22);
		add(orderEA);
		
//		JButton nextBtn = new JButton("다음페이지");
//		nextBtn.setBounds(510, 240, 100, 25);
//		nextBtn.addActionListener(new ActionListener() {
//
//			@Override
//			public void actionPerformed(ActionEvent e) {
//				singleton.selectedIndex = -1;
//				singleton.rowEndNum = singleton.orderList.size();
//				if (singleton.rowEndNum % 10 == 0) {
//					JOptionPane.showMessageDialog(null, "마지막 페이지 입니다.");
//				} else if (singleton.rowEndNum == singleton.selectCtrl.rowNum20(singleton.rowStartNum)) {
//					singleton.rowStartNum = singleton.rowStartNum + 1;
//					dispose();
//					singleton.selectCtrl.menu();
//				}
//				
//				else if (singleton.rowEndNum != singleton.selectCtrl.rowNum20(singleton.rowStartNum)) {
//					JOptionPane.showMessageDialog(null, "마지막 페이지 입니다.");
//				}
//
//			}
//		});
//		add(nextBtn);
//
//		JButton backTBtn = new JButton("이전페이지");
//		backTBtn.setBounds(410, 240, 100, 25);
//		backTBtn.addActionListener(new ActionListener() {
//
//			@Override
//			public void actionPerformed(ActionEvent e) {
//				singleton.selectedIndex = -1;
//				if (singleton.rowStartNum <= 0) {
//					JOptionPane.showMessageDialog(null, "첫 페이지 입니다.");
//				} else {
//					singleton.rowStartNum = singleton.rowStartNum - 1;
//					dispose();
//					singleton.selectCtrl.menu();
//				}
//			}
//		});
//		add(backTBtn);
		
		JButton menuReturn = new JButton("메뉴로 돌아가기");
		menuReturn.setBounds(410, 240, 200, 25);
		menuReturn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();
				singleton.orderList.clear();
				singleton.selectCtrl.menu();
			}
		});
		add(menuReturn);
		
		setLocation(600, 100);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	}

}

controller - MemberController

로그인 및 회원가입을 담당하는 controller 이다.

따로 내용은 없으며, Dao를 통해 처리되기 때문에 현재는 memServMemberServiceImpl에서 view로 전달만 해주는 역할을 하고 있다.

package controller;

import dto.MemberDto;
import service.impl.MemberServiceImpl;
import serviec.MemberService;
import view.LoginView;
import view.SignView;

public class MemberController {

	MemberService memServ = new MemberServiceImpl();

	public void login() {
		new LoginView();
	}

	public void sign() {
		new SignView();
	}
	
	public MemberDto checkLogin(String id, String pw) {
		return memServ.loginCheck(id, pw);
	}
	
	public void addMember(MemberDto dto) {
		memServ.addMember(dto);
	}

}

controller - SelectController

선택 Controller 역시 위 Membercontroller와 동일하게 SelectServiceImpl에서 view로 전달만 해주고있다.

package controller;

import java.util.List;

import dto.CoffeeDto;
import service.impl.SelectServiceImpl;
import serviec.SelectService;
import view.MenuView;
import view.SelectView;

public class SelectController {

	SelectService selectServ = new SelectServiceImpl();
	
	public void menu() {
		new MenuView();
	}

	public void selectMenu(Object obj, CoffeeDto dto) {
		new SelectView(obj, dto);
	}
	
	public CoffeeDto selectOne(String name) {
		return selectServ.selectOne(name);
	}
	
	public List<CoffeeDto> getBbsList(int selectedIndex, String text, int rowEndNum, int rowStartNum, int rowSetNum) {
		return selectServ.getBbsList(selectedIndex, text, rowEndNum, rowStartNum, rowSetNum);
	}
	
	public int rowNum20(int rowStartNum) {
		return selectServ.rowNum20(rowStartNum);
	}
	
	public int rowNum10(int rowSetNum, int rowStartNum) {
		return selectServ.rowNum10(rowSetNum, rowStartNum);
	}
	
}

controller - OrderController

OrderController는 위 두개의 contoller와 다르게 뷰에서 입력받은 내용을 parameter로 전달받아 처리를 하는 내용이 담겨있다. 주문내역을 singleton에 있는 list에 추가하는 내용이다.

package controller;

import java.util.List;

import dto.CoffeeDto;
import dto.OrderDto;
import service.impl.OrderServiceImpl;
import serviec.OrderService;
import singleton.Singleton;
import view.OldOrderView;
import view.OrderView;

public class OrderController {
	
	OrderService ordServ = new OrderServiceImpl();
	
	public void orderView() {
		new OrderView();
	}
	
	public void oldOrderView() {
		new OldOrderView();
	}

	public void addOrder(List<OrderDto> orderList) {
		ordServ.addOrder(orderList);
		
	}
	
	public List<OrderDto> selectOne(String id){
		return ordServ.selectOne(id);
	}

	public void orderAdd(Object objDto, CoffeeDto dto, String name, int selectedIndex, int selectedIndex2, int selectedIndex3, String text) {
		
		String sizePrice_short ="";
		String sizePrice_tall ="";
		String sizePrice_grande ="";
		
		Singleton singleton = Singleton.getInstance();
		OrderDto orderDto = new OrderDto();
		
		name = dto.getName();
		sizePrice_short = dto.getSize_short();
		sizePrice_tall = dto.getSize_tall();
		sizePrice_grande = dto.getSize_grande();
		
		if (objDto != null) {
			if (objDto instanceof CoffeeDto) {
				name = ((CoffeeDto)objDto).getName();
				sizePrice_short = ((CoffeeDto)objDto).getSize_short();
				sizePrice_tall = ((CoffeeDto)objDto).getSize_tall();
				sizePrice_grande = ((CoffeeDto)objDto).getSize_grande();
			}
		}
		
		orderDto.setLoginID(singleton.getLoginID());
		orderDto.setCoffeeName(name);
		if (selectedIndex == 0) {
			orderDto.setPrice(sizePrice_short);
			orderDto.setSize("Short");
		} else if (selectedIndex == 1) {
			orderDto.setPrice(sizePrice_tall);
			orderDto.setSize("Tall");
		} else if (selectedIndex == 2) {
			orderDto.setPrice(sizePrice_grande);
			orderDto.setSize("Grande");
		}
		System.out.println(orderDto.getPrice());
		
		int price = Integer.parseInt(orderDto.getPrice());

		if (selectedIndex2 == 0) {
			orderDto.setSyrupAdd("추가안함");
		} else if (selectedIndex2 == 1) {
			orderDto.setSyrupAdd("바닐라 시럽");
			orderDto.setPrice(Integer.toString((price + 500)));
		} else if (selectedIndex2 == 2) {
			orderDto.setSyrupAdd("카라멜 시럽");
			orderDto.setPrice(Integer.toString((price + 500)));
		} else if (selectedIndex2 == 3) {
			orderDto.setSyrupAdd("헤이즐넛 시럽");
			orderDto.setPrice(Integer.toString((price + 500)));
		}

		if (selectedIndex3 == 0) {
			orderDto.setOtherAdd("추가안함");
		} else if (selectedIndex3 == 1) {
			orderDto.setOtherAdd("샷추가");
			orderDto.setPrice(Integer.toString((price + 500)));
		} else if (selectedIndex3 == 2) {
			orderDto.setOtherAdd("휘핑크림 추가");
			orderDto.setPrice(Integer.toString((price + 500)));
		}
		orderDto.setEA(text.trim());
		int total_price = price*Integer.parseInt(text);
		orderDto.setPrice(Integer.toString(total_price));
		
		for (int i = 0; i < singleton.orderList.size(); i++) {
			if (singleton.orderList.get(i).getCoffeeName().equals(name)
					&& !singleton.orderList.get(i).getPrice().equals(Integer.toString(total_price))) {
				singleton.orderList.remove(i);
			} else if(singleton.orderList.get(i).getCoffeeName().equals(name) || singleton.orderList.get(i).getPrice().equals(Integer.toString(total_price))) {
				singleton.orderList.remove(i);
			}
		}
		singleton.orderList.add(orderDto);
		
	}

}

 

service - interface MemberService

service.impl - MemberServiceImpl implements MemberService

인터페이스인 MemberService를 상속받은 MemberServiceImpl 로 controller와 Dao 사이에서 대화를 하고 있다.

현재는 다른 내용이 들어있지는 않다. 아래 Select와 Order도 동일하다.

package service;

import dto.MemberDto;

public interface MemberService {
	
	public void addMember(MemberDto dto);
	
	public boolean getId(String id);
	
	public MemberDto loginCheck(String id, String pw);
}

// 다른 패키지이므로 확인하도록 하자 //

package service.impl;

import dao.MemberDao;
import dao.impl.MemberDaoImpl;
import dto.MemberDto;
import serviec.MemberService;

public class MemberServiceImpl implements MemberService {

	MemberDao dao = new MemberDaoImpl();

	@Override
	public void addMember(MemberDto dto) {
		dao.addMember(dto);
	}

	@Override
	public boolean getId(String id) {
		return dao.getId(id);
	}
	
	@Override
	public MemberDto loginCheck(String id, String pw) {
		return dao.loginCheck(id, pw);
	}

}

service - interface SelectService

service.impl - SelectServiceImpl implements SelectService

package service;

import java.util.List;

import dto.CoffeeDto;

public interface SelectService {
	
	public int rowNum10(int rowSetNum, int rowStartNum);
	
	public int rowNum20(int rowStartNum);
	
	public CoffeeDto selectOne(String name);
	
	public List<CoffeeDto> getBbsList(int selectedIndex, String text, int rowEndNum, int rowStartNum, int rowSetNum);

}

// 다른 패키지 이므로 확인하도록 하자 //

package service.impl;

import java.util.List;

import dao.SelectDao;
import dao.impl.SelectDaoImpl;
import dto.CoffeeDto;
import service.SelectService;

public class SelectServiceImpl implements SelectService {
	
	SelectDao dao = new SelectDaoImpl();

	@Override
	public List<CoffeeDto> getBbsList(int selectedIndex, String text, int rowEndNum, int rowStartNum, int rowSetNum) {
		return dao.getBbsList(selectedIndex, text, rowEndNum, rowStartNum, rowSetNum);
	}

	@Override
	public int rowNum10(int rowSetNum, int rowStartNum) {
		return dao.rowNum10(rowSetNum, rowStartNum);
	}

	@Override
	public int rowNum20(int rowStartNum) {
		return dao.rowNum20(rowStartNum);
	}

	@Override
	public CoffeeDto selectOne(String name) {
		return dao.selectOne(name);
	}

}

service - interface OrderService

service.impl - OrderServiceImpl implements OrderService

package service;

import java.util.List;

import dto.OrderDto;

public interface OrderService {

	public void addOrder(List<OrderDto> orderList);
	
	public List<OrderDto> selectOne(String id);

}

// 다른 패키지 이므로 확인하도록 하자 //

package service.impl;

import java.util.List;

import dao.OrderDao;
import dao.impl.OrderDaoImpl;
import dto.OrderDto;
import service.OrderService;

public class OrderServiceImpl implements OrderService {
	
	OrderDao ordDao = new OrderDaoImpl();
	
	@Override
	public void addOrder(List<OrderDto> orderList) {
		ordDao.addOrder(orderList);
	}

	@Override
	public List<OrderDto> selectOne(String id) {
		return ordDao.selectOne(id);
	}

}

dao - interface MemberDao

Dao에서 Service로 전달하기 위한 메소드 규약

package dao;

import dto.MemberDto;

public interface MemberDao {
	
	public void addMember(MemberDto dto);
	
	public boolean getId(String id);
	
	public MemberDto loginCheck(String id, String pw);
	
}

dao.impl - MemberDaoImpl implements MemberDao

회원관련 처리를 할때 필요한 jdbc 메소드를 정리한 클래스이며,

회원추가, 로그인확인, 아이디확인 메소드가 있다.

회원추가는 Query문 INSERT INTO와 jdbc의 executeUpdate();를 사용하고, 나머지는 SELECT와 executeQuery();를 사용하고 있다. MEMBER 테이블을 사용한다.

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import dao.MemberDao;
import db.DBClose;
import db.DBConnection;
import dto.MemberDto;
/*
CREATE TABLE MEMBER(
ID VARCHAR2(30) PRIMARY KEY,
PWD VARCHAR2(30) NOT NULL,
NAME VARCHAR2(50) NOT NULL,
AGE VARCHAR2(50) UNIQUE,
PHONE VARCHAR2(50) NOT NULL,
AUTH NUMBER(1) NOT NULL);
*/

public class MemberDaoImpl implements MemberDao{
	
	@Override
	public boolean getId(String id) {
		String sql = " SELECT ID " + "FROM MEMBER " + "WHERE ID = ? ";

		Connection conn = null; // DB Connection
		PreparedStatement psmt = null; // SWL
		ResultSet rs = null; // result
		System.out.println("sql:" + sql);

		boolean findid = false;
		try {
			conn = DBConnection.getConnection();
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			rs = psmt.executeQuery();

			if (rs.next()) {
				findid = true;
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, rs);
		}
		return findid;
	}
	
	public void addMember(MemberDto dto) {
		String sql = " INSERT INTO MEMBER " + " VALUES('" + dto.getId() + "', '" + dto.getPwd() + "', '" + dto.getName()
				+ "', '" + dto.getAge() + "', '" + dto.getPhone() + "', 0 )";
		System.out.println("addMember sql:" + sql);

		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		
		try {
			if (!getId(dto.getId())) {
				conn = DBConnection.getConnection();
				psmt = conn.prepareStatement(sql);
				psmt.executeUpdate();
				System.out.println("회원추가에 성공하였습니다.");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, rs);
		}

	}
	
	@Override
	public MemberDto loginCheck(String id, String pw) {
		String sql = " SELECT ID, PWD, NAME, AGE, PHONE, AUTH " + " FROM MEMBER " + " WHERE ID = ? ";

		Connection conn = null; // DB Connection
		PreparedStatement psmt = null; // SWL
		ResultSet rs = null; // result
		MemberDto dto = null;

		try {
			conn = DBConnection.getConnection();
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			rs = psmt.executeQuery();
			System.out.println("sql:" + sql);
			if (rs.next()) {
				if (rs.getString(1).equals(id) && rs.getString(2).equals(pw)) {
					dto = new MemberDto();
					dto.setId(rs.getString("ID"));
					dto.setPwd(rs.getString("PWD"));
					dto.setName(rs.getString("NAME"));
					dto.setAge(Integer.parseInt(rs.getString("AGE")));
					dto.setPhone(rs.getString("PHONE"));
					dto.setAuth(rs.getInt("AUTH"));
				} 
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, rs);
		}
		return dto;
	}

}

dao - interface SelectDao

Dao에서 Service로 전달하기 위한 메소드 규약

package dao;

import java.util.List;

import dto.CoffeeDto;

public interface SelectDao {
	
	public int rowNum10(int rowSetNum, int rowStartNum);
	
	public int rowNum20(int rowStartNum);
	
	public CoffeeDto selectOne(String name);

	public List<CoffeeDto> getBbsList(int selectedIndex, String text, int rowEndNum, int rowStartNum, int rowSetNum);
	
}

dao - SelectDaoImpl implements SelectDao

전체 메뉴를 보여주기위해 테이블에서 list로 담는 메소드와,

하나를 선택했을때 해당 row만을 반환하는 selectOne 메소드가 핵심이며,

rowNum10, rowNum20메소드는 이전 페이지와 다음페이지 구현을 위하여

해당 전체 메뉴 리스트에 ROWNUM Query를 사용, 10개씩 목록이 끊어지도록 구현되었다.

메뉴 검색을 위한 WHERE절도 있다. COFFEE 테이블을 사용한다.

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.SelectDao;
import db.DBClose;
import db.DBConnection;
import dto.CoffeeDto;

/*
	CREATE TABLE COFFEE(
	SEQ NUMBER(8) PRIMARY KEY,
	COFFEE_NAME VARCHAR2(200) NOT NULL,
	SIZE_Short VARCHAR2(20),
	SIZE_Tall VARCHAR2(20),
	SIZE_Grande VARCHAR2(20)
);
 */

public class SelectDaoImpl implements SelectDao {

	public int rowNum10(int rowSetNum, int rowStartNum) {
		int rowNum10 = rowSetNum + rowStartNum * 10; // 1, 11, 21, 31, 41, 51
		if (rowStartNum < 0) {
			rowStartNum = 0;
			return rowNum10 = 1;
		}
		return rowNum10;
	}

	public int rowNum20(int rowStartNum) {
		int rowNum20 = 10 + rowStartNum * 10; // 10, 20, 30, 40, 50
		if (rowStartNum < 0) {
			rowStartNum = 0;
			return rowNum20 = 10;
		}
		return rowNum20;
	}

	public CoffeeDto selectOne(String name) {
		String sql = " SELECT * " + "FROM COFFEE " + "WHERE COFFEE_NAME = ? ";

		Connection conn = null; // DB Connection
		PreparedStatement psmt = null; // SWL
		ResultSet rs = null; // result
		System.out.println("sql:" + sql);

		CoffeeDto findid = new CoffeeDto();
		try {
			conn = DBConnection.getConnection();
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, name);
			rs = psmt.executeQuery();

			if (rs.next()) {
				findid.setSeq(Integer.parseInt(rs.getString(1)));
				findid.setName(rs.getString(2));
				findid.setSize_short(rs.getString(3));
				findid.setSize_tall(rs.getString(4));
				findid.setSize_grande(rs.getString(5));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, rs);
		}
		return findid;
	}

	@Override
	public List<CoffeeDto> getBbsList(int selectedIndex, String text, int rowEndNum, int rowStartNum, int rowSetNum) {

		List<CoffeeDto> list = null;

		String sql = " SELECT SEQ, COFFEE_NAME, SIZE_Short, SIZE_Tall, SIZE_Grande, RNUM "
				+ " FROM (SELECT ROWNUM AS RNUM, SEQ, COFFEE_NAME, SIZE_Short, SIZE_Tall, SIZE_Grande "
				+ " FROM (SELECT SEQ, COFFEE_NAME, SIZE_Short, SIZE_Tall, SIZE_Grande " + " FROM COFFEE ";

		if (selectedIndex == 0) { //
			sql = sql + " WHERE COFFEE_NAME LIKE '%'||?||'%' ";
		} else if (selectedIndex == 1) {
			text = "아메리카노";
			sql = sql + " WHERE COFFEE_NAME LIKE '%'||?||'%' ";
		} else if (selectedIndex == 2) {
			text = "라떼";
			sql = sql + " WHERE COFFEE_NAME LIKE '%'||?||'%' ";
		} else if (selectedIndex == 3) {
			text = "모카";
			sql = sql + " WHERE COFFEE_NAME LIKE '%'||?||'%' ";
		}
		
		sql = sql + " ORDER BY SEQ DESC)) " + " WHERE RNUM BETWEEN " + rowNum10(rowSetNum, rowStartNum) + " AND "
				+ rowNum20(rowStartNum) + " ";

		System.out.println("sql:" + sql);

		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;

		list = new ArrayList<CoffeeDto>();

		try {
			conn = DBConnection.getConnection();
			psmt = conn.prepareStatement(sql);
			if (selectedIndex == 0 || selectedIndex == 1 || selectedIndex == 2 || selectedIndex == 3) {
				psmt.setString(1, text);
			}
			rs = psmt.executeQuery();
			while (rs.next()) {
				CoffeeDto dto = new CoffeeDto(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4),
						rs.getString(5), Integer.parseInt(rs.getString(6)));
				list.add(dto);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, rs);
		}
		return list;
	}

}

dao - interface OrderDao

Dao에서 Service로 전달하기 위한 메소드 규약

package dao;

import java.util.List;

import dto.OrderDto;

public interface OrderDao {

	public void addOrder(List<OrderDto> orderList);
	
	public List<OrderDto> selectOne(String id);

}

dao - OrderDaoImpl implements OrderDao

ORDER 테이블을 사용하며, ORDER테이블은 MEMBER테이블의 ID를 외래키로 갖고있으며, 

결제 이후 주문시각과 메뉴, 가격이 저장되는 테이블이다.

이전주문내역을 확인 하기 위하여 로그인아이디와, 해당 ORDER테이블의 ID값이 같은 ROW를 반환하여 보여주게된다.

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.OrderDao;
import db.DBClose;
import db.DBConnection;
import dto.OrderDto;
/*
CREATE TABLE ORDERTABLE (
	LOGIN_ID VARCHAR2(30),
	COFFEE_NAME VARCHAR2(200) NOT NULL,
	COFFEE_SIZE VARCHAR2(50) NOT NULL,
	COFFEE_EA VARCHAR(50),
	COFFEE_PRICE VARCHAR2(100),
	ORDER_DATE DATE,
	CONSTRAINT FK_MEMBERID FOREIGN KEY (LOGIN_ID) REFERENCES MEMBER (ID)
);
*/
public class OrderDaoImpl implements OrderDao {

	public void addOrder(List<OrderDto> orderList) {

		for (int i = 0; i < orderList.size(); i++) {
			OrderDto dto = orderList.get(i);

			String sql = " INSERT INTO ORDERTABLE( LOGIN_ID, COFFEE_NAME, COFFEE_SIZE, COFFEE_EA, COFFEE_PRICE, ORDER_DATE )"
					+ " VALUES ( ?, ?, ?, ?, ?, SYSDATE )";
			System.out.println(sql);

			Connection conn = null;
			PreparedStatement psmt = null;
			int rs = 0;

			try {
				conn = DBConnection.getConnection();
				psmt = conn.prepareStatement(sql);
				psmt.setString(1, dto.getLoginID());
				psmt.setString(2, dto.getCoffeeName());
				psmt.setString(3, dto.getSize());
				psmt.setString(4, dto.getEA());
				psmt.setString(5, dto.getPrice());

				System.out.println("sql:" + sql);
				rs = psmt.executeUpdate();

			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				DBClose.close(psmt, conn, null);
			}
		}
	}

	public List<OrderDto> selectOne(String id) {
		List<OrderDto> list = new ArrayList<OrderDto>();

		String sql = " SELECT COFFEE_NAME, COFFEE_SIZE ,COFFEE_EA, COFFEE_PRICE, ORDER_DATE "
				+ " FROM ORDERTABLE " 
				+ " WHERE LOGIN_ID = ? "
				+ " ORDER BY ORDER_DATE DESC ";
		System.out.println(sql);

		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;

		try {
			conn = DBConnection.getConnection();
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);

			System.out.println("sql:" + sql);
			rs = psmt.executeQuery();
			
			while (rs.next()) {
				OrderDto dto = new OrderDto();
				dto.setCoffeeName(rs.getString(1));
				dto.setSize(rs.getString(2));
				dto.setEA(rs.getString(3));
				dto.setPrice(rs.getString(4));
				dto.setOrderDate(rs.getString(5));
				list.add(dto);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBClose.close(psmt, conn, null);
		}

		return list;
	}

}

db - DBConnection

Oracle을 연결해주기 위한 클래스.

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
	
	public static void initConnection() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); // 오라클 드라이버 클래스명
			System.out.println("Driver Loading Success!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			System.out.println("DB Connection Success!");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

db - DBClose

jdbc를 사용후 close를 쉽게 해결하기 위한 클래스.

package db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBClose {

	public static void close(PreparedStatement psmt, Connection conn, ResultSet rs) {
		try {
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

MEMBER 테이블 Query

DROP TABLE member
CASCADE CONSTRAINTS;

CREATE TABLE MEMBER(
ID VARCHAR2(30) PRIMARY KEY,
PWD VARCHAR2(30) NOT NULL,
NAME VARCHAR2(50) NOT NULL,
AGE VARCHAR2(50) UNIQUE,
PHONE VARCHAR2(50) NOT NULL,
AUTH NUMBER(1) NOT NULL);

SELECT * FROM MEMBER;

COFFEE 테이블 Query

DROP TABLE COFFEE
CASCADE CONSTRAINTS;

DROP sequence SEQ_COFFEE;

CREATE TABLE COFFEE(
	SEQ NUMBER(8) PRIMARY KEY,
	COFFEE_NAME VARCHAR2(200) NOT NULL,
	SIZE_Short VARCHAR2(20),
	SIZE_Tall VARCHAR2(20),
	SIZE_Grande VARCHAR2(20)
);

CREATE SEQUENCE SEQ_COFFEE
START WITH 1
INCREMENT BY 1;

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '헤이즐넛 카라멜 모카', 4800, 5300, 5800);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '카라멜 마끼아또', 4300, 4800, 5300);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '화이트 초콜릿 모카', 4300, 4800, 5300);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '카라멜 모카', 4300, 4800, 5300);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '카페 모카', 3800, 4300, 4800);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '카라멜 라떼', 3800, 4300, 4800);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '카페 라떼', 3300, 3800, 4300);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '카푸치노', 3300, 3800, 4300);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '아메리카노', 2800, 3300, 3800);

INSERT INTO COFFEE
VALUES (SEQ_COFFEE.NEXTVAL, '오늘의 커피', 2500, 3000, 3500);

SELECT * FROM COFFEE;

ORDERTABLE 테이블 Query

DROP TABLE ORDERTABLE
CASCADE CONSTRAINTS;

CREATE TABLE ORDERTABLE (
	LOGIN_ID VARCHAR2(30),
	COFFEE_NAME VARCHAR2(200) NOT NULL,
	COFFEE_SIZE VARCHAR2(50) NOT NULL,
	COFFEE_EA VARCHAR(50),
	COFFEE_PRICE VARCHAR2(100),
	ORDER_DATE DATE,
	CONSTRAINT FK_MEMBERID FOREIGN KEY (LOGIN_ID) REFERENCES MEMBER (ID)
);

SELECT * FROM ORDERTABLE;

Bug

- 주문내역 수정시 간혹 주문이 수정되지 않는 경우발생.

- 메뉴 검색시 카테고리 설정후 검색이 되지 않음.

Bug fix

2020/01/05 - 이전 주문내역 확인후 메뉴로 돌아갈때 주문내역 사라지는 버그 수정완료.

Update OR Bug fix

https://github.com/xyrholl/mvc_practice

2020/01/05 - 아이디 중복확인 구현

 

'Toy' 카테고리의 다른 글

호텔 예약 웹사이트 (Hotel BuleMoon) 세미프로젝트  (0) 2020.03.02
Baseball Member Manage  (0) 2019.12.03