본문 바로가기
Spring-Java/JDBC

Day22_Banking 예제 2

by 현대타운301 2023. 9. 12.

2023.09.12

 

DB TABLES

 

* user : ICIA

 

/*
    ACCOUNT A
    CLIENT  B
    ACODE   C
*/

-- 먼저 초기화 진행
DROP TABLE ACCOUNT;
DROP TABLE ACODE;   
DROP TABLE CLIENT;


CREATE TABLE CLIENT(
    CNUM    NUMBER UNIQUE,
    CID     NVARCHAR2(50) PRIMARY KEY,
    CPW     NVARCHAR2(50),
    CNAME   NVARCHAR2(50),
    CPHONE  NVARCHAR2(50),
    CADDR   NVARCHAR2(50)
);

CREATE TABLE ACODE(
    CODENUM     NUMBER PRIMARY KEY,
    CODENAME    NVARCHAR2(10)
);

INSERT INTO ACODE VALUES(1, '일반');
INSERT INTO ACODE VALUES(2, '청약');
INSERT INTO ACODE VALUES(3, '주식');
INSERT INTO ACODE VALUES(4, '적금');

CREATE TABLE ACCOUNT(
    CACCOUNT    NVARCHAR2(50) PRIMARY KEY,
    CID         NVARCHAR2(50),
    CODENUM     NUMBER,
    BALANCE     NUMBER,
    CONSTRAINT FK_CID FOREIGN KEY (CID) REFERENCES CLIENT(CID),
    CONSTRAINT FK_CODENUM FOREIGN KEY (CODENUM) REFERENCES ACODE(CODENUM)
);

COMMIT;

 


 

Java Project / Package / Class 구성

 

 


 

BankDTO package

 

Account

package BankDTO;

public class Account {
    // 1. 필드
    private String cAccount;    // primary
    private String cId;         // foreign key
    private int codeNum;        // foreign key
    private int balance;

    // 2. 생성자 : default

    // 3. 메소드
    public String getcAccount() {
        return cAccount;
    }

    public void setcAccount(String cAccount) {
        this.cAccount = cAccount;
    }

    public String getcId() {
        return cId;
    }

    public void setcId(String cId) {
        this.cId = cId;
    }

    public int getcodeNum() {
        return codeNum;
    }

    public void setcodeNum(int codeNum) {
        this.codeNum = codeNum;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "cAccount='" + cAccount + '\'' +
                ", cId='" + cId + '\'' +
                ", codeNum=" + codeNum +
                ", balance=" + balance +
                '}';
    }
}

 

 

Acode

package BankDTO;

public class Acode {

    // 1. 필드
    private int codeNum;        // primary
    private String codeName;

    // 2. 생성자 : default

    // 3. 메소드
    public int getCodeNum() {
        return codeNum;
    }

    public void setCodeNum(int codeNum) {
        this.codeNum = codeNum;
    }

    public String getCodeName() {
        return codeName;
    }

    public void setCodeName(String codeName) {
        this.codeName = codeName;
    }

    @Override
    public String toString() {
        return "Acode{" +
                "codeNum=" + codeNum +
                ", codeName='" + codeName + '\'' +
                '}';
    }
}

 

 

Client

package BankDTO;

public class Client {

    // 1. 필드
    private int cNum;       // unique
    private String cId;     // primary
    private String cPw;
    private String cName;
    private String cPhone;
    private String cAddr;

    // 2. 생성자 : default

    // 3. 메소드
    public int getcNum() {
        return cNum;
    }

    public void setcNum(int cNum) {
        this.cNum = cNum;
    }

    public String getcId() {
        return cId;
    }

    public void setcId(String cId) {
        this.cId = cId;
    }

    public String getcPw() {
        return cPw;
    }

    public void setcPw(String cPw) {
        this.cPw = cPw;
    }

    public String getcName() {
        return cName;
    }

    public void setcName(String cName) {
        this.cName = cName;
    }

    public String getcPhone() {
        return cPhone;
    }

    public void setcPhone(String cPhone) {
        this.cPhone = cPhone;
    }

    public String getcAddr() {
        return cAddr;
    }

    public void setcAddr(String cAddr) {
        this.cAddr = cAddr;
    }

    @Override
    public String toString() {
        return "Client{" +
                "cNum=" + cNum +
                ", cId='" + cId + '\'' +
                ", cPw='" + cPw + '\'' +
                ", cName='" + cName + '\'' +
                ", cPhone='" + cPhone + '\'' +
                ", cAddr='" + cAddr + '\'' +
                '}';
    }
}

 


 

BankDAO package

 

DBConnection

package BankDAO;

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

public class DBConnection {
    public static Connection DBConnect(){
        Connection con = null;

        String user = "ICIA";
        String password = "1111";
        String url = "jdbc:oracle:thin:@localhost:1521:xe";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(url, user, password);
            System.out.println("DB 접속 성공!");
        } catch (ClassNotFoundException | SQLException e) {
            System.out.println("DB 접속 실패...");
            throw new RuntimeException(e);
        }
        return con;
    }
}

 

 

BankSQL

package BankDAO;

import BankDTO.Account;
import BankDTO.Client;

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

public class BankSQL {
    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;

    // 1. DB 접속 메소드
    public void connect() {
        con = DBConnection.DBConnect();
    }

    // 2. DB 해제 메소드
    public void conClose() {
        try {
            con.close();
            System.out.println("DB 접속 해제!");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 3-1. 회원번호 생성
    public int clientNum() {
        int cNum = 0;
        String sql = "SELECT MAX(CNUM) FROM CLIENT";
        try {
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                cNum += rs.getInt(1) + 1;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return cNum;
    }

    // 3-2. 회원가입 메소드
    public void joinClient(Client client) {
        String sql = "INSERT INTO CLIENT VALUES(?,?,?,?,?,?)";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, client.getcNum());
            pstmt.setString(2, client.getcId());
            pstmt.setString(3, client.getcPw());
            pstmt.setString(4, client.getcName());
            pstmt.setString(5, client.getcPhone());
            pstmt.setString(6, client.getcAddr());
            int result = pstmt.executeUpdate();
            if (result > 0) {
                System.out.printf("%s 님, 회원가입을 축하합니다!", client.getcName());
            } else {
                System.out.println("회원가입 실패...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 4. 로그인 메소드
    public boolean login(String inputId, String inputPw) {
        boolean loginResult = false;
        boolean IdResult = false;
        boolean PwResult = false;
        String sql = "SELECT CID FROM CLIENT WHERE CPW = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, inputPw);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                IdResult = true;
            }
            sql = "SELECT CPW FROM CLIENT WHERE CID = ?";
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, inputId);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                PwResult = true;
            }
            if (IdResult && PwResult) {
                sql = "SELECT CNAME FROM CLIENT WHERE CID = ? AND CPW = ?";
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1, inputId);
                pstmt.setString(2, inputPw);
                rs = pstmt.executeQuery();
                while (rs.next()) {
                    System.out.println("로그인 성공!");
                    System.out.println(rs.getString(1) + " 님, 어서오세요!");
                    loginResult = true;
                }
            } else {
                System.out.println("로그인 실패...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return loginResult;
    }

    // 5-1. 계좌번호 생성 메소드
    public String addAccount() {
        String newAccount = "110-";
        for (int i = 0; i < 3; i++) {
            int account1 = (int) ((Math.random() * 9) + 1);
            newAccount += account1;
        }
        newAccount += "-";

        for (int i = 0; i < 6; i++) {
            int account2 = (int) ((Math.random() * 9) + 1);
            newAccount += account2;
        }
        return newAccount;
    }

    // 5-2. 계좌생성 메소드
    public void createAccount(Account acc) {
        String sql = "INSERT INTO ACCOUNT VALUES(?,?,?,?)";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, acc.getcAccount());
            pstmt.setString(2, acc.getcId());
            pstmt.setInt(3, acc.getcodeNum());
            pstmt.setInt(4, acc.getBalance());
            int result = pstmt.executeUpdate();

            if (result < 0) {
                System.out.println("계좌 생성 실패...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    // 5-3. 계좌정보 출력 메소드
    public void accountInfo(String newAccount) {
        String sql = "SELECT C.CODENAME, A.BALANCE FROM ACCOUNT A, ACODE C" +
                " WHERE A.CODENUM = C.CODENUM AND A.CACCOUNT = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, newAccount);
            rs = pstmt.executeQuery();
                while (rs.next()) {
                    System.out.printf("[%s]계좌 생성 완료!\n초기잔액 : %,d원\n", rs.getString(1), rs.getInt(2));
                }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    // 5-4. 계좌 개수 카운트 메소드
    public int countAccount(String loginId) {
        int count = 0;
        String sql = "SELECT COUNT(*) FROM ACCOUNT WHERE CID = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, loginId);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                count = rs.getInt(1);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return count;
    }

    // 6. 계좌 목록 조회 메소드
    public void selectClient(String loginId) {
        String sql = "SELECT C.CODENAME, CACCOUNT, BALANCE FROM ACCOUNT A, ACODE C" +
                " WHERE A.CODENUM = C.CODENUM AND A.CID = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, loginId);
            rs = pstmt.executeQuery();
            System.out.println("계좌종류\t\t계좌번호\t\t\t\t잔액");
            while (rs.next()) {
                System.out.printf("[%s]\t\t%s\t\t%,d원\n", rs.getString(1), rs.getString(2), rs.getInt(3));
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 7-1. 계좌 조회 메소드
    public boolean checkAccount(String cAccount) {
        boolean check = false;
        String sql = "SELECT * FROM ACCOUNT WHERE CACCOUNT = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, cAccount);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                check = true;
            } else {
                System.out.println("조회할 수 없는 계좌입니다...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return check;
    }
    // 7-2. 입금 메소드
    public void deposit(String cAccount, int money) {
        String sql = "UPDATE ACCOUNT SET BALANCE = BALANCE + ? WHERE CACCOUNT = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, money);
            pstmt.setString(2, cAccount);
            int result = pstmt.executeUpdate();

            if (result > 0) {
                System.out.println("입금 성공!");
            } else {
                System.out.println("입금 실패...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 8-1. 잔액조회 메소드
    public int getBalance(String cAccount) {
        int balance = 0;
        String sql = "SELECT BALANCE FROM ACCOUNT WHERE CACCOUNT = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, cAccount);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                balance = rs.getInt(1);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return balance;
    }
    // 8-2. 출금 메소드
    public void withdraw(String cAccount, int money) {
        String sql = "UPDATE ACCOUNT SET BALANCE = BALANCE - ? WHERE CACCOUNT = ?";
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, money);
            pstmt.setString(2, cAccount);
            int result = pstmt.executeUpdate();

            if (result > 0) {
                System.out.println("출금 성공!");
            } else {
                System.out.println("출금 실패...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    // 9. 송금 메소드
    public void transferMoney(String sendAccount, String receiveAccount, int money) {
        String sql1 = "UPDATE ACCOUNT SET BALANCE = BALANCE - ? WHERE CACCOUNT = ?";
        String sql2 = "UPDATE ACCOUNT SET BALANCE = BALANCE + ? WHERE CACCOUNT = ?";
        try {
            pstmt = con.prepareStatement(sql1);
            pstmt.setInt(1, money);
            pstmt.setString(2, sendAccount);
            pstmt.executeUpdate();
            pstmt = con.prepareStatement(sql2);
            pstmt.setInt(1, money);
            pstmt.setString(2, receiveAccount);
            int result = pstmt.executeUpdate();

            if (result > 0) {
                System.out.println("송금 성공!");
            } else {
                System.out.println("송금 실패...");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}

 


 

BankMain package

 

BankMain

package BankMain;

import BankDAO.BankSQL;
import BankDTO.Account;
import BankDTO.Client;

import java.util.Scanner;

public class BankMain {
    public static void main(String[] args) {
        BankSQL sql = new BankSQL();
        Client client = new Client();
        Account acc = new Account();
        Scanner sc = new Scanner(System.in);
        boolean run1 = true;
        sql.connect();

        while (run1) {
       	// before login
            String loginId = null;
            boolean run2 = false;
            boolean check = false;
            System.out.println("============라즈베리증권============");
            System.out.println("[1]회원가입    [2]로그인    [3]종료");
            System.out.println("===================================");
            System.out.print("메뉴선택 > ");
            String menu = sc.next();

            switch (menu) {
                case"1":
                    client.setcNum(sql.clientNum());
                    System.out.print("아이디 > ");
                    client.setcId(sc.next());
                    System.out.print("비밀번호 > ");
                    client.setcPw(sc.next());
                    System.out.print("이름 > ");
                    client.setcName(sc.next());
                    System.out.print("연락처 > ");
                    client.setcPhone(sc.next());
                    System.out.print("주소 > ");
                    client.setcAddr(sc.next());
                    sql.joinClient(client);
                    break;
                case"2":
                    System.out.print("아이디 > ");
                    String inputId = sc.next();
                    System.out.print("비밀번호 > ");
                    String inputPw = sc.next();
                    run2 = sql.login(inputId, inputPw);
                    if (run2) {
                        loginId = inputId;
                    }
                    break;
                case"3":
                    System.out.println("프로그램을 종료합니다...");
                    run1 = false;
                    break;
                default:
                    System.out.println("1~3중에 입력하세요...");
                    break;
            }
            System.out.println();
            
            while (run2) {
            // after login
                System.out.printf("======================라즈베리증권[%s 님]======================\n",loginId);
                System.out.println("[1]계좌생성    [2]입금    [3]출금    [4]조회    [5]송금    [6]로그아웃");
                System.out.println("==================================================================");
                System.out.print("메뉴선택 > ");
                menu = sc.next();

                switch (menu) {
                    case"1":
                        if (sql.countAccount(loginId) == 3) {
                            System.out.println("이미 3개의 계좌가 존재합니다!\n한 사람당 최대 3개의 계좌만 생성 가능합니다...");
                        } else {
                            String newAccount = sql.addAccount();
                            acc.setcAccount(newAccount);
                            acc.setcId(loginId);
                            System.out.println("================계좌 종류================");
                            System.out.println("[1]일반    [2]청약    [3]주식    [4]적금");
                            System.out.println("========================================");
                            System.out.print("종류선택 > ");
                            int accountType = sc.nextInt();
                            if (accountType > 4) {
                                System.out.println("1~4중에 선택하세요...");
                                break;
                            } else {
                                acc.setcodeNum(accountType);
                                System.out.print("초기잔액 > ");
                                acc.setBalance(sc.nextInt());
                                sql.createAccount(acc);
                                sql.accountInfo(newAccount);
                            }
                        }
                        break;
                    case"2":
                        System.out.print("입금할 계좌 > ");
                        String depositAccount = sc.next();
                        boolean check1 = sql.checkAccount(depositAccount);
                        if (check1) {
                            System.out.print("입금 금액 > ");
                            int money = sc.nextInt();
                            sql.deposit(depositAccount, money);
                        }
                        break;
                    case"3":
                        System.out.print("출금할 계좌 > ");
                        String withdrawAccount = sc.next();
                        check = sql.checkAccount(withdrawAccount);
                        if (check) {
                            System.out.print("출금 금액 > ");
                            int money = sc.nextInt();
                            if (sql.getBalance(withdrawAccount) < money) {
                                System.out.println("잔액이 부족합니다...");
                            } else {
                                sql.withdraw(withdrawAccount, money);
                            }
                        }
                        break;
                    case"4":
                        sql.selectClient(loginId);
                        break;
                    case"5":
                        System.out.print("출금 계좌 > ");
                        String sendAccount = sc.next();
                        check = sql.checkAccount(sendAccount);
                        if (check) {
                            System.out.print("입금 계좌 > ");
                            String receiveAccount = sc.next();
                            if (sendAccount.equals(receiveAccount)) {
                                System.out.println("동일한 계좌로의 송금은 진행할 수 없습니다...");
                            } else {
                                boolean checkSA = sql.checkAccount(receiveAccount);
                                if (checkSA) {
                                    System.out.print("보내실 금액 > ");
                                    int money = sc.nextInt();
                                    if (sql.getBalance(sendAccount) < money) {
                                        System.out.println("잔액이 부족합니다...");
                                    } else {
                                        sql.transferMoney(sendAccount, receiveAccount, money);
                                    }
                                }
                            }
                        }
                        break;
                    case"6":
                        System.out.println("로그아웃! 초기화면으로 돌아갑니다...");
                        run2 = false;
                        break;
                    default:
                        System.out.println("1~6중에 입력하세요...");
                        break;
                }
                System.out.println();
            }
        }
    }
}

 

 

 

'Spring-Java > JDBC' 카테고리의 다른 글

Day18_JDBC, Banking 예제 1  (0) 2023.09.11