예전에 JAVA 공부 초기에 JAVA GUI 툴인 Window Builder 알게 되었고, 써보기 위해 공부를 하기 시작하였습니다.
WindowBuilder 사용하여 GUI를 만들면 대부분 WindowBuilder가 자동으로 소스코드를 작성합니다.
공부 초기에 만든 프로그램이어서, 각 class 파일 마다 패키지를 만들어서 연결을 하였고,
데이터베이스는 MariaDB 를 사용하였고, HeidiSQL 을 사용하여 데이터베이스를 관리하였습니다.
Login DTO
package LoginData_p;
public class LoginData {
private String ID,Password;
public LoginData() {}
public LoginData(String ID, String Password){
this.ID = ID;
this.Password = Password;
}
public LoginData(String ID){
this.ID = ID;
}
public String GetID(){
return ID;
}
public void SetID(String Password){
this.Password = Password;
}
public String GetPassword(){
return Password;
}
public void SetPasswordD(String Password){
this.Password = Password;
}
}
Login DAO
package LoginDB_p;
import java.sql.*;
import LoginData_p.LoginData;
public class LoginDB {
private Connection conn = null;
private ResultSet rs = null;
private Statement st = null;
private PreparedStatement ps = null;
int count = 0;
public LoginDB() { // 생성자로 데이터베이스 연결
final String url = "jdbc:mariadb://localhost:3306/bookdb";
final String id = "root";
final String pw = "1234";
try{
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pw);
}catch(ClassNotFoundException cnfe) {
System.out.println("DB 드라이버 로딩 실패:"+ cnfe.toString());
}catch(SQLException sqle){
System.out.println("DB 접속실패"+ sqle.toString());
}catch(Exception e){
System.out.println("Unkown error");
e.printStackTrace();
}
}
public void DBClose(){ // 커넥션 연결 종료
try{
if(rs != null) rs.close();
if(st != null) st.close();
if(ps != null) ps.close();
}catch(Exception e) { System.out.println(e + "=> DBClose 실패");}
}
DB 연결 부분을 생성자로 구현하여, 클래스 객체 생성시 DB와 연결합니다.
//회원 정보 저장
public void InsertLogin(LoginData logindata){
String sql = "insert into login_management values(?, ?, ?)";
try{
ps = conn.prepareStatement(sql);
st = conn.createStatement();
rs = st.executeQuery("Select * From login_management order by position*1");
while(rs.next())
{
int Number1 = rs.getInt("position");
if(Number1 == count) count++;
}
ps.setInt(1, count);
ps.setString(2, logindata.GetID());
ps.setString(3, logindata.GetPassword());
ps.executeUpdate();
count++;
}catch(SQLException e)
{
e.printStackTrace();
}finally
{
DBClose();
}
}
회원정보번호가 중복되지 않게 전역변수로 count 만들고, DB의 position(회원정보번호)를 가져와 Number1 변수에 저장하여 count와 비교해 값을 증가 시킨다. 마지막 while 루프를 돌게되면 count 값은 position 보다 1 이 증가한 값이 되게 됩니다.
//회원정보 삭제
public void Delete(String ID){ // login_management table -> Login ID data delete
String sql = "Delete from login_management where ID =?";
try{
ps = conn.prepareStatement(sql);
ps.setString(1, ID);
ps.executeUpdate();
}catch(SQLException e)
{
e.printStackTrace();
} finally
{
DBClose();
}
}
// ID, Password 확인 즉, 로그인 시도 시 회원 확인
public int LoginTry(LoginData logindata){ // login_management table -> Login ID, Password Confirm
String sql = "select * from login_management where ID = ? and Password = ?";
try{
ps = conn.prepareStatement(sql);
ps.setString(1, logindata.GetID());
ps.setString(2, logindata.GetPassword());
rs = ps.executeQuery();
if(rs.next())
{
return 1;
}
}catch(Exception e)
{
e.printStackTrace();
}
return -1;
}
GUI에서 입력한 ID, Password가 DB에 있는지 확인하는 메소드이다. 성공 시 1을 리턴하고, 실패시 -1을 리턴합니다.
// 도서대여시 회원아이디 확인
public int LoginOX(LoginData logindata){ // login_management table -> Login ID Confirm
String sql = "select * from login_management where ID = ?";
try{
ps = conn.prepareStatement(sql);
ps.setString(1, logindata.GetID());
rs = ps.executeQuery();
if(rs.next())
{
return 1;
}
}catch(Exception e)
{
e.printStackTrace();
}
return -1;
}
도서를 대여할 때 대여하는 회원의 ID가 login DB에 있는지 확인 하는 메소드이며, 성공 시 1을 리턴하고, 실패시 -1을 리턴합니다.
Login WindowBuilder
package Login_WindowBuilder;
import java.awt.EventQueue;
import java.awt.Font;
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.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import LoginDB_p.LoginDB;
import LoginData_p.LoginData;
import WindowBuilder_p.WindowBuilder;
import java.awt.Color;
public class WindowBuilder_Login {
private JFrame frame;
private JTextField IDtext;
private JPasswordField passwordtext;
LoginDB db = new LoginDB();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
WindowBuilder_Login window = new WindowBuilder_Login();
window.frame.setVisible(true);
window.frame.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public WindowBuilder_Login()
{
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 401, 346);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setBounds(0, 0, 385, 307);
frame.getContentPane().add(panel);
panel.setLayout(null);
JLabel IDLabel = new JLabel("ID : ");
IDLabel.setBounds(71, 122, 66, 33);
IDLabel.setHorizontalAlignment(SwingConstants.CENTER);
IDLabel.setFont(new Font("맑은 고딕", Font.BOLD, 18));
panel.add(IDLabel);
JLabel PassWordLabel = new JLabel("PW : ");
PassWordLabel.setBounds(71, 173, 66, 29);
PassWordLabel.setHorizontalAlignment(SwingConstants.CENTER);
PassWordLabel.setFont(new Font("맑은 고딕", Font.BOLD, 18));
panel.add(PassWordLabel);
IDtext = new JTextField();
IDtext.setBounds(149, 125, 145, 33);
IDtext.setToolTipText("ID 입력");
panel.add(IDtext);
IDtext.setColumns(10);
passwordtext = new JPasswordField();
passwordtext.setBounds(149, 172, 145, 33);
passwordtext.setToolTipText("PassWord 입력");
panel.add(passwordtext);
JLabel lblNewLabel = new JLabel("로그인 창");
lblNewLabel.setBounds(12, 10, 361, 81);
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setFont(new Font("돋움체", Font.BOLD, 30));
panel.add(lblNewLabel);
JButton Loginbutton = new JButton("로그인");
Loginbutton.setBackground(Color.WHITE);
Loginbutton.setBounds(71, 243, 111, 47);
Loginbutton.addActionListener(new ActionListener() { // 로그인 버튼 클릭 시 동작
public void actionPerformed(ActionEvent arg0) {
String ID = IDtext.getText();
char[] PS1 = passwordtext.getPassword();
String PS = String.valueOf(PS1);
int s = db.LoginTry(new LoginData(ID,PS));
System.out.println(s);
if(s == 1) {
JOptionPane.showMessageDialog(null, "로그인 성공");
frame.dispose(); // 로그인 GUI 창 종료
WindowBuilder window = new WindowBuilder(); // 도서관리 GUI 실행
window.frame.setVisible(true); // 도서관리 GUI 화면 나타남
window.frame.setResizable(false); // GUI 창 크기 조절 불가능
} else JOptionPane.showMessageDialog(null, "로그인 실패");
}
});
Loginbutton.setFont(new Font("맑은 고딕", Font.PLAIN, 15));
panel.add(Loginbutton);
JButton button = new JButton("회원 가입");
button.setBackground(Color.WHITE);
button.setBounds(211, 243, 111, 47);
button.addActionListener(new ActionListener() { // 회원 가입 버튼 클릭 시 동작
public void actionPerformed(ActionEvent e) {
String ID = IDtext.getText();
char[] PS1 = passwordtext.getPassword();
String PS = String.valueOf(PS1);
System.out.println();
System.out.println(passwordtext.getPassword());
if(ID.length() != 0 && PS.length() != 0){
db.InsertLogin(new LoginData(ID, PS));
IDtext.setText(""); passwordtext.setText("");
JOptionPane.showMessageDialog(null, "등록 완료");
}else JOptionPane.showMessageDialog(null, "ID , PW 입력 바람.");
}
});
button.setFont(new Font("맑은 고딕", Font.PLAIN, 15));
panel.add(button);
}
}
실행 화면
로그인 성공 팝업에서 확인 버튼을 누르면 다른 GUI가 뜨게 됩니다.
도서관리 프로그램은 Part 2. 도서관리에서 설명하도록 하겠습니다.
Part 2. 도서관리 바로가기
Part 3. 대여프로그램 바로가기
전체 소스코드 바로가기
'Java > 도서관리 프로그램' 카테고리의 다른 글
도서관리 프로그램 Part 3. 대여프로그램 (0) | 2022.07.28 |
---|---|
도서관리 프로그램 Part 2. 도서관리 (0) | 2022.07.28 |