- 지금까지 일주일간 자바의 전체적인 구조를 알고 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 로 나눠서 작업하자.
1) 호텔 예약 서비스를 구현한 팀에서 객실 예약시 현재 날짜 전의 날짜는 예약이 불가능 해야하는데,
이 때 Date타입의 자료를 Compate()메서드를 활용하여 return값으로 예외처리 해주는 부분이 인상깊었다.
2) 다른조에서 같은 개발 환경을 최대한 맞추기위해 jdk버전까지 통일한 것을 보고 감명 깊었다.
3) 우리 조는 계좌번호를 입력받아 저장했는데, 다른조는 각 은행을 만들어 은행에서 계좌 번호를 자동 Random()으로 생성해주는 부분이 인상 깊었다.
- 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로 나눈 나머지로 날짜를 계산할 수 있다는 생각을 예시를 들어보며 깨우쳤고, 그렇게 코딩했다.
1) 깃허브에 대한 개념을 나름 정리하였고, 각자의 브렌치에서 한 작업을 합치고 또 pull해오는 작업이 너무 재밌었다.
2) 기본적인 기능들은 전부 동작하지만, 역시 시작할 때 정리를 잘하고 시작하는게 중요하다.
3) 협업의 중요성을 다시 한번 느꼈다.
- 팀 육성제 KPT : https://cdaosldk.tistory.com/51