티스토리 뷰
배포 하기 위해서 준비 과정..
먼저 방화벽 상태 확인을 클릭!
고급 설정 클릭
위에 사진은 오라클 포트를 추가완료한 것!
인바운드 규칙 > 새규칙 클릭
만들려는 규칙에 포트 선택하고 다음
여기에 넣을 값은
오라클 포트 값을 넣기
아래는 오라클에서 새로 만들기를 클릭하면
포트 번호가 나온다
이 번호를 복사해서
아래에 입력
다음으로 cmd를 켜서
ipconfig 입력
ip주소를 확인한다
만든 프로젝트의 쿼리부분에 localhost 를 지우고
ip주소를 입력
테이블이 하나가 아니라 쿼리가 여러 개이면
모든 쿼리의 사용자 정보 URL을 바꿔본다
이제 마지막으로 프로젝트를 배포하는 과정
프로젝트를 우클릭하고
Export 클릭
Archive File 클릭
저장될 경로 설정
나는 배경화면에
내 이름으로 압축하기로 했음
이렇게 사이드 프로젝트 첫 배포 완료!
사이드 프로젝트 진짜 ㄹㅇ 최종본
명세서는 크게 바뀐게 없다
사이드 프로젝트 명세서
<기간>
1. 제작 기간 : 24-03-05 ~ 24-03-15
2. 발표일 : 24-03-18
<주제>
상품 구매, 관리 할 수 있는 프로그램 구현
<기능>
1. 상품관리 (관리자)
- 상품 등록
- 상품 수정
- 상품 삭제
- 상품 전체 조회
- 회원 정보 조회
2. 상품 구매
- 고객이 상품의 수량을 선택하고 구매 할 수 있음 -> 선택한 상품id를 가져오고 그 다음 구매 테이블에 새로운 구매 내역 추가
- 상품을 고객에게 판매하고 판매내역을 구매 DB에 저장
- 상품 구매 시 재고 수량을 감소시키는 기능
- 구매한 상품의 가격 및 수량 정보를 구매 DB에 기록하는 기능
3. 고객 관리
- 신규 고객을 고객DB에 등록(아이디,비번,이름,연락처)
- 관리자 페이지에서 고객 정보 검색
4. 구매 내역 조회 및 관리
- 특정 고객이 구매한 상품을 조회할 수 있는 기능
- 전체 구매 내역을 조회하고 관리
<테이블 구조 - DB 테이블>
테이블명 : PRODUCTS : 상품의 기본 정보를 저장
컬럼 :
PRODUCT_ID(NUMBER) : 상품번호 - PK
PRODUCTNAME(VARCHAR2) : 상품 이름 - NOT NULL
PRICE(NUMBER) : 상품 가격 - NOT NULL
STOCK(NUMBER) : 상품의 수량 - NOT NULL
테이블명 : PURCHASES : 구매 관리 테이블 ->
PURCHASE_ID(VARCHAR2) : 구매 Id - PK
CUSTOMER_ID(VARCHAR2) : 고객 Id - FK
PRODUCT_ID(NUMBER) : 상품Id - FK
STOCK(NUMBER) : 구매한 상품의 수량
PURCHASE_DATE(TIMESTAMP) : 구매가 발생한 날짜
테이블명 : CUSTOMERS
컬럼 :
CUSTOMER_ID : 고유한 고객 식별자 - PK
PASSWORD : 고객 비밀번호
CUSTOMER_NAME : 고객의 이름
CONTACT : 고객의 연락처 정보
<데이터 구조 >
- ProductsVO
productId(int) : 상품번호
productName(String) : 상품이름
price(double) : 상품가격
stock(int) : 상품의 수량
- PurchasesVO
purchaseId(int) : 구매Id (SEQUENCE)
customerId(String) : 고객Id
productId(int) : 상품번호
stock(int) : 거래된 물품의 수량
purchaseDate(Date) : 구매 날짜 , 시간
-CustomerVO
customerId(String) : 고객Id
password(String) : 고객 Pw
customerName(String) : 고객 이름
contact(String) : 고객 연락처
<클래스 명세서>
PurchasesVO : 거래 데이터(생성,조회,수정,삭제) 클래스 (Model)
CustomerVO : 고객 데이터(생성,조회,수정,삭제) 클래스 (Model)
ProductVO : 상품 데이터 클래스(Model)
ProductDAO : 상품 인터페이스,기능 메서드
ProductDAOImple : 실제 DB에 접근, 상품 데이터를 등록,조회,수정,삭제 처리 (Controller)
CustomerDAO : 고객 인터페이스,기능 메서드
CustomerDAOImple : 실제 DB에 접근, 고객 데이터를 조회 (Controller)
PurchasesDAO : 구매 내역 인터페이스,기능 메서드
PurchasesDAOImple : 실제 DB에 접근, 구매 데이터를 등록 (Controller)
OracleProductQuery : 상품 SQL Query
OracleCustomerQuery : 고객 SQL Query
OraclePurchaseQuery : 구매 SQL Query
ProductMain : 화면에 시작하는 클래스(View)
adminLogin : 관리자 로그인(Frame)
adminPage : 관리자 상품 페이지(Frame)
CustomerSelect : 회원 조회 페이지(Frame)
UserLogin : 사용자 로그인(Frame)
UserCreate : 신규 사용자 등록(Frame)
UserPage : 사용자 상품 페이지(Frame)
UserPurchase : 사용자 구매 페이지(Frame)
변수명 첫글자는 소문자로! 합시다
수정할 수 없어서..
시작 페이지인 productMain
package Products;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.ButtonGroup;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.SwingConstants;
public class ProductMain {
private JFrame frame;
private final ButtonGroup buttonGroup = new ButtonGroup();
private static ProductDAO dao;
private JTextField textField;
public static void main(String[] args) {
dao = ProductDAOImple.getInstance();
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ProductMain window = new ProductMain();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ProductMain() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JRadioButton rdbtnAdministrator = new JRadioButton("관리자 ");
rdbtnAdministrator.setSelected(true);
buttonGroup.add(rdbtnAdministrator);
rdbtnAdministrator.setBounds(83, 39, 140, 23);
frame.getContentPane().add(rdbtnAdministrator);
JRadioButton rdbtnUser = new JRadioButton("사용자");
buttonGroup.add(rdbtnUser);
rdbtnUser.setBounds(260, 39, 121, 23);
frame.getContentPane().add(rdbtnUser);
JButton btnChoose = new JButton("선택");
btnChoose.addMouseListener(new MouseAdapter() {
// 관리자 선택인 경우 -> 선택 클릭 -> textField에 " '관리자'를 선택하셨습니다." 출력
// 사용자 선택인 경우 -> 선택 클릭 -> textField에 " '사용자'를 선택하셨습니다." 출력
public void mouseClicked(MouseEvent e) {
if(rdbtnAdministrator.isSelected()) {
textField.setText("'관리자'를 선택하셨습니다.");
adminLogin adminLogin = new adminLogin();
adminLogin.setVisible(true);
}else {
textField.setText("'사용자'를 선택하셨습니다.");
UserLogin user = new UserLogin();
user.setVisible(true);
}
}
});
btnChoose.setBounds(113, 89, 186, 64);
frame.getContentPane().add(btnChoose);
textField = new JTextField();
textField.setHorizontalAlignment(SwingConstants.CENTER);
textField.setBounds(37, 177, 344, 40);
frame.getContentPane().add(textField);
textField.setColumns(10);
}
}
관리자 로그인 프레임 adminLogin
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextField;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class adminLogin extends JFrame implements OracleProductQuery {
// 관리자 로그인 프레임
private JTextField textFieldId;
private JTextField textFieldPw;
private JPanel contentPane;
private JFrame frame;
private JTextField textID;
private JTextField textName;
private JTextField textPrice;
private JTextField textStock;
private JTextField textResult;
public adminLogin() {
// contentPane을 초기화
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel(); // contentPane을 초기화하고 생성합니다.
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane); // 생성한 contentPane을 JFrame에 설정합니다.
contentPane.setLayout(new BorderLayout(0, 0));
setBounds(100, 100, 480, 347);
getContentPane().setLayout(null);
{
JPanel buttonPane = new JPanel();
buttonPane.setBounds(60, 250, 262, 48);
getContentPane().add(buttonPane);
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
{
JButton LoginButton = new JButton("로그인");
LoginButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
administratorLogin(); // 관리자 로그인
}
});
LoginButton.setFont(new Font("굴림", Font.PLAIN, 18));
LoginButton.setActionCommand("Login");
buttonPane.add(LoginButton);
getRootPane().setDefaultButton(LoginButton);
}
{
JButton cancelButton = new JButton("취소");
cancelButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
dispose(); // 창을 닫으면 현재 창만 종료됨
}
});
cancelButton.setFont(new Font("굴림", Font.PLAIN, 18));
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
}
}
JLabel lblId = new JLabel("ID : ");
lblId.setFont(new Font("굴림", Font.BOLD, 24));
lblId.setBounds(76, 63, 73, 34);
getContentPane().add(lblId);
textFieldId = new JTextField();
textFieldId.setBounds(144, 63, 194, 34);
getContentPane().add(textFieldId);
textFieldId.setColumns(10);
JLabel lblNewLabel = new JLabel("PW : ");
lblNewLabel.setFont(new Font("굴림", Font.BOLD, 23));
lblNewLabel.setBounds(76, 125, 68, 48);
getContentPane().add(lblNewLabel);
textFieldPw = new JTextField();
textFieldPw.setBounds(144, 136, 194, 34);
getContentPane().add(textFieldPw);
textFieldPw.setColumns(10);
}
private void administratorLogin() {
System.out.println("administratorLogin");
String Id = textFieldId.getText();
String Pw = textFieldPw.getText();
if(Id.equals(USER) && Pw.equals(PASSWORD)) {
System.out.println("로그인 성공!");
// adminPage 클래스의 인스턴스 생성
adminPage admin = new adminPage();
admin.setVisible(true);
}else {
System.err.println("잘못된 로그인 입니다. 다시 입력하세요.");
}
}
}
이 프로젝트에서 많이 신경 쓴.. 관리자 상품 등록 페이지 adminPage
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JScrollBar;
public class adminPage extends JFrame {
// 관리자의 상품 등록 페이지
private JPanel contentPane;
private JTextField textId,textName, textPrice,textStock;
private JTable table;
private JTextArea txtAreaInfo;
// Jframe 클래스에서 contentPane 이라는 이름의 JPanel을 생성함
// 즉 contentPane을 생성할 때 JPanel로 초기화
// JFrame 에 표시되는 모든 GUI를 이 패널에 추가
// 싱글톤 객체 가져오기
private ProductDAO dao = ProductDAOImple.getInstance();
//클래스 인스턴스 생성
ProductVO vo = new ProductVO();
/* 스윙 테이블을 사용하기 위한 멤버 변수 선언 */
private String[] colNames = {"Id", "이름", "가격", "수량"}; // 테이블 헤더에 들어갈 이름들
private Object[] records = new Object[colNames.length]; // 테이블 데이터를 저장할 배열 객체
private DefaultTableModel tableModel; // 테이블 형태를 만들 모델 변수
public adminPage() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 583, 603);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("상품 목록");
lblNewLabel.setFont(new Font("나눔고딕", Font.PLAIN, 25));
lblNewLabel.setBounds(217, 10, 119, 44);
contentPane.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("상품 ID : ");
lblNewLabel_1.setFont(new Font("굴림", Font.PLAIN, 20));
lblNewLabel_1.setBounds(73, 205, 84, 30);
contentPane.add(lblNewLabel_1);
textId = new JTextField();
textId.setBounds(175, 205, 161, 30);
contentPane.add(textId);
textId.setColumns(10);
JButton btnSelectBy = new JButton("검색");
btnSelectBy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
selectByProd();
}
});
btnSelectBy.setBounds(375, 205, 107, 29);
contentPane.add(btnSelectBy);
JLabel lblNewLabel_2 = new JLabel("상품 이름 : ");
lblNewLabel_2.setFont(new Font("굴림", Font.PLAIN, 20));
lblNewLabel_2.setBounds(44, 259, 119, 30);
contentPane.add(lblNewLabel_2);
textName = new JTextField();
textName.setBounds(175, 260, 161, 30);
contentPane.add(textName);
textName.setColumns(10);
JLabel lblNewLabel_3 = new JLabel("상품 가격 : ");
lblNewLabel_3.setFont(new Font("굴림", Font.PLAIN, 20));
lblNewLabel_3.setBounds(44, 320, 119, 33);
contentPane.add(lblNewLabel_3);
textPrice = new JTextField();
textPrice.setBounds(173, 320, 163, 30);
contentPane.add(textPrice);
textPrice.setColumns(10);
JLabel lblNewLabel_4 = new JLabel("수량 : ");
lblNewLabel_4.setFont(new Font("굴림", Font.PLAIN, 20));
lblNewLabel_4.setBounds(73, 385, 84, 24);
contentPane.add(lblNewLabel_4);
textStock = new JTextField();
textStock.setBounds(175, 379, 161, 30);
contentPane.add(textStock);
textStock.setColumns(10);
JButton btnInsert = new JButton("등록");
btnInsert.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = textName.getText();
// 빈칸으로 등록을 누른다면
if(textId.getText().isBlank() || name.isBlank() || textPrice.getText().isBlank() || textStock.getText().isBlank()) {
JOptionPane.showMessageDialog( btnInsert,"입력란을 모두 작성해주세요");
return;
}
insertProd();
selectAllProdTable();
}
});
btnInsert.setBounds(84, 433, 97, 30);
contentPane.add(btnInsert);
JButton btnUpdate = new JButton("수정");
btnUpdate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = textName.getText();
// 빈칸으로 등록을 누른다면
if(textId.getText().isBlank() || name.isBlank() || textPrice.getText().isBlank() || textStock.getText().isBlank()) {
JOptionPane.showMessageDialog( btnInsert,"입력란을 모두 작성해주세요");
return;
}
updateProd();
selectAllProdTable();
}
});
btnUpdate.setBounds(228, 433, 97, 30);
contentPane.add(btnUpdate);
JButton btnDelete = new JButton("삭제");
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
deleteProd();
selectAllProdTable();
}
});
btnDelete.setBounds(375, 244, 107, 30);
contentPane.add(btnDelete);
JButton btnSelect = new JButton("전체검색");
btnSelect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
selectAllProd();
selectAllProdTable();
}
});
btnSelect.setBounds(385, 433, 97, 30);
contentPane.add(btnSelect);
JButton btnCustomerSelect = new JButton("회원 조회");
btnCustomerSelect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//회원조회(CustomerSelect) newFrame 생성
CustomerSelect cust = new CustomerSelect();
cust.setVisible(true);
}
});
btnCustomerSelect.setBounds(398, 10, 123, 44);
contentPane.add(btnCustomerSelect);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(44, 65, 477, 130);
contentPane.add(scrollPane);
// 테이블 초기화
tableModel = new DefaultTableModel(colNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(tableModel);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
System.out.println(value);
}
});
scrollPane.setViewportView(table);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(44, 480, 477, 74);
contentPane.add(scrollPane_1);
txtAreaInfo = new JTextArea();
txtAreaInfo.setFont(new Font("나눔고딕", Font.PLAIN, 16));
scrollPane_1.setViewportView(txtAreaInfo);
}// end initialize()
private void insertProd() {
System.out.println("insertProd()");
int result = 0;
int size = dao.select().size();
// id에 string을 입력하면 숫자만 입력가능합니다를 뜨게 만들고 싶음
int Id = 0;
int stock = 0;
double price = 0;
try {
Id = Integer.parseInt(textId.getText());
stock = Integer.parseInt(textStock.getText());
price = Integer.parseInt(textPrice.getText());
} catch (NumberFormatException e) {
// 숫자가 아닌 값을 입력한 경우 예외 처리
JOptionPane.showMessageDialog(null, "숫자만 입력 가능합니다.");
return;
}
System.out.println("size = " + size + ", Id = " + Id );
//int stock = Integer.parseInt(textStock.getText());
String name = textName.getText();
//double price = Double.parseDouble(textPrice.getText());
//현재 등록된 길이(size)보다 큰 Id 값을 입력하는 경우에는 입력하지 못하도록 하기
//중복도 입력하지 못하게 하기
if(Id >= 0 && Id > size && stock > 0) {
ProductVO vo = new ProductVO(Id, name, price, stock);
System.out.println("상품 등록 성공!");
try {
result = dao.insert(vo);
size = dao.select().size();
System.out.println("크기 측정 완료!");
System.out.println(result);
if(result == 1) {
txtAreaInfo.setText("등록된 상품 개수 : " + size + "\n"
+ "등록 완료했습니다.");
}
} catch (Exception e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
}
}else {
System.err.println("------ Id와 수량을 다시 확인하세요. ------");
}
}//end insertProd()
private void updateProd() {
System.out.println("updateProd()");
int prodId;
double price;
int stock;
try {
prodId = Integer.parseInt(textId.getText());
price = Double.parseDouble(textPrice.getText());
stock = Integer.parseInt(textStock.getText());
} catch (NumberFormatException e) {
// 숫자가 아닌 값을 입력한 경우
JOptionPane.showMessageDialog(null, "숫자만 입력 가능합니다.");
return;
}
int size = dao.select().size(); //이게 필요하려면 등록할때 부터 제한을 둬야할듯
if(prodId >= 0 && prodId <= size) {
//int id = Integer.parseInt(textId.getText());
String name = textName.getText();
//double price = Double.parseDouble(textPrice.getText());
//int stock = Integer.parseInt(textStock.getText());
ProductVO vo = new ProductVO(prodId, name, price, stock);
int result = dao.update(prodId, vo);
System.out.println("update 완료!");
if(result == 1) {
txtAreaInfo.setText("상품 수정 완료!");
}
} else {
txtAreaInfo.setText("------ 해당 상품이 없습니다. ------");
}
}//end updateProd()
private void deleteProd() {
System.out.println("deleteProd()");
int productId;
try {
productId = Integer.parseInt(textId.getText());
} catch (NumberFormatException e) {
// 숫자가 아닌 값을 입력한 경우
JOptionPane.showMessageDialog(null, "상품 ID는 숫자만 입력 가능합니다.");
return;
}
int size = dao.select().size();
System.out.println("productId = " + productId + ", size = " + size);
if(productId >= 0 && productId <= size || productId > size) {
int result = dao.delete(productId);
txtAreaInfo.setText("상품 삭제 완료!");
} else {
txtAreaInfo.setText("------ 해당 상품이 없습니다. ------");
}
}//deleteProd()
private void selectAllProd() {
System.out.println("selectAllProd()");
ArrayList<ProductVO> list = dao.select();
int size = list.size();
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < size; i++) {
buffer.append("상품[" + i + "] \n"
+ list.get(i) + "\n");
}
txtAreaInfo.setText(buffer.toString());
}//end selectAllProd()
private void selectByProd() {
System.out.println("selectByProd()");
int productId;
try {
productId = Integer.parseInt(textId.getText());
} catch (NumberFormatException e) {
// 숫자가 아닌 값을 입력한 경우
JOptionPane.showMessageDialog(null, "상품 ID는 숫자만 입력 가능합니다.");
return;
}
int size = dao.select().size();
System.out.println("상품 Id :" + productId + ", 상품 size : " + size);
if(productId >= 0 && productId <= size) {
txtAreaInfo.setText(dao.select(productId).toString());
} else {
txtAreaInfo.setText("------ 해당 상품이 없습니다. ------");
}
}//selectByProd()
private void selectAllProdTable() {
System.out.println("selectAllProdTable()");
ArrayList<ProductVO> list = dao.select();
tableModel.setRowCount(0);
for(int i = 0; i < list.size(); i++) {
ProductVO vo = list.get(i);
records[0] = vo.getProductId();
records[1] = vo.getProductName();
records[2] = vo.getPrice();
records[3] = vo.getStock();
tableModel.addRow(records);
}
}//end selectAllProdTable()
}//end adminPage()
관리자의 회원 조회 프레임 customerSelect
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.ScrollPane;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
public class CustomerSelect extends JFrame {
private JPanel contentPane;
private JTable table;
// 싱글톤 객체 가져오기
private CustomerDAO dao = CustomerDAOImple.getInstance();
/* 스윙 테이블을 사용하기 위한 멤버 변수 선언 */
private String[] colNames = {"Id", "Pw", "이름", "연락처"}; // 테이블 헤더에 들어갈 이름들
private Object[] records = new Object[colNames.length]; // 테이블 데이터를 저장할 배열 객체
private DefaultTableModel tableModel; // 테이블 형태를 만들 모델 변수
public CustomerSelect() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 450, 421);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("회원 관리");
lblNewLabel.setFont(new Font("나눔고딕", Font.PLAIN, 17));
lblNewLabel.setBounds(177, 10, 80, 28);
contentPane.add(lblNewLabel);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(31, 54, 369, 221);
contentPane.add(scrollPane);
// 테이블 초기화
tableModel = new DefaultTableModel(colNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(tableModel);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
System.out.println(value);
}
});
scrollPane.setViewportView(table);
JButton btnSelectAll = new JButton("전체 조회");
btnSelectAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayCustomer();
}
});
btnSelectAll.setBounds(160, 305, 114, 43);
contentPane.add(btnSelectAll);
}
private void displayCustomer() {
System.out.println("displayCustomer()");
// DB에서 상품목록을 가져오는 메서드 호출
ArrayList<CustomerVO> list = dao.getAllCustomers();
// 가져온 상품 목록을 테이블에 표시
for(CustomerVO vo : list) {
tableModel.addRow(new Object[] {
vo.getCustomerId(),
vo.getPassword(),
vo.getCustomerName(),
vo.getContact()
});
}
}//end displayCustomer()
}// end CustomerSelect
사용자의 로그인 페이지 (신규,로그인,취소) 프레임 userLogin
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
public class UserLogin extends JFrame implements OracleCustomerOuery{
// 사용자의 로그인 페이지 (신규,로그인,취소)
private JPanel contentPane;
private JTextField textID;
private JTextField textPW;
static String userId;
// 싱글톤 객체 가져오기
private static CustomerDAO dao = CustomerDAOImple.getInstance();
public UserLogin() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 414, 319);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("User ");
lblNewLabel.setFont(new Font("나눔고딕", Font.BOLD, 25));
lblNewLabel.setBounds(168, 10, 65, 51);
contentPane.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("ID :");
lblNewLabel_1.setFont(new Font("굴림", Font.BOLD, 25));
lblNewLabel_1.setBounds(60, 64, 52, 63);
contentPane.add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("PW : ");
lblNewLabel_2.setFont(new Font("굴림", Font.BOLD, 25));
lblNewLabel_2.setBounds(47, 137, 65, 51);
contentPane.add(lblNewLabel_2);
textID = new JTextField();
textID.setBounds(124, 71, 205, 37);
contentPane.add(textID);
textID.setColumns(10);
textPW = new JTextField();
textPW.setBounds(124, 137, 205, 37);
contentPane.add(textPW);
textPW.setColumns(10);
JButton btnNew = new JButton("신규");
btnNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 신규 버튼을 누르면 회원가입 페이지(UserCreate)로 이동하게 한다.
UserCreate create = new UserCreate();
create.setVisible(true);
}
});
btnNew.setBounds(15, 209, 97, 23);
contentPane.add(btnNew);
JButton btnLogin = new JButton("로그인");
btnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String id = textID.getText();
String pw = textPW.getText();
// 빈칸으로 등록을 누른다면
if(id.isBlank() || pw.isBlank()) {
JOptionPane.showMessageDialog( btnLogin,"입력란을 모두 작성해주세요");
return;
}
CustomerLogin();
}
});
btnLogin.setBounds(148, 209, 97, 23);
contentPane.add(btnLogin);
JButton btnCancel = new JButton("취소");
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
btnCancel.setBounds(274, 209, 97, 23);
contentPane.add(btnCancel);
}
private void CustomerLogin() {
System.out.println("CustomerLogin()");
// DB에서 고객 정보를 가져오기
ArrayList<CustomerVO> list = dao.getAllCustomers();
// 사용자가 입력한 Id,Pw
String inputId = textID.getText();
String inputPw = textPW.getText();
//UserPurchase에서 쓸 textID
userId = inputId;
System.out.println("UserPurchase에서 쓸 textID = " + userId);
// DB에서 가져온 고객 정보와 입력된 아이디와 비밀번호를 비교하여 로그인 처리
for(CustomerVO vo : list) {
if(vo.getCustomerId().equals(inputId) && vo.getPassword().equals(inputPw)) {
// 로그인 성공
System.out.println("로그인 성공");
// 상품 구매 페이지로 넘어가게 하기
UserPage purchase = new UserPage(vo.getCustomerName());
purchase.setVisible(true);
// 현재 로그인 창 닫기
dispose();
// 로그인 성공했으면 반복문 나가기
return;
}
}
// 로그인 실패
System.out.println("로그인을 실패했습니다.");
}//end CustomerLogin()
}//end UserLogin()
사용자 신규 등록 페이지 프레임 userCreate
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import oracle.jdbc.driver.OracleDriver;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
public class UserCreate extends JFrame implements OracleCustomerOuery {
// 사용자 신규 등록 페이지
// 등록하면 새로운 프레임으로 성공, 실패 여부를 알려주기
private JPanel contentPane;
private JTextField textFieldId;
private JTextField textFieldPw;
private JTextField textFieldName;
private JTextField textFieldContact;
private static CustomerDAO dao = CustomerDAOImple.getInstance();
public UserCreate() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 553, 510);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("신규 등록");
lblNewLabel.setFont(new Font("굴림", Font.BOLD, 25));
lblNewLabel.setBounds(202, 10, 125, 56);
contentPane.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("ID : ");
lblNewLabel_1.setFont(new Font("나눔고딕", Font.PLAIN, 20));
lblNewLabel_1.setBounds(88, 92, 42, 35);
contentPane.add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("PW : ");
lblNewLabel_2.setFont(new Font("나눔고딕", Font.PLAIN, 20));
lblNewLabel_2.setBounds(72, 152, 58, 44);
contentPane.add(lblNewLabel_2);
JLabel lblNewLabel_3 = new JLabel("이름 : ");
lblNewLabel_3.setFont(new Font("나눔고딕", Font.PLAIN, 20));
lblNewLabel_3.setBounds(72, 224, 58, 24);
contentPane.add(lblNewLabel_3);
JLabel lblNewLabel_4 = new JLabel("연락처 :");
lblNewLabel_4.setFont(new Font("나눔고딕", Font.PLAIN, 20));
lblNewLabel_4.setBounds(53, 289, 78, 29);
contentPane.add(lblNewLabel_4);
textFieldId = new JTextField();
textFieldId.setBounds(140, 92, 299, 35);
contentPane.add(textFieldId);
textFieldId.setColumns(10);
textFieldPw = new JTextField();
textFieldPw.setBounds(140, 160, 299, 35);
contentPane.add(textFieldPw);
textFieldPw.setColumns(10);
textFieldName = new JTextField();
textFieldName.setBounds(142, 222, 297, 35);
contentPane.add(textFieldName);
textFieldName.setColumns(10);
textFieldContact = new JTextField();
textFieldContact.setBounds(143, 283, 295, 35);
contentPane.add(textFieldContact);
textFieldContact.setColumns(10);
JButton btnNewInsert = new JButton("등록");
btnNewInsert.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 아이디, 비밀번호 , 이름 , 연락처 받아오기
String id = textFieldId.getText();
String pw = textFieldPw.getText();
String name = textFieldName.getText();
String contact = textFieldContact.getText();
// 빈칸으로 등록을 누른다면
if(id.isBlank() || pw.isBlank() || name.isBlank() || contact.isBlank()) {
JOptionPane.showMessageDialog( btnNewInsert,"입력란을 모두 작성해주세요");
return;
}
// 등록한 Id,Pw가 다르다면
if(!id.equals(pw)) {
// 로그인 진행
insertUser(id,pw);
}else {
System.out.println("아이디와 비밀번호는 다르게 설정해주세요.");
}
}
});
btnNewInsert.setBounds(129, 365, 125, 35);
contentPane.add(btnNewInsert);
JButton btnNewCancle = new JButton("취소");
btnNewCancle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
btnNewCancle.setBounds(304, 365, 125, 35);
contentPane.add(btnNewCancle);
}//UserCreate()
private boolean sessionToken(String id, String pw) {
System.out.println("sessionToken()");
// DB에서 고객 정보 가져오기
ArrayList<CustomerVO> list = dao.getAllCustomers();
// DB에서 아이디,비밀번호 비교해서 둘 중 하나라도 중복이 나오면 경고 문구 나가게 하기
for(CustomerVO vo : list) {
if(vo.getCustomerId().equals(id)) {
return true; // 아이디, 비번이 일치하면 중복 로그인
}
}// 중복로그인이 아님
return false;
}//end ssesionToken()
private void insertUser(String id,String pw) {
System.out.println("insertUser()");
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
// PreparedStatement : 매개변수를 갖고 있는 SQL 문장을 활용하기 위한 클래스
// Statement와 상속관계
try {
// 2. Oracle JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 3. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
// 4. Connection 객체를 사용하여 PreparedStatement 객체를 생성
pstmt = conn.prepareStatement(CUST_INSERT);
// 5. SQL 문장 완성 - SQL_INSERT 쿼리의 ?를 채워주는 코드
pstmt.setString(1, textFieldId.getText());
pstmt.setString(2, textFieldPw.getText());
pstmt.setString(3, textFieldName.getText());
pstmt.setString(4, textFieldContact.getText());
// 중복 아이디 또는 비밀번호를 확인하기
if(sessionToken(id,pw)) {
System.out.println("중복된 아이디가 존재합니다.");
return; // 중복된 경우 삽입을 중단
}
// 6. SQL 문장 실행(DB 서버로 SQL 전송)
result = pstmt.executeUpdate();
// 7. DB 서버가 보낸 결과 확인/처리
System.out.println(result + "행이 삽입됐습니다.");
System.out.println("신규 등록 성공!");
// 신규 등록을 완료했다면 현재 창을 닫아준다.
dispose();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//return result; // 0 : 실패, 1 : 성공
}//end insertUser()
}//end UserCreate
로그인한 사용자의 상품 구매 페이지 userPage
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JScrollBar;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
public class UserPage extends JFrame implements OracleCustomerOuery{
// 로그인한 사용자의 상품 구매 페이지
private JPanel contentPane;
private JTextField textUserName;
private JTable table;
JTextField textID = new JTextField();
JTextField textPW = new JTextField();
// productDAOImple 싱글톤 객체 가져오기
private ProductDAO dao = ProductDAOImple.getInstance();
// UserPurchase 클래스로 전달할 선택한 상품 정보
static int selectedProductId;
static String selectedProductName;
static double selectedProductPrice;
static int selectedProductStock;
/* 스윙 테이블을 사용하기 위한 멤버 변수 선언 */
private String[] colNames = {"Id", "이름", "가격", "수량"}; // 테이블 헤더에 들어갈 이름들
private Object[] records = new Object[colNames.length]; // 테이블 데이터를 저장할 배열 객체
private DefaultTableModel tableModel; // 테이블 형태를 만들 모델 변수
public UserPage(String name) {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 517, 562);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("User_name : ");
lblNewLabel.setFont(new Font("굴림", Font.PLAIN, 15));
lblNewLabel.setBounds(24, 5, 101, 42);
contentPane.add(lblNewLabel);
textUserName = new JTextField();
textUserName.setBounds(118, 10, 137, 33);
contentPane.add(textUserName);
textUserName.setColumns(10);
textUserName.setText(name);
JLabel lblNewLabel_1 = new JLabel("상품 목록");
lblNewLabel_1.setFont(new Font("나눔고딕", Font.PLAIN, 21));
lblNewLabel_1.setBounds(200, 73, 101, 33);
contentPane.add(lblNewLabel_1);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(24, 116, 448, 272);
contentPane.add(scrollPane);
// 테이블 초기화
tableModel = new DefaultTableModel(colNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(tableModel);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int selectedRow = table.getSelectedRow(); // 선택된 행 인덱스 가져오기
selectedProductId = (int) tableModel.getValueAt(selectedRow, 0); // 선택된 행의 첫 번째 열(상품 ID) 값 가져오기
selectedProductName = (String) tableModel.getValueAt(selectedRow, 1); // 두 번째 열(상품 이름)
selectedProductPrice = (double) tableModel.getValueAt(selectedRow, 2); // 세 번째 열(상품 가격)
selectedProductStock = (int) tableModel.getValueAt(selectedRow, 3); // 네 번째 열(상품 수량)
// 상품을 클릭하면 UserPurchase 프레임으로 이동
UserPurchase purchase = new UserPurchase(selectedProductId,selectedProductName,selectedProductPrice,selectedProductStock); //선택한 상품 ID 값 가져와서
purchase.setVisible(true);
}
});
scrollPane.setViewportView(table);
// DB에서 상품목록을 가져와 DB에 표시하는 메서드
displayProdList();
JLabel lblNewLabel_2 = new JLabel("상품을 클릭해서 구매해주세요 ");
lblNewLabel_2.setFont(new Font("나눔고딕", Font.PLAIN, 15));
lblNewLabel_2.setBounds(146, 433, 203, 33);
contentPane.add(lblNewLabel_2);
JButton btnRefresh = new JButton("새로고침");
btnRefresh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
update();
}
});
btnRefresh.setBounds(347, 15, 97, 33);
contentPane.add(btnRefresh);
}
// DB에서 상품목록을 가져와 DB에 표시하는 메서드
private void displayProdList() {
System.out.println("displayProdList()");
// DB에서 상품목록을 가져오는 메서드 호출
ArrayList<ProductVO> list = dao.select();
// 가져온 상품 목록을 테이블에 표시
for(ProductVO prod : list) {
tableModel.addRow(new Object[] {
prod.getProductId(),
prod.getProductName(),
prod.getPrice(),
prod.getStock()
});
}
}//end displayProdList()
// 새로고침하는 메소드
private void update() {
ArrayList<ProductVO> list = dao.select();
int rowCount = tableModel.getRowCount(); // 현재 테이블의 행 수를 가져옴
// 테이블 초기화
for (int i = rowCount - 1; i >= 0; i--) {
tableModel.removeRow(i); // 기존 행 모두 삭제
}
// 새로운 데이터로 테이블에 행을 추가
for (ProductVO prod : list) {
tableModel.addRow(new Object[]{
prod.getProductId(),
prod.getProductName(),
prod.getPrice(),
prod.getStock()
});
}
}//end refresh()
}//end UserPage()
사용자의 상품구매 페이지 userPurchase
package Products;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.awt.event.ActionEvent;
public class UserPurchase extends JFrame {
private JPanel contentPane;
// productDAOImple 싱글톤 객체 가져오기
private ProductDAO dao = ProductDAOImple.getInstance();
// purchaseDAOImple 싱글톤 객체 가져오기
private PurchaseDAO pdao = PurchaseDAOImple.getInstance();
// UserPage 클래스의 인스턴스를 생성
UserPage user = new UserPage(getName());
private JTextField textField;
private JTextField textView;
private JTextField textInputStock;
public UserPurchase(int productId,String productName,double price,int stock) {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 509, 358);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("수량 선택 : ");
lblNewLabel.setBounds(46, 219, 93, 44);
lblNewLabel.setFont(new Font("나눔고딕", Font.PLAIN, 18));
contentPane.add(lblNewLabel);
textField = new JTextField();
textField.setFont(new Font("나눔고딕", Font.PLAIN, 18));
textField.setBounds(142, 219, 93, 44);
textField.setColumns(10);
JButton btnNewButton = new JButton("구매");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 빈 칸 & 숫자가 아닌 값을 입력했을 때, 예외처리
int inputStock;
try {
inputStock = Integer.parseInt(textInputStock.getText());
if(inputStock < 0) {
// 음수값을 입력한 경우
JOptionPane.showMessageDialog(null, "음수값은 입력할 수 없습니다.");
}
} catch (NumberFormatException e1) {
// 숫자가 아닌 값을 입력한 경우
JOptionPane.showMessageDialog(null, "수량은 숫자만 입력 가능합니다.");
return;
}
productUpdate();
purchaseInsert();
}
});
btnNewButton.setBounds(289, 211, 119, 57);
btnNewButton.setFont(new Font("나눔고딕", Font.PLAIN, 18));
contentPane.add(btnNewButton);
ProductVO productVO = dao.select(productId);
textView = new JTextField(productVO.toString());
textView.setFont(new Font("나눔고딕", Font.PLAIN, 12));
textView.setHorizontalAlignment(SwingConstants.CENTER);
textView.setBounds(12, 84, 469, 57);
contentPane.add(textView);
textView.setColumns(10);
JLabel lblNewLabel_1 = new JLabel("구매상품");
lblNewLabel_1.setFont(new Font("나눔고딕", Font.PLAIN, 18));
lblNewLabel_1.setBounds(207, 38, 93, 18);
contentPane.add(lblNewLabel_1);
textInputStock = new JTextField();
textInputStock.setBounds(137, 219, 116, 44);
contentPane.add(textInputStock);
textInputStock.setColumns(10);
}
//ProductDB -> update :
//사용자가 입력한 수량을 원래 상품 stock에서 빼고 업데이트
private void productUpdate() {
System.out.println("productUpdate()");
// stock 값을 입력 받음
int inputStock = Integer.parseInt(textInputStock.getText());
// 사용자가 입력한 수량이 상품의 재고량을 초과하는지 확인
if(inputStock > user.selectedProductStock) {
JOptionPane.showMessageDialog(null, "구매하려는 수량이 상품의 재고량을 초과합니다.");
return; // 구매를 중단하고 메서드를 종료
}
System.out.println("stock 값을 읽어옴");
if(inputStock > 0) {
// UserPage에서 선택한 ProductId에 해당되는 row 값을 가져옴
ProductVO vo = new ProductVO(user.selectedProductId, user.selectedProductName, user.selectedProductPrice, user.selectedProductStock - inputStock);
int result = dao.update(user.selectedProductId, vo);
System.out.println("update 완료!");
if(result == 1) {
System.out.println("상품 stockUpdate 완료");
} else {
System.out.println("상품 stockUpdate 실패");
}
}
}//end productUpdate()
// PurchaseDB -> insert
private void purchaseInsert() {
System.out.println("purchaseInsert()");
int result = 0;
// - 상품 정보 불러오기
UserLogin login = new UserLogin(); // UserPage 클래스의 인스턴스를 생성
String customerId = login.userId; //UserLogin에서 입력한 Id를 customerId으로 쓸 것
int productId = user.selectedProductId;
int inputStock = Integer.parseInt(textInputStock.getText());
if(inputStock > 0 && inputStock <= user.selectedProductStock) {
// PurchaseVO 클래스의 객체 생성
PurchaseVO vo = new PurchaseVO(0, customerId, productId, inputStock, null);
System.out.println("purchaseInsert 상품 정보 읽기 성공");
System.out.println("상품 등록 성공!");
// 현재 productVO에 저장된 상품의 수량보다 많은 상품의 수량을 구매하게 되면 제한을 걸어두기 -> inputStock 제한 두기
try {
result = pdao.insert(vo);
System.out.println("result = " + result);
if(result == 1) {
System.out.println("구매 정보 등록 완료!");
}
} catch (Exception e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
}
}else {
try {
inputStock = Integer.parseInt(textInputStock.getText());
} catch (NumberFormatException e1) {
// 숫자가 아닌 값을 입력한 경우
JOptionPane.showMessageDialog(null, "수량을 다시 입력해주세요.");
return;
}
//System.out.println("------ 수량을 다시 입력해주세요. ------");
}
}//end purchaseInsert()
}//end UserPurchase()
사이드 프로젝트 마감 소감 :
1. 명세서 완전 중요하구나!
ㅎㅎ초반에 설계를 잘 해야한다..
2. 기본기를 까먹은게 많은 걸 느낌
3. 당일 복습 정말 필요하구만
사이드 프로젝트 마감하고
오랜만에 깃헙에 올림!
혼자 처음 만든 프로젝트라
엄청엄청 귀함..
'백엔드 교육과정 > 3월' 카테고리의 다른 글
2024.03.20_ Web02 CSS / 이클립스 자바스크립트 설치 / Web03 javaScript (0) | 2024.03.21 |
---|---|
2024.03.19_ 신입 웹 개발자 로드맵 , HTTP/CSS (0) | 2024.03.19 |
2024.03.15 _ 사이드 프로젝트 발표 전 점검 (0) | 2024.03.15 |
2024.03.14_ 사이드 프로젝트 보완 (0) | 2024.03.15 |
2024.03.13 _ 중간피드백 이후 수정 내용 (0) | 2024.03.13 |