MVC Pattern으로 BankSystem을 만들어 보자.
Overview
MVC Pattern - BankSystem
DB 구성
소스 코드
//Main
import Controller.BankController;
public class Main {
public static void main(String[] args) {
new BankController();
}
}
//Controller
package Controller;
import java.util.ArrayList;
import java.util.Scanner;
import DTO.BankDTO;
import Service.BankService;
public class BankController {
//반복 사용되는 자원들은 필드로 잡아서 사용하는게 효율적이다.
Scanner s;
public BankController()
{
ArrayList<BankDTO> list = new ArrayList<BankDTO>();
String menu = null;
s = new Scanner(System.in);
do{
System.out.println("--- 메뉴입니다. ---");
System.out.println("1. 입금");
System.out.println("2. 출금");
System.out.println("3. 이체");
System.out.println("4. 종료");
System.out.print("메뉴를 입력하세요 => ");
menu = s.nextLine();
if(menu.equals("1"))
{
System.out.print("입금할 사람의 이름: ");
String name = s.nextLine();
System.out.print("입금할 금액을 입력하세요:");
int money = s.nextInt();
//DTO를 만들고 데이터를 넣은 후 DTO를 이용해 서비스쪽에 넘김
BankDTO dto = new BankDTO();
dto.setUsername(name);
dto.setBalance(money);
BankService service = new BankService();
//결과처리된 것을 다시 dto로 받음
dto = service.deposit(dto);
System.out.println(dto.getUsername() + "의 잔액은" + dto.getBalance() + "입니다.");
}
else if (menu.equals("2"))
{
System.out.print("출금할 사람의 이름: ");
String name = s.nextLine();
System.out.print("출금할 금액을 입력하세요:");
int money = s.nextInt();
//DTO를 만들고 데이터를 넣은 후 DTO를 이용해 서비스쪽에 넘김
BankDTO dto = new BankDTO();
dto.setUsername(name);
dto.setBalance(money);
BankService service = new BankService();
//결과처리된 것을 다시 dto로 받음
dto = service.withdrawal(dto);
System.out.println(dto.getUsername() + "의 잔액은" + dto.getBalance() + "입니다.");
}
else if(menu.equals("3"))
{
System.out.print("이체할 사람의 이름: ");
String name = s.nextLine();
System.out.print("누구에게 이체 하시겠습니까:");
String name2 = s.nextLine();
System.out.print("이체할 금액을 입력하세요:");
int money = s.nextInt();
//DTO를 만들고 데이터를 넣은 후 DTO를 이용해 서비스쪽에 넘김
BankDTO dto = new BankDTO();
dto.setUsername(name);
dto.setBalance(money);
BankDTO dto2 = new BankDTO();
dto2.setUsername(name2);
dto2.setBalance(money);
list.add(dto);
list.add(dto2);
BankService service = new BankService();
//결과처리된 것을 다시 dto로 받음
list = service.transfer(list);
System.out.println(list.get(0).getUsername() + "의 잔액은" + list.get(0).getBalance() + "입니다.");
System.out.println(list.get(1).getUsername() + "의 잔액은" + list.get(1).getBalance() + "입니다.");
}
}while(!menu.equals("4"));
System.out.println("프로그램 종료");
}
}
//DTO
package DTO;
//DTO는 DB의 테이블을 근간으로 만든다.
public class BankDTO {
String username;
int balance;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
}
//Service
package Service;
import java.util.ArrayList;
import DAO.BankDAO;
import DTO.BankDTO;
public class BankService {
public BankDTO deposit(BankDTO dto) {
//로직 처리를 한다.
//다만 우리 프로그램은 별다른 로직처리가 없음
//Database 처리만 하면된다.
//DB 처리후 결과를 dto에 저장하고 Controller 쪽으로 리턴
BankDAO dao = new BankDAO();
dto = dao.UpdateDeposit(dto);
return dto;
}
public BankDTO withdrawal(BankDTO dto) {
BankDAO dao = new BankDAO();
dto = dao.UpdateWithdrawal(dto);
return dto;
}
public ArrayList<BankDTO> transfer(ArrayList<BankDTO> list) {
BankDAO dao = new BankDAO();
list = dao.UpdateTransfer(list);
return list;
}
}
//DAO
package DAO;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import DTO.BankDTO;
public class BankDAO {
public BankDTO UpdateDeposit(BankDTO dto) {
try{
//1. 드라이버 로딩
//자바프로그램이 MySQL에 접근하기 위해서 필요한 라이브러리를 불러들인다.
//pom.xml 에 MySQL에 대한 dependency를 입력해서 라이브러리를 다운로드 받는다.
Class.forName("com.mysql.jdbc.Driver");
//2. 실제 데이터베이스에 접속
//어떤 데이터베이스에 접속할 건지, 아이디와 패스워드가 필요
String url = "jdbc:mysql://localhost:3306/library";
String id = "root";
String pw = "cps431";
Connection con = DriverManager.getConnection(url,id,pw);
//3. SQL문을 실행하기 위한 Statement를 생성한다.
String sql ="update account set balance = balance + ? where username = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
//sql문에 내가 원하는 문자열을 넣는 작업.
pstmt.setInt(1, dto.getBalance());
pstmt.setString(2, dto.getUsername());
//4. Statement 실행!!
//update 쿼리문 수행
pstmt.executeUpdate();
//5. 결과처리
//update한 결과를 가져옴
sql = "select username,balance from account where username = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, dto.getUsername());
ResultSet rs = pstmt.executeQuery();
rs.next();
dto = new BankDTO();
dto.setUsername(rs.getString("username"));
dto.setBalance(rs.getInt("balance"));
//6. 사용한 리소스 정리
rs.close();
pstmt.close();
con.close();
}catch(Exception e){
//만약 오류가 생기면 오류 출력
System.out.println(e);
}
return dto;
}
public BankDTO UpdateWithdrawal(BankDTO dto) {
try{
//1. 드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
//2. 실제 데이터베이스에 접속
String url = "jdbc:mysql://localhost:3306/library";
String id = "root";
String pw = "cps431";
Connection con = DriverManager.getConnection(url,id,pw);
//3. SQL문을 실행하기 위한 Statement를 생성한다.
String sql ="update account set balance = balance - ? where username = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, dto.getBalance());
pstmt.setString(2, dto.getUsername());
//4. Statement 실행!!
pstmt.executeUpdate();
//5. 결과처리
sql = "select username,balance from account where username = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, dto.getUsername());
ResultSet rs = pstmt.executeQuery();
rs.next();
dto = new BankDTO();
dto.setUsername(rs.getString("username"));
dto.setBalance(rs.getInt("balance"));
//6. 사용한 리소스 정리
rs.close();
pstmt.close();
con.close();
}catch(Exception e){
//만약 오류가 생기면 오류 출력
System.out.println(e);
}
return dto;
}
public ArrayList<BankDTO> UpdateTransfer(ArrayList<BankDTO> list) {
try{
//1. 드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
//2. 실제 데이터베이스에 접속
String url = "jdbc:mysql://localhost:3306/library";
String id = "root";
String pw = "cps431";
Connection con = DriverManager.getConnection(url,id,pw);
//3. SQL문을 실행하기 위한 Statement를 생성한다.
//4. Statement 실행!!
String sql ="update account set balance = balance - ? where username = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, list.get(0).getBalance());
pstmt.setString(2, list.get(0).getUsername());
pstmt.executeUpdate();
sql ="update account set balance = balance + ? where username = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, list.get(1).getBalance());
pstmt.setString(2, list.get(1).getUsername());
pstmt.executeUpdate();
//5. 결과처리
sql = "select username,balance from account where username = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, list.get(0).getUsername());
ResultSet rs = pstmt.executeQuery();
rs.next();
BankDTO dto = new BankDTO();
dto.setUsername(rs.getString("username"));
dto.setBalance(rs.getInt("balance"));
sql = "select username,balance from account where username = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, list.get(1).getUsername());
rs = pstmt.executeQuery();
rs.next();
BankDTO dto2 = new BankDTO();
dto2.setUsername(rs.getString("username"));
dto2.setBalance(rs.getInt("balance"));
list.clear();
list.add(dto);
list.add(dto2);
//6. 사용한 리소스 정리
rs.close();
pstmt.close();
con.close();
}catch(Exception e){
//만약 오류가 생기면 오류 출력
System.out.println(e);
}
return list;
}
}
결과 사진