[11.28] 내일배움캠프[Spring] TIL-20

박상훈·2022년 11월 28일
0

내일배움캠프[TIL]

목록 보기
20/72

[11.28] 내일배움캠프[Spring] TIL-20

1. 순수 java를 이용한 미니프로젝트 -2( 마무리 )

  • 원래 미완성이였던 입출금, 거래내역 조회 부분까지 얼추 마무리가 끝났다.
  • 코드를 전체적으로 돌려보며 예외를 확인하고 마지막 발표를 준비하고 있다.
  • 깃허브를 활용해서 협업하니 훨씬 편하다.
  • User.java
package vo;
public class User {

    private String name; //유저 이름
    private int stock;   //잔고
    private String accountNum;  //계좌번호
    private String bankName;   //은행명
    private String pwd;       //비밀번호

    private Account account;


    public User(String name,int stock ,String accountNum, String bankName, String pwd) {
        this.name = name;
        this.stock = stock;
        this.accountNum = accountNum;
        this.bankName = bankName;
        this.pwd = pwd;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBankName(String bankName) {
        this.bankName = bankName;
    }

    public String getName() {
        return name;
    }

    public int getStock() {
        return stock;
    }

    public String getAccountNum() {
        return accountNum;
    }

    public String getBankName() {
        return bankName;
    }

    public String getPwd() {
        return pwd;
    }

    //입금
    public void addStock(int money){
        this.stock += money;
    }
    //출금
    public void subtractStock(int money){
        this.stock -= money;
    }


}
  • Account.java
package vo;

import java.time.LocalDateTime;

    public class Account {

        private String accountNum;
        private LocalDateTime timeHistory;

        private String plusOrMinus;

        private int amount;

        //   날짜/시간, 입출금 +-, 입력금액
        public Account( String plusOrMinus,int amount,String accountNum) {
//            this.timeHistory = timeHistory;
            this.accountNum = accountNum;
            this.plusOrMinus = plusOrMinus;
            this.amount = amount;
        }

        public LocalDateTime getTimeHistory() { return timeHistory;}

        public String getPlusOrMinus() {
            return plusOrMinus;
        }

        public int getAmount() {
            return amount;
        }

        public String getAccountNum() {
            return accountNum;
        }

        public void setTimeHistory(LocalDateTime timeHistory) {
            this.timeHistory = timeHistory;
        }

}
  • Bank.java
package service;

import vo.Account;
import vo.User;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Bank {

    private final static Bank bank = new Bank();

    private List<User> userList = new ArrayList<>();
    private List<Account> accountList = new ArrayList<>();

    //Bank하나의 객체를 유지하기 위한 메서드
    public static Bank getInstance(){

        if(bank == null){
            return new Bank();
        }
        return bank;
    }
    //유저의 정보를 저장하는 부분
    public void addUser(User user){
        System.out.println("은행 정보가 정상적으로 저장되었습니다.");
        userList.add(user);
    }

    public void showAll(){
        for(int i=0;i<userList.size();i++){
            System.out.println("------------");
            System.out.print(userList.get(i).getName()+"님 ");
            System.out.println(userList.get(i).getAccountNum()+" ");
            System.out.println(userList.get(i).getStock()+"원 ");
            System.out.println(userList.get(i).getBankName()+" 은행");
        }
    }

    public boolean checkToUsableBankNum(String bankNum){

        if(userList.stream().anyMatch(s->s.getAccountNum().equals(bankNum))){
            System.out.println("이미 등록된 계좌번호입니다!");
            return false;
        }
        return true;
    }

    public boolean confirmAccountNum(String inputAccountNum){

        if(userList.stream().anyMatch(s -> s.getAccountNum().equals(inputAccountNum))){
            return true;
        }
        System.out.println("존재하지 않는 계좌번호입니다!");
        return false;
    }

    public boolean confirmAccountName(String inputAccountName){

        if(userList.stream().anyMatch(s -> s.getName().equals(inputAccountName))){
            return true;
        }
        System.out.println("존재하지 않는 회원입니다!");
        return false;
    }



    public boolean confirmAccountPwd(String inputAccountNum, String pwd){

        Stream<User> userInfo = userList.stream().filter(s -> s.getAccountNum().equals(inputAccountNum));
        if(userInfo.anyMatch(s -> s.getPwd().equals(pwd))){
            return true;
        }
        System.out.println("계좌의 비밀번호가 틀립니다!");
        return false;

    }

    public void updateUserName(String updateUserName,String inputAccountNum){

        for(int i=0 ; i<userList.size();i++){
            if(userList.get(i).getAccountNum().equals(inputAccountNum)){
                String previousUserName = userList.get(i).getName();
                userList.get(i).setName(updateUserName);
                String presentUserName = userList.get(i).getName();
                System.out.println(previousUserName+"님에서 "+presentUserName+"님으로 변경되었습니다!");
                break;
            }
        }
    }

    public void updateBankName(String updateBankName,String inputAccountNum){

        for(int i=0 ; i<userList.size();i++){
            if(userList.get(i).getAccountNum().equals(inputAccountNum)){
                String previousBankName = userList.get(i).getBankName();
                userList.get(i).setBankName(updateBankName);
                String presentBankName = userList.get(i).getBankName();
                System.out.println(previousBankName+"은행에서  "+presentBankName+"은행으로 변경되었습니다!");
                break;
            }
        }
    }

    public void deleteAccount(String inputAccountNum){
        for(int i=0 ; i<userList.size();i++){
            if(userList.get(i).getAccountNum().equals(inputAccountNum)){
                String presentBankName = userList.get(i).getName();
                userList.remove(i);
                System.out.println(presentBankName+"님의  "+inputAccountNum+" 계좌가 삭제되었습니다!!");
                break;
            }
        }
    }


    public void searchByUserName(String searchUserName){
        Stream<User> searchUser = userList.stream().filter(s -> s.getName().equals(searchUserName));
        searchUser.forEach(u -> System.out.println("--------\n"+u.getName()+" "+u.getAccountNum()+ " \n"+u.getStock()+"원 \n"+u.getBankName()+" 은행"));
    }

    public void searchByAccountNum(String searchAccountNum){

        Stream<User> searchUser = userList.stream().filter(s -> s.getAccountNum().equals(searchAccountNum));
        searchUser.forEach(u -> System.out.println("--------\n"+u.getName()+" "+u.getAccountNum()+ " \n"+u.getStock()+"원 \n"+u.getBankName()+" 은행"));

    }

// 입출금 메서드
    public void deposit(String AccountNum, int money) {
        if (money == 0) {
            System.out.println("금액을 다시 입력해주세요");
        }
        for (int i = 0; i < userList.size(); i++) {
            if (userList.get(i).getAccountNum().equals(AccountNum)) {
                userList.get(i).addStock(money);
                break;
            }
        }
    }
    public void withdraw(String AccountNum, int money) {
        for (int i = 0; i < userList.size(); i++) {
            if (userList.get(i).getAccountNum().equals(AccountNum)) {
                if(userList.get(i).getStock() <= money) {
                    System.out.println("잔고가 부족합니다");
                } else if( userList.get(i).getStock() >= money) {
                    userList.get(i).subtractStock(money);
                    System.out.println("출금되었습니다.");
                }
                break;
            }
        }
    }

    //잔고 확인
    public void searchAccountStock(String searchAccountNum) {
        Stream<User> searchUser = userList.stream().filter(s -> s.getAccountNum().equals(searchAccountNum));
        searchUser.forEach(u -> System.out.println("--------\n" + u.getBankName() + "은행  " + u.getAccountNum() + " \n" + "남은 잔고: " + u.getStock() + "원 \n"));
     }
    public void searchByUserNameList(String searchUserName){
        Stream<User> searchUser = userList.stream().filter(s -> s.getName().equals(searchUserName));
        searchUser.forEach(u -> System.out.println("--------\n"+u.getName()+"  "+u.getBankName()+"은행 "+u.getAccountNum()+ " \n"));
    }

    public void addDepositOrWithdrawList(Account account){
        LocalDateTime localDateTime = LocalDateTime.now();
        account.setTimeHistory(localDateTime);
        accountList.add(account);
    }

    public boolean showAccountList(String userName,String accountNum){

        Stream<Account> accountListUser = accountList.stream().filter(s -> s.getAccountNum().equals(accountNum));

        if(!accountList.stream().anyMatch(s -> s.getAccountNum().equals(accountNum))){
            System.out.println(accountNum+" 계좌의 입출금 내역이 없습니다!");
            return false;
        }
        System.out.println("=== "+userName+"님의 " +accountNum+" 계좌 입출금 거래내역 ===");
        accountListUser.forEach(s -> System.out.println(s.getPlusOrMinus()+" "+s.getAmount()+"원 "+s.getTimeHistory()));
        System.out.println("==========================");
        return true;
    }

}
  • App.java
import service.Bank;
import vo.Account;
import vo.User;
import java.util.Scanner;
import java.util.regex.Pattern;

public class App {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            // main 화면, 각 클래스와 관련된 내용으로 연결되고 이후 접속 시 관련 메뉴를 한 번 더 볼 수 있도록 설정
            System.out.println("=== BankSystem에 오신 것을 환영합니다 ===");
            System.out.println("원하시는 메뉴에 해당하는 번호를 입력하세요.");
            System.out.println("1. 은행 관리 2. 거래내역 및 입출금 3. 종료");
            int select = sc.nextInt();

            if (select == 3) {
                System.out.println("안녕히 가십시오");
                break;
            }

            switch (select) {
                case 1:
                    bankManager();
                    break;

                case 2:
                    moneyList();
                    break;

                default:
                    System.out.println("다시 입력해 주세요.");
                    break;

            }
        }
    }

    public static void bankManager() {
        Bank bank = Bank.getInstance();
        Scanner sc = new Scanner(System.in);
        while (true) {
            // 은행 관리자 화면
            System.out.println("=== 은행 관리 ===");
            System.out.println("원하시는 메뉴에 해당하는 번호를 입력하세요.");
            System.out.println("1. 계좌 등록 2. 등록계좌 수정/삭제 3. 계좌 조회(소유자/계좌번호/전체) 4. 이전");
            int select = sc.nextInt();

            if (select == 4) {
                break;
            }
            switch (select) {
                case 1:
                    System.out.println("=== 계좌 등록 ===");
                    System.out.print("소유주 : ");
                    String name = sc.next();
                    String pattern = "[0-9,\\-]{3,6}\\-[0-9,\\-]{2,6}\\-[0-9,\\-]";
                    System.out.print("계좌번호( ex) xxx-xxxxxx-x ) : ");
                    String accountNum = sc.next();

                    if (!Pattern.matches(pattern, accountNum)) {
                        System.out.println("계좌번호 형식이 틀렸습니다!");
                        return;
                    }
                    if (!bank.checkToUsableBankNum(accountNum)) {
                        return;
                    }
                    System.out.print("계좌 비밀번호 설정 :");
                    String pwd = sc.next();

                    System.out.print("은행명 :");
                    String bankName = sc.next();

                    User user = new User(name, 0, accountNum, bankName, pwd);

                    bank.addUser(user);
                    break;

                case 2:

                    System.out.println("=== 등록계좌 수정 및 삭제 ===");
                    System.out.println("1. 수정 2. 삭제");
                    int num2 = sc.nextInt();

                    if (num2 == 1) {
                        // 수정 메서드 호출
                        System.out.print("수정할 계좌번호를 입력하세요 :");
                        String updateAccountNum = sc.next();
                        // 입력한 계좌번호가 DB에 있는지 확인
                        if (!bank.confirmAccountNum(updateAccountNum)) {
                            return;
                        }
                        System.out.print("계좌 비밀번호를 입력하세요 :");
                        String updatePwd = sc.next();
                        // 입력한 계좌의 비밀번호가 맞는지 확인
                        if (!bank.confirmAccountPwd(updateAccountNum, updatePwd)) {
                            return;
                        }
                        System.out.print("수정할 정보를 선택하세요!");
                        System.out.println("1.소유주명, 2.은행");
                        int updateContentNum = sc.nextInt();

                        if (updateContentNum == 1) {
                            // 소유주명 바꾸기
                            System.out.print("변경할 소유주명 :");
                            String updateUserName = sc.next();
                            bank.updateUserName(updateUserName, updateAccountNum);

                        } else {
                            // 은행명 바꾸기
                            System.out.print("변경할 은행명 : ");
                            String updateBankName = sc.next();
                            bank.updateBankName(updateBankName, updateAccountNum);
                        }

                    } else {
                        // 삭제 메서드 호출
                        System.out.print("삭제할 계좌번호를 입력하세요 :");
                        String deleteAccountNum = sc.next();
                        // 입력한 계좌번호가 DB에 있는지 확인
                        if (!bank.confirmAccountNum(deleteAccountNum)) {
                            return;
                        }
                        System.out.print("계좌 비밀번호를 입력하세요 :");
                        String deletePwd = sc.next();
                        // 입력한 계좌의 비밀번호가 맞는지 확인
                        if (!bank.confirmAccountPwd(deleteAccountNum, deletePwd)) {
                            return;
                        }
                        bank.deleteAccount(deleteAccountNum);
                    }
                    break;

                case 3:
                    System.out.println("=== 등록계좌 조회 ===");
                    System.out.println("1. 이름으로 조회 2. 계좌번호로 조회 3. 전체 조회");
                    int num3 = sc.nextInt();

                    if (num3 == 1) {
                        // 이름 조회 메서드 호출
                        System.out.print("조회하실 성함을 입력하세요 :");
                        String searchName = sc.next();

                        if (!bank.confirmAccountName(searchName)) {
                            return;
                        }
                        bank.searchByUserName(searchName);


                    } else if (num3 == 2) {
                        // 계좌번호 조희 메서드 호출
                        System.out.print("조회하실 계좌번호를 입력하세요 :");
                        String searchAccountNum = sc.next();
                        //search
                        if (!bank.confirmAccountNum(searchAccountNum)) {
                            return;
                        }
                         bank.searchByAccountNum(searchAccountNum);


                    } else {
                        // 전체 조회 메서드 호출
                        bank.showAll();
                    }
                    break;


                default:
                    System.out.println("다시 입력해 주세요.");
                    break;

            }
        }
    }

    public static void moneyList() {
        Scanner sc = new Scanner(System.in);
        Bank bank = Bank.getInstance();
//        String accNum = 계좌번호 호출
        while (true) {
            // 입출금내역 관련 화면
            System.out.println("=== 거래 내역 및 입출금 ===");
            System.out.println("원하시는 메뉴에 해당하는 번호를 입력하세요.");
            System.out.println("1. 잔고 확인 2. 거래 내역 조회 3. 입금/출금 4. 이전");
            int accountMenu = sc.nextInt();

            if (accountMenu == 4) {
                break;
            }

            switch (accountMenu) {
                case 1:
                    // 잔고확인 메서드
                    System.out.println("=== 계좌잔고 조회 ===");
                    System.out.print("이름을 입력하세요 : "); //이름을 입력하세요
                    String searchNameSt = sc.next();
                    System.out.println("계좌목록들 입니다");
                    if(!bank.confirmAccountName(searchNameSt)){
                        return;
                    }
                    bank.searchByUserNameList(searchNameSt);
                    System.out.print("조회하실 계좌번호를 입력하세요 :");
                    String searchAccountNum = sc.next();
                    //search
                    if (!bank.confirmAccountNum(searchAccountNum)) {
                        return;
                    }
                    System.out.print("계좌 비밀번호를 입력하세요 :");
                    String searchPwd = sc.next();
                    // 입력한 계좌의 비밀번호가 맞는지 확인
                    if (!bank.confirmAccountPwd(searchAccountNum, searchPwd)) {
                        return;
                    }
                    bank.searchAccountStock(searchAccountNum);



                    break;
                case 2:
                    System.out.println("=== 거래내역 조회 ===");
                    System.out.print("이름을 입력하세요 : ");
                    String accountName = sc.next();
                    if (!bank.confirmAccountName(accountName)) {
                        return;
                    }
                    System.out.print("계좌번호를 입력하세요 : ");
                    String AccountNumCaseTwo = sc.next();
                    if (!bank.confirmAccountNum(AccountNumCaseTwo)) {
                        return;
                    }

                    System.out.print("계좌비밀번호를 입력하세요 : ");
                    String serchPwd = sc.next();
                    if (!bank.confirmAccountPwd(AccountNumCaseTwo, serchPwd)) {
                        return;
                    }

                    if(!bank.showAccountList(accountName,AccountNumCaseTwo)){
                        return;
                    }

                    break;
                case 3:
                    System.out.println("=== 입출금 ===");
                    System.out.println("1. 입금 2. 출금");
                    int num = sc.nextInt();

                    if (num == 1) {
                        // return Bank.입금메서드 호출
                        System.out.print("계좌번호를 입력하세요 : ");
                        String AccountNum = sc.next();
                        //search 계좌번호
                        if (!bank.confirmAccountNum(AccountNum)) {
                            return;
                        }
                        System.out.print("계좌 비밀번호를 입력하세요 :");
                        String updatePwd = sc.next();
                        // 입력한 계좌의 비밀번호가 맞는지 확인
                        if (!bank.confirmAccountPwd(AccountNum, updatePwd)) {
                            return;
                        }
                        System.out.print("입금할 금액을 입력하세요 : ");
                        int money = sc.nextInt();
                        bank.deposit(AccountNum,money);
                        System.out.println("입금되었습니다.");
                        Account account = new Account("입금",money,AccountNum);
                        bank.addDepositOrWithdrawList(account);

                    } else if(num == 2){
                        // return Bank.출금메서드 호출
                        System.out.print("계좌번호를 입력하세요 : ");
                        String AccountNum = sc.next();
                        //search 계좌번호
                        if (!bank.confirmAccountNum(AccountNum)) {
                            return;
                        }
                        System.out.print("계좌 비밀번호를 입력하세요 :");
                        String updatePwd = sc.next();
                        // 입력한 계좌의 비밀번호가 맞는지 확인
                        if (!bank.confirmAccountPwd(AccountNum, updatePwd)) {
                            return;
                        }
                        System.out.print("출금할 금액을 입력하세요 : ");
                        int money = sc.nextInt();
                        bank.withdraw(AccountNum,money);
                        Account account = new Account("출금",money,AccountNum);
                        bank.addDepositOrWithdrawList(account);
                    }else{
                        System.out.println("잘못된 번호입니다!!");
                        return;
                    }
                    break;
                default:
                    System.out.println("다시 입력해 주세요.");
                    break;
            }
        }
    }

}

2. 아쉬운점, 느낀점⭐

1) Main의 코드가 너무 길다. -> 중복되는 부분을 함수로 빼고, 필요없는 구문을 지워서 코드를 더 줄일 수 있을 것 같다.
2) 다른 코드도 마찬가지로 은근히 중복이 발생한다. -> 함수로 빼고 그 기능을 가져다가 쓰자!
3) 가독성이 떨어진다. -> 흐름대로 작업하다보니 가독성을 신경쓰지 못한 것 같다.
-> 변수명이나 함수명도 조금 더 알기 쉽게 작업해야 될 필요성이 분명하다.
4) 그래도 구현은 잘된다. -> 지금의 Level에서는 코드를 효율적으로 짜는 것도 물론 중요 하지만, 동작 구현을 1순위로 작업하고, 그 다음에 효율성을 따져보도록 하자.
5) 실제 DB를 활용하는 프로젝트에 들어가면 더 재밌을 것 같다.
6) 일단 끝까지 해냈다는거에 만족하고 재밌게 코딩했던 것 같다.

profile
기록하는 습관

0개의 댓글