[11.29] 내일배움캠프[Spring] TIL-21

박상훈·2022년 11월 29일
0

내일배움캠프[TIL]

목록 보기
21/72

[11.29] 내일배움캠프[Spring] TIL-21

1. 순수 java로 만들어 보는 미니프로젝트 종료

  • 지금까지 일주일간 자바의 전체적인 구조를 알고 Collection을 사용할 줄 아냐를 익히기 위해 미니 프로젝트를 진행했다.
  • 우리 팀원이 진행한 프로젝트는 은행관리였으며, 계좌의 등록, 수정, 삭제, 입/출금, 거래내역조회 , 이름/계좌번호로 계좌 정보 조회, 전체 계좌 조회 였다.

🚨 1) UML을 제대로 만들지 않고 구현에 신경썼다.
https://www.diagrams.net/

👉 클레스가 너무 소분화 되지 않았고, 기능이 구현이 너무 구구절절이다.
👉 그나마 있던 함수도 중복되는 것을 줄인다고 줄였지만, 아직까지 중복이 너무 많다.
👉 다음 프로젝트 부터는 클레스간의 관계를 UML로 천천히 그리며 파악하고, 그 뒤 작업하도록 하자!!

🚨 2) 특정 계좌 삭제시 거래내역도 같이 지워줘야한다.
👉 DB이상에서 삭제이상 현상을 해결하는 것을 망각했다.
👉 다른 조 처럼 User클레스에 AccountList객체를 담았다면 같이 삭제 되었을 것이다.
👉 그렇다면 추가적으로 AccountList를 삭제해주지 않아도 User의 특정 계좌 삭제시 같이 삭제되었을 것이다.
👉 하지만 우리 조는 실제 DB라고 생각하고 작업했기 때문에 이 또한 경험이라고 생각한다.

🚨 3) Main에 코드 때려박지 말자...

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;
            }
        }
    }

}

👉 Main코드만 300줄이다.. 말이 되나..!!!!!!
👉 오히려 Bank의 CRUD를 담당한 부분이 더 짧다...!!!

🚨 4) 3 - Tier - architecture 의 구조를 따라가지 못했던 것 같다.
👉 우리조는 패키지의 구조를 크게 Service / Vo로 나눠서 작업했다.
👉 Present(Client) / Service / Repository 로 나눠서 작업하자.

2. 다른 조의 프로젝트를 보며 느낀점

1) 호텔 예약 서비스를 구현한 팀에서 객실 예약시 현재 날짜 전의 날짜는 예약이 불가능 해야하는데,
이 때 Date타입의 자료를 Compate()메서드를 활용하여 return값으로 예외처리 해주는 부분이 인상깊었다.

2) 다른조에서 같은 개발 환경을 최대한 맞추기위해 jdk버전까지 통일한 것을 보고 감명 깊었다.

3) 우리 조는 계좌번호를 입력받아 저장했는데, 다른조는 각 은행을 만들어 은행에서 계좌 번호를 자동 Random()으로 생성해주는 부분이 인상 깊었다.

3. 오늘의 프로그래머스 Level -1 코테

  • 2016년 1월 1일은 금요일
  • 월과 날짜를 입력받아 요일을 출력하는 로직을 구현해라.
  • 단 , 2월 36일과 같은 경우는 없다.
class Solution {

    // 1월 1일이 금요일이라는 사실로 시작하자.. 2/5 3/4 4/1 5/6 날짜의 규칙성은 없다..
    //1 8 15 22 29 금 36 43 50 57

    public String solution(int a, int b) {
        //a = month
        // b = days

        int [] day = {31,29,31,30,31,30,31,31,30,31,30,31};

        int sum = 0;

        for(int i=1;i < a;i++){
            sum+=day[i-1];
        }

        switch ((sum+b)%7){
            case 0:
                return "THU";
            case 1:
                return "FRI";
            case 2:
                return "SAT";
            case 3 :
                return "SUN";
            case 4:
                return "MON";
            case 5:
                return "TUE";
            case 6:
                return "WED";
            default:
                return "";

        }
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.solution(4,21));
    }
}

👉 정답인지 아닌지는 제출시간을 넘겨 모르겠지만, 구동에는 이상이없다.
👉 해당 월의 전월 까지의 일수를 모두 더한 후, 받은 날짜를 더한 값을 7로 나눈 나머지로 날짜를 계산할 수 있다는 생각을 예시를 들어보며 깨우쳤고, 그렇게 코딩했다.

4. 미니프로젝트를 마치며 ..

1) 깃허브에 대한 개념을 나름 정리하였고, 각자의 브렌치에서 한 작업을 합치고 또 pull해오는 작업이 너무 재밌었다.
2) 기본적인 기능들은 전부 동작하지만, 역시 시작할 때 정리를 잘하고 시작하는게 중요하다.
3) 협업의 중요성을 다시 한번 느꼈다.

profile
기록하는 습관

0개의 댓글