티스토리 뷰
- 오늘의 할 일 -
UserPase (사용자의 상품목록 페이지) -> Userpage에서 특정 상품을 클릭하면 가져오게 하기UserPurchase (사용자의 구매페이지) -> 수량을 입력하고 구매 버튼을 누르면 성공,실패가 콘솔에 떠야함UserPurchase (사용자의 구매페이지) -> purchaseInsert() 만들기 , productUpdate() 만들기- 클래스, 메서드, 변수 다시 공부 -> 글을 새로 써서
명세서 수정하기기능 보완 하기
최종 명세서 수정
사이드 프로젝트 명세서
<기간>
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)
UserPage(사용자의 상품목록 페이지) ->
상품 ID를 입력하는 시스템이 귀찮아서
클릭하면 UserPurchase 프레임으로 넘어가서
선택한 상품의 정보와
수량을 입력해서 구매할 수 있게 만들기
1. 테이블이 있는 코드에서 add event handler > mouse > mouseClicked
2. 선택된 행의 인덱스를 가져오기
int selectedRow = table.getSelectedRow(); // 선택된 행 인덱스 가져오기
3. 테이블에서 선택된 행의 상품 ID를 가져와서
selectedProductId = (int) tableModel.getValueAt(selectedRow, 0); // 선택된 행의 첫 번째 열(상품 ID) 값 가져오기
4. UserPurchase 프레임으로 보내주기
// 상품을 클릭하면 UserPurchase 프레임으로 이동
UserPurchase purchase = new UserPurchase(selectedProductId); //선택한 상품 ID 값 가져와서
purchase.setVisible(true);
5. UserPurchase에서 매개변수 설정
public UserPurchase(int productId) {
.
.
.
}
6. textField에 선택한 행의 정보들을 불러올거임
//dao 객체를 사용해서 productId에 해당하는 제품 정보를 DB에서 조회
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);
'dao' 를 통해 select(int productId) 메서드를 호출하는데, 이 메서드는 제품의 productId를 매개변수로
받아서 해당 제품을 조회하는 역할을 한다.
여기서 productId는 productVO 객체에 속해 있는 변수로 보인다.
따라서 이 코드에서 productId를 사용해 제품 정보를 조회할 때 productVO 객체에 있는
productId를 사용하는 것이다.
productVO 객체에는 제품 정보를 저장하는 변수들이 있음.
따라서 이 코드는 productId를 이용해 해당 제품 정보를 조회하고,
그 결과를 productVO 객체인 productVO에 저장하는 것
textField에 제품 전체 정보를 올리면
이렇게 출력이 됨
UserPurchase (사용자의 구매페이지) ->
purchaseInsert() 만들기 , productUpdate() 만들기
1. productUpdate 먼저 만들건데
ProductDAO 에서 새로운 메소드 등록하지 않고
update 메소드를 그대로 사용할 것.
따라서 ProductDAO, ProductDAOImple 은 건들지 않음.
2.UserPage의 테이블에서 선택한 행과 그 행의 열(상품Id, 상품이름,가격,수량) 을 가져올 것임!
수량까지 가져오는 이유는 update할 때 기존의 수량에서 새로 입력받은 수량을 감소할 것이기 때문에..
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);
}
});
int selectedRow = table.getSelectedRow(); > 코드는 사용자가 클릭한 행의 인덱스를 가져온다.
이를 통해 사용자가 어떤 상품을 선택했는지 파악한다.
그리고 tableModel.getValueAt(selectedRow, 0) > 과 같은 코드는 선택된 행의 각 열에 있는 값을 가져온다.
여기서는 첫 번째 열은 상품 ID, 두 번째 열은 상품 이름, 세 번째 열은 상품 가격, 네 번째 열은 상품 수량을 의미한다.
각 값을 적절한 변수에 할당하여 이후에 사용한다.
마지막으로
UserPurchase purchase = new UserPurchase(selectedProductId,selectedProductName,selectedProductPrice,selectedProductStock); >
이 코드는 사용자가 선택한 상품에 대한 정보를 이용하여 UserPurchase 클래스의 객체를 생성한다.
이후에 purchase.setVisible(true);를 호출하여 UserPurchase 프레임을 화면에 표시한다.
public UserPurchase(int productId,String id,double price,int stock) {
.
.
.
}
UserPurchase 클래스의 생성자는 다음과 같은 매개변수를 가진다 :
(productId: 구매할 상품의 ID
productName: 고객 이름
price: 상품의 가격
stock: 상품의 재고)
이 생성자는 사용자가 구매하려는 상품의 정보를 받아서 UserPurchase 객체를 생성할 때 사용된다.
이 정보는 후에 구매 프로세스에서 필요한 상품 정보로 사용된다.
//사용자가 입력한 수량을 원래 상품 stock에서 빼고 업데이트
private void productUpdate() {
// stock 값을 입력 받음
int inputStock = Integer.parseInt(textInputStock.getText());
System.out.println("stock 값을 읽어옴");
// 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()
크게 수정할 내용은 없어서...
user 객체는
// UserPage 클래스의 인스턴스를 생성
UserPage user = new UserPage(getName());
여기있음
1. purchaseInsert() 는
purchaseDAO에서 등록 메소드를 만들어야함
2. purchaseDAOImple 에서
싱글톤 디자인 패턴 코드 넣고
구매 내역을 저장할 배열을 넣기
// 싱글톤 디자인 패턴 적용
// 1. private static 자기 자신 타입의 멤버 변수
private static PurchaseDAOImple instance = null;
// 2. private 생성자
private PurchaseDAOImple() {}
// 3. public static 메소드 - 인스턴스를 리턴하는 메소드 구현
public static PurchaseDAOImple getInstance() {
if(instance == null) {
instance = new PurchaseDAOImple();
}
return instance;
}
private ArrayList<PurchaseVO> list = new ArrayList<>(); // 구매 내역를 저장할 배열
3. 중요한 포인트.. 나중에 에러 찾을 때 필요한 로그 찍기!!
다음 프로젝트 할 때 꼭 해보기
SQL 변수명도 Purchase 쿼리랑 같은지 한 번 확인해보고
PurchaseDAOImple인데
4 개의 ' ? ' 매개변수가 있으므로
이 쿼리를 실행할때는 4개의 매개변수를 채워줘야 한다.
그런데 나는 여기다
pstmt.setDate(null);
이런 걸 넣어버린거임...
그냥 sysdate 가 있으면
DB 시스템의 현재 날짜와 시간을 자동으로 삽입하는 함수여서
안넣어줘도 되는데 넣어서 에러 발생...
4. 이제 UserPurchase의 purchaseInsert() 메소드를 내용을
채우면 된다.
순서는 상품정보를 불러오고
purchaseVO 클래스의 객체를 생성해서 등록하면된다.
이 프레임에는 상품정보를 입력받지 않아서
UserPage에서 productId를 가져오고
customerName 보다는 customerId 를 PK로 지정해서
사용자 아이디를 UserLogin에서 가져오기로 했다.
클래스의 정적(static) 멤버 변수를 선언했다.
userId 라는 변수는 클래스의 모든 인스턴스가 공유하는 변수로써,
클래스의 모든 인스턴스에서 동일한 값을 가지게 된다.
사용자가 입력한 ID와 PW를 가져와서
textID와 textPW 텍스트 필드에서 가져온 값을 저장했다.
그런 다음, UserPurchase 클래스에서 사용할 수 있도록
userId라는 정적(static) 변수에 해당 ID를 할당했다.
따라서 UserPurchase 클래스에서는
이 userId 변수를 사용하여 사용자의 ID에 접근할 수 있게되었다.
purchaseInsert() 메소드의 상품 정보 불러오기에서 이렇게 사용했음
// PurchaseDB -> insert
private void 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());
System.out.println("customerId = " + customerId);
System.out.println("purchaseInsert 상품 정보 읽기 성공");
// PurchaseVO 클래스의 객체 생성
PurchaseVO vo = new PurchaseVO(0, customerId, productId, inputStock, null);
System.out.println("상품 등록 성공!");
try {
result = pdao.insert(vo);
System.out.println("result = " + result);
if(result == 1) {
System.out.println("구매 정보 등록 완료!");
}
} catch (Exception e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스 출력
}
}//end purchaseInsert()
실행해보기
Id와 Pw는 오라클 계정의 사용자 이름과 비밀번호와 같게 설정함.
사용자가 입력한 ID와 비밀번호가
오라클 계정의 사용자 이름과 비밀번호와 일치하면, 사용자를 관리자로 인식하고
로그인 한다.
암튼 현재 상품 목록은
문제의 id = 1516번의 망고스틴을 구매해보겠음
상품을 클릭해보겠다
5개 구매 ㄱㄱ
오류가 발생함..
이렇게 해놓고 시퀀스 설정을 안해놨음
그래서
시퀀스 생성하고
? 여기 매개변수를 DAOImple에서 넣을 때
첫번째가 시퀀스를 쓰고 그런다고 해서 2부터 시작하는게 아니었다.
수정하니깐 제대로 넣어짐!
DB 들어가면 잘 보입니다..
이제 이 정보를 회원 상세 정보 조회에 넣으면,,,ㅎ 되는데...
지금 오류 좀 수정하고
시간이 남는다면 할게요
문제점 :
1) adminPage - 상품 등록 시
상품 ID(int) 가 중복이면 안된다
2) UserPurchase - 사용자의 구매페이지
입력한 상품의 수량(InputStock)이 현재 등록된 상품의 수량(stock)보다 작거나 같아야지 구매할 수 있도록한다.
현재 수량이 1개인데 사용자가 100개를 구매하게 두면 에러 남
음수(-) 개를 입력하면?
이것도 통과!
3) PurchaseDB - 시퀀스를 이용했는데 내용이 잘 들어가는지 확인
잘 들어가긴 하는데 Purchase_id 가 뭐람?
4) UserCreate - 사용자의 신규 로그인 등록
사용자가 신규 등록을 할 때, 아이디와 비밀번호가 같지 않도록 제한을 걸어둔다
중복 아이디 처리
현재 고객 리스트이고
Id : abcd 로 신규 등록 해보겠음
5) UserPage - 사용자가 구매페이지에서 상품을 구매하면
UserPage(상품목록) 페이지에서도 연동되는지
아아
'백엔드 교육과정 > 3월' 카테고리의 다른 글
2024.03.19_ 신입 웹 개발자 로드맵 , HTTP/CSS (0) | 2024.03.19 |
---|---|
2024.03.18_ 사이드 프로젝트 발표, 배포 방법 (0) | 2024.03.18 |
2024.03.14_ 사이드 프로젝트 보완 (0) | 2024.03.15 |
2024.03.13 _ 중간피드백 이후 수정 내용 (0) | 2024.03.13 |
2024.03.11_사이드 프로젝트_백엔드 부분 (0) | 2024.03.12 |