티스토리 뷰
오늘의 할 일
구매테이블, 고객테이블 생성하고 VO 수정할 것
Strat 페이지 만들고 디자인하기
+ 기본적인 CRUD 말고 추가적인 기능 생성하기
명세서
테이블명 : 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 : 고객의 연락처 정보
모든 DB테이블 생성 완료!
VO 수정하기
DB 테이블 명세서와 비교하면서 멤버변수 생성
기본 생성자, 매개변수 생성자, getter/setter , toString() 생성하기
Query 작성하기
테이블에서 NUMBER 로 타입을 지정한 애들은(PRODUCT_ID,PRICE,STOCK) int로 바꿔야하나 했지만
그렇게 하면 오류가 났음
그래서 다시 String으로 바꿈
Java에서는 int 타입은 숫자를 저장하기 위한 데이터 형식입니다.
따라서 Java에서는 int로 정의된 변수에 문자열을 할당할 수 없습니다.
따라서 테이블의 PRODUCT_ID가 NUMBER 타입이라도 Java에서는 해당 변수를 int로 정의하면 문자열을 할당할 수 없는 타입 불일치 오류가 발생합니다.
기능을 추가하기 전에 기본적인 CRUD(Create Read Update Delete) 기능을 넣은 sql_query 작성
package Products;
public interface OracleProductQuery {
// Oracle DB 정보 인터페이스. DB 연결을 위한 상수. 사용자 정보
// 테이블 및 컬럼 정보. 쿼리 작성
// 사용자 정보
public static final String URL =
"jdbc:oracle:thin:@localhost:1521:xe"; // 접속할 오라클 DB 경로
public static final String USER = "scott";
public static final String PASSWORD = "tiger";
// DB 연결을 위한 상수
public static final String TABLE_NAME = "PRODUCTS";
public static final String COL_PRODUCT_ID = "PRODUCT_ID";
public static final String COL_PRODUCTNAME = "PRODUCTNAME";
public static final String COL_PRICE = "PRICE";
public static final String COL_STOCK = "STOCK";
// 테이블 및 컬럼 정보. 쿼리 작성
//INSERT
public static final String SQL_INSERT =
"INSERT INTO " + TABLE_NAME
+ " VALUES (?, ?, ?, ?)";
//SELECT_ALL
public static final String SQL_SELECT =
"SELECT * FROM " + TABLE_NAME
+ " ORDER BY " + COL_PRODUCT_ID;
//SELECT_BY_CONTACT_Id
public static final String SQL_SELECT_BY_CONTACT_ID =
"SELECT * FROM " + TABLE_NAME
+ " WHERE " + COL_PRODUCT_ID + " = ?";
//UPDATE
public static final String SQL_UPDATE =
"UPDATE " + TABLE_NAME + " SET " +
COL_PRODUCTNAME + " = ?, " +
COL_PRICE + " = ?, " +
COL_STOCK + " = ? " +
"WHERE " + COL_PRODUCT_ID + " = ?";
// DELETE
public static final String SQL_DELETE =
"DELETE " + TABLE_NAME + " WHERE "
+ COL_PRODUCT_ID + " = ?";
}
package Products;
public interface OraclePurchaseQuery {
// 사용자 정보
public static final String URL =
"jdbc:oracle:thin:@localhost:1521:xe"; // 접속할 오라클 DB 경로
public static final String USER = "scott";
public static final String PASSWORD = "tiger";
// DB 연결을 위한 상수
public static final String TABLE_NAME = "PURCHASES";
public static final String COL_PURCHASE_ID = "PURCHASE_ID";
public static final String COL_CUSTOMER_ID = "CUSTOMER_ID";
public static final String COL_PRODUCT_ID = "PRODUCT_ID";
public static final String COL_STOCK = "STOCK";
public static final String COL_PURCHASE_DATE = "PURCHASE_DATE";
// 테이블 및 컬럼 정보. 쿼리 작성
// INSERT : 구매한 상품의 가격 및 수량 정보를 DB에 기록하는 기능
public static final String SQL_INSERT =
"INSERT INTO " + TABLE_NAME
+ " VALUES (?, ?, ?, ?, sysdate)";
// SELECT_ALL : 상품 전체 조회
public static final String SQL_SELECT =
"SELECT * FROM " + TABLE_NAME
+ " ORDER BY " + COL_PRODUCT_ID;
// SELECT_BY_PRODUCT_ID
public static final String SQL_SELECT_BY_CONTACT_ID =
"SELECT * FROM " + TABLE_NAME
+ " WHERE " + COL_PRODUCT_ID + " = ?";
//UPDATE : 구매 시 재고 수량을 감소시키는 기능
public static final String SQL_UPDATE =
"UPDATE " + TABLE_NAME + " SET " +
COL_PURCHASE_ID + " = ?, " +
COL_CUSTOMER_ID + " = ?, " +
COL_PRODUCT_ID + " = ?," +
COL_STOCK + " = ? " +
COL_PURCHASE_DATE + " = sysdate" +
"WHERE " + COL_PURCHASE_ID + " = ?";
// DELETE
public static final String SQL_DELETE =
"DELETE " + TABLE_NAME + " WHERE "
+ COL_PURCHASE_ID + " = ?";
}
package Products;
public interface OracleCustomerOuery {
// 사용자 정보
public static final String URL =
"jdbc:oracle:thin:@localhost:1521:xe"; // 접속할 오라클 DB 경로
public static final String USER = "scott";
public static final String PASSWORD = "tiger";
// DB 연결을 위한 상수
public static final String TABLE_NAME = "CUSTOMERS";
public static final String COL_CUSTOMER_ID = "CUSTOMER_ID";
public static final String COL_PASSWORD = "PASSWORD";
public static final String COL_CUSTOMER_NAME = "CUSTOMER_NAME";
public static final String COL_CONTACT = "CONTACT";
// 테이블 및 컬럼 정보. 쿼리 작성
// INSERT : 구매한 상품의 가격 및 수량 정보를 DB에 기록하는 기능
public static final String SQL_INSERT =
"INSERT INTO " + TABLE_NAME
+ " VALUES (?, ?, ?, ?)";
// SELECT_ALL : 상품 전체 조회
public static final String SQL_SELECT =
"SELECT * FROM " + TABLE_NAME
+ " ORDER BY " + COL_CUSTOMER_ID;
// SELECT_BY_PRODUCT_ID
public static final String SQL_SELECT_BY_CONTACT_ID =
"SELECT * FROM " + TABLE_NAME
+ " WHERE " + COL_CUSTOMER_ID + " = ?";
//UPDATE : 구매 시 재고 수량을 감소시키는 기능
public static final String SQL_UPDATE =
"UPDATE " + TABLE_NAME + " SET " +
COL_CUSTOMER_ID + " = ?, " +
COL_PASSWORD + " = ?, " +
COL_CUSTOMER_NAME + " = ?," +
COL_CONTACT + " = ? " +
"WHERE " + COL_CUSTOMER_ID + " = ?";
// DELETE
public static final String SQL_DELETE =
"DELETE " + TABLE_NAME + " WHERE "
+ COL_CUSTOMER_ID + " = ?";
}
DB 연결하기
- 프로젝트 > 우클릭 > Build Path > External Achives > ojbc6
ProductDAOImple 을 볼 것
- 싱글톤 기능 넣기
ProductMain
private static ProductDAO dao;는 메인 클래스에 선언된 멤버 변수
여기서 ProductDAO는 인터페이스를 가리키며,
이 인터페이스는 데이터 액세스 객체(Data Access Object)에 대한 일반적인 메소드를 정의한다
Strat 페이지 만들고 디자인하기
Main 에서 생성함
선택 버튼을 누르면 textField에 관리자를 선택했는지 사용자를 선택했는지 입력해주고
새로운 page.. frame이 나오도록 한다.
MyFrame MyFrame = new MyFrame(); =>
MyFrame 클래스의 새로운 인스턴스를 생성한다. 이 인스턴스를 MyFrame 변수에 할당한다.
* 클래스 이름과 변수 이름은 다르게 지정하는 것이 좋다.
MyFrame.setVisible(true); =>
생성된 MyFrame 인스턴스의 setVisible(true) 메서드를 호출하여
해당 프레임을 화면에 표시한다.
이렇게 함으로써 사용자가 프레임을 볼 수 있게 된다!
아이디와 비밀번호를 입력하고 로그인을 누르면
새로운 페이지로 나가게 하면 되는데...
로그인을 누르면 adminLogin() 메소드로 가게 만들었다.
관리자는 어차피 한 명으로 설정해서
아이디랑 비밀번호를 DB 테이블 아이디랑 비밀번호랑 같게 설정함
Product 쿼리를 implements하고
USER = ID , PASSWORD = PW 로 사용함
여기서 새로운 페이지를 생성하려고 했는데...
같은 게 두개나 나와버린 것이다!
MyFrame과 adminPage은 동일한 MyFrame 클래스의 인스턴스를 생성하게 됩니다.
이것은 자바에서 클래스의 인스턴스를 만들 때 그 클래스의 객체를 생성하는 것이므로
두 인스턴스는 동일한 클래스에 해당하는 GUI를 가지게 됩니다.
GPT 선생님은 이렇게 말했다.. 아직 이해가 부족한 나는
동일한 붕어빵 틀로 만들어서 두 결과물 붕어빵들이 같은 디자인으로 나온 것 같다고 밖에 이해 못하겠음
네, 맞습니다. 사용하는 클래스가 동일하다면 그 클래스의 인스턴스들은 같은 디자인(혹은 틀)을 가집니다.
마치 동일한 붕어빵 틀로 만든 두 개의 붕어빵이 같은 디자인을 가지는 것과 같습니다.
선생님이 다행히도 맞다고 하시네요.. 즉, MyFrame과 AdminPage 모두 MyFrame 클래스의 인스턴스를 생성하는 경우,
두 프레임은 동일한 클래스의 GUI를 가지게 되어 저런 현상이 일어난 것...
사실... 다른 프레임 뜯어와서 다 고친다고 저렇게 난리난거임ㅎ
그냥 새로 하나 만드는게 낫다
그냥 원래 있던 거 삭제하고.. 새로 만들었음 ..^^
// adminPage 클래스의 인스턴스 생성
adminPage admin = new adminPage();
admin.setVisible(true);
먼저 생성하면 해당 클래스가 없어서
에러가 뜰거임
그럼
New > Other > JFrame 선택하고 Next
알아서 상속받음
* 만들고 나서는 main 은 없애주기
하나의 패키지에 두 가지 main은 존재할 수 없다
GUI 구성해주고
실행하면
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 java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class UserLogin extends JFrame {
private JPanel contentPane;
private JTextField textID;
private JTextField textPW;
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) {
// 로그인을 누르고 아이디와 비밀번호가 맞다면?
// 상품 구매목록창에 들어갈 수 있게 한다
}
});
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);
}
}
또 UserCreate 생성함 !
디자인 대로 생성 완료 !
다음은 디자인 된 부분들을 연결하기로...
'백엔드 교육과정 > 3월' 카테고리의 다른 글
2024.03.13 _ 중간피드백 이후 수정 내용 (0) | 2024.03.13 |
---|---|
2024.03.11_사이드 프로젝트_백엔드 부분 (0) | 2024.03.12 |
사이드 프로젝트 보강 (0) | 2024.03.06 |
2024.03.06_ 상품 관리, 구매 프로그램 (0) | 2024.03.06 |
사이드 프로젝트 명세서 작성하기 , MVC 구조 필기 (0) | 2024.03.05 |