• 돈을 이체하는 프로그램이다. 입금은 내계좌 잔액이 증가하고 출금은 감소한다.
  1. 먼저 테이블을 생성
create table tbl_account(
	ano char(4) primary key,
    aname varchar(20) not null,
    openDate datetime default now(),
    balance double
);

create table tbl_trade(
	tid int auto_increment primary key,
    ano char(4),  
    type char(4), 
    tno char(4),
    amount double,
    tradeDate datetime default now(),
	foreign key(ano) references tbl_account(ano),
    foreign key(tno) references tbl_account(ano) 
);

-> 여기에 몇개 샘플 데이터를 입력했다.


  1. VO 생성

AccountVO

package com.example.domain;

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

public class AccountVO {
	private String ano;
	private String aname;
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Asia/Seoul")
	private Date openDate;
	private double balance;
	public String getAno() {
		return ano;
	}
	public void setAno(String ano) {
		this.ano = ano;
	}
	public String getAname() {
		return aname;
	}
	public void setAname(String aname) {
		this.aname = aname;
	}
	public Date getOpenDate() {
		return openDate;
	}
	public void setOpenDate(Date openDate) {
		this.openDate = openDate;
	}
	public double getBalance() {
		return balance;
	}
	public void setBalance(double balance) {
		this.balance = balance;
	}
	@Override
	public String toString() {
		return "AccountVO [ano=" + ano + ", aname=" + aname + ", openDate=" + openDate + ", balance=" + balance + "]";
	}
}

TradeVO

package com.example.domain;

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

public class TradeVO extends AccountVO{
	private int tid;
	private String ano;
	private String tno;
	private String type;
	private double amount;
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Asia/Seoul")
	private Date tradeDate;
	
	public int getTid() {
		return tid;
	}
	public void setTid(int tid) {
		this.tid = tid;
	}
	public String getAno() {
		return ano;
	}
	public void setAno(String ano) {
		this.ano = ano;
	}
	public String getTno() {
		return tno;
	}
	public void setTno(String tno) {
		this.tno = tno;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public double getAmount() {
		return amount;
	}
	public void setAmount(double amount) {
		this.amount = amount;
	}
	public Date getTradeDate() {
		return tradeDate;
	}
	public void setTradeDate(Date tradeDate) {
		this.tradeDate = tradeDate;
	}
	@Override
	public String toString() {
		return "TradeVO [tid=" + tid + ", ano=" + ano + ", tno=" + tno + ", type=" + type + ", amount=" + amount
				+ ", tradeDate=" + tradeDate + "]";
	} 
}

  1. DAO, Impl

AccountDAO

package com.example.dao;

import java.util.List;

import com.example.domain.AccountVO;

public interface AccountDAO {
	public List<AccountVO> list();
	public AccountVO read(String ano);
	public void updateBanlance(String ano, double amount);
}

AccountDAOImpl

package com.example.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.example.domain.MessageVO;

@Repository
public class MessageDAOImpl implements MessageDAO{

	@Autowired
	SqlSession session;
	String namespace= "com.example.mapper.MessageMapper";
	
	@Override
	public List<MessageVO> sendList(String uid) {
		return session.selectList(namespace+".sendList", uid);
	}
 
	@Override
	public void insert(MessageVO vo) {
		session.insert(namespace+".insert",vo);
		
	}

	@Override
	public List<MessageVO> receiveList(String uid) {
		return session.selectList(namespace+".receiveList",uid);
	}

	@Override
	public MessageVO read(int mno) {
		return session.selectOne(namespace+".read" ,mno);
	}

	@Override
	public void updateReaddate(int mno) {
		session.update(namespace+ ".updateReaddate",mno);
		
	}

	@Override
	public void updateSendcnt(String uid) {
		session.update(namespace+".updateSendcnt",uid);
		
	}

	@Override
	public void updateReceivecnt(String uid) {
		session.update(namespace+".updateReceivecnt",uid);
		
	}
}

TradeDAO

package com.example.dao;

import java.util.List;

import com.example.domain.TradeVO;

public interface TradeDAO{
	//거래내역
	public List<TradeVO> list(String ano);
	
	//거래내역입력
	public void insert(TradeVO vo);

}

TradeDAOImpl

package com.example.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.example.domain.TradeVO;

@Repository
public class TradeDAOImpl implements TradeDAO  {
	@Autowired
	SqlSession session;
	String namespace="com.example.mapper.TradeMapper";

	@Override
	public List<TradeVO> list(String ano) {
		return session.selectList(namespace+".list",ano);
	}

	@Override
	public void insert(TradeVO vo) {
		session.insert(namespace+".insert",vo);
		
	}
}

  1. Mapper

AccountMapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.AccountMapper">
    <select id="list" resultType="com.example.domain.AccountVO">
        select * from tbl_account
    </select>
    <select id ="read" resultType="com.example.domain.AccountVO">
    	select * from tbl_account
    	where ano=#{ano}
    </select>
    <update id="updateBalance">
    	update tbl_account set balance=balance+#{amount}
    	where ano=#{ano}
    </update>
</mapper>

TradeMapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.TradeMapper">
    <select id="list" resultType="com.example.domain.TradeVO">
		select t.*, a.aname
		from tbl_trade t, tbl_account a
		where t.ano=#{ano} and t.tno=a.ano
		order by tid desc
    </select>
    <insert id="insert">
    	insert into tbl_trade(ano, type, tno, amount)
    	values(#{ano},#{type},#{tno},#{amount})
    </insert>
</mapper>

  1. Service

TradeService

package com.example.service;

import com.example.domain.TradeVO;

public interface TradeService {
	public void insert(TradeVO vo);
	
}

TradeServiceImpl

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.dao.AccountDAO;
import com.example.dao.TradeDAO;
import com.example.domain.TradeVO;

@Service
public class TradeServiceImpl implements TradeService {
	@Autowired
	AccountDAO adao;
	
	@Autowired
	TradeDAO tdao;
	
	@Transactional
	@Override
	public void insert(TradeVO vo) {
		String ano = vo.getAno();
		String tno = vo.getTno();
		vo.setType("출금");
		tdao.insert(vo); //거래 출금
		adao.updateBanlance(ano, vo.getAmount() * -1);
		
		vo.setAno(tno);
		vo.setTno(ano);
		vo.setType("입금");
		tdao.insert(vo); //거래 입금
		adao.updateBanlance(tno, vo.getAmount());
	}
}

  1. Controller

AccountController

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.dao.AccountDAO;
import com.example.domain.AccountVO;

@Controller
@RequestMapping("/account")
public class AccountController {
	@Autowired
	AccountDAO dao;
	
	@RequestMapping("/list")
	public String list(Model model){
		model.addAttribute("list",dao.list());
		model.addAttribute("pageName","account/list.jsp");
		return "/home";
	}
	
	@RequestMapping("/read")
	public String read(Model model,String ano){
		model.addAttribute("list",dao.list());
		model.addAttribute("vo",dao.read(ano));
		model.addAttribute("pageName","account/read.jsp");
		return "/home";
	}
	
	@RequestMapping("/getBalance")
	@ResponseBody
	public double getBalance(String ano){
		AccountVO vo = dao.read(ano);
		return vo.getBalance();
	}
}

TradeController

package com.example.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.example.dao.TradeDAO;
import com.example.domain.TradeVO;
import com.example.service.TradeService;

@RestController
@RequestMapping("/trade")
public class TradeController {
	@Autowired
	TradeDAO dao;
	
	@Autowired
	TradeService service;
	
	
	@RequestMapping("/list")
	public List<TradeVO> list(String ano){
		return dao.list(ano);
	}
	
	@RequestMapping(value="/insert" , method=RequestMethod.POST)
	public void insert(TradeVO vo){
		service.insert(vo);
	}
}

  1. view

list

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<div id="page">
	<h1>통장목록</h1>
	<table>
		<tr class="title">
			<td width=100>계좌번호</td>
			<td width=100>계좌주명</td>
			<td width=200>통장개설일</td>
			<td width=100>잔액</td>
			<td width=100>통장내역</td>
		</tr>
		<c:forEach items="${list}" var="vo">
			<tr class="row">
				<td>${vo.ano }</td>
				<td>${vo.aname }</td>
				<td><fmt:formatDate value ="${vo.openDate}" pattern ="yyyy-MM-dd HH:mm:ss"/></td>
				<td><fmt:formatNumber value ="${vo.balance}" pattern ="#,###"/></td>
				<td><button class="ybtn" onClick="location.href='read?ano=${vo.ano}'">통장내역</button></td>
			</tr>
		</c:forEach>
	</table>
</div>

read

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<div id="page">
	<h1>통장 거래 내역</h1>
	<table>
		<tr>
			<td class="title">계좌번호</td>
			<td width=100>${vo.ano}</td>
			<td class="title">계좌주명</td>
			<td width=100>${vo.aname}</td>
			<td class="title">잔액</td>
			<td width=100 id ="balance" style="color:red; font-weight:bold;">
				<span id="balance"><fmt:formatNumber value ="${vo.balance}" pattern ="#,###"/></span>
				<span id="realBalance" style="display:none">${vo.balance}</span>
			</td>
		</tr>
		<tr>
			<td class="title">이체정보</td>
			<td colspan=5>
				<select id="tno">
					<c:forEach items="${list}"  var="v">
						<c:if test="${vo.ano != v.ano}">
							<option value="${v.ano}">${v.aname} (${v.ano})</option>
						</c:if>
					</c:forEach>
				</select>
				<input id="amount" type ="text" size =10 style="margin-left:10px;"/><button class="ybtn" style="margin-left:10px;" id="btnTrans" balance="${vo.balance}">이체</button>
			</td>
		</tr>
	</table>
	<table id="tbl"></table>
	<script id="temp" type="text/x-handlebars-template">
		<tr class="title">
			<td width=100>계좌번호</td>
			<td width=100>계좌주명</td>
			<td width=50>.출금</td>
			<td width=100>금액</td>
			<td width=300>거래일</td>
		</tr>
		
			<tr class="row" style="">
				<td></td>
				<td></td>
				<td></td>
				<td></td>
				<td></td>
			</tr>
		
	</script>
	<script>
		Handlebars.registerHelper("display", function(amount){
			return amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
		});
		
		Handlebars.registerHelper("style", function(type){
			if(type=="입금"){
				return "color:red;";
			}else {
				return "color:blue;";
			}
		});
	</script>
</div>

<script>
	var ano="${vo.ano}";

	getList();
	
	$("#btnTrans").on("click",function(){
		var tno = $("#tno").val();
		var amount =$("#amount").val();
		var balacne  =$("#balance").val();
		var realBalance=$("#realBalance").html();
		
		//이체 금액이 숫자가 아니거나 입력되지않은경우
		if(amount.replace(/[0-9]/g,'') || amount==""){
			alert("이체금액을 숫자로 입력하세요!");
			$("#amount").focus();
			return;
		}else if(parseInt(amount)>parseInt(realBalance)){
			alert("잔액이 부족합니다! 현재잔액:"+realBalance);
			$("#amount").focus();
			return;
		} 
		//이체
		if(!confirm("이체하시겠습니까?")) return;
		$.ajax({
			type:"post",
			url: "/trade/insert",
			data: {ano:ano, tno:tno, amount:amount},
			success:function(){
				$.ajax({
					type:"get",
					url:"/account/getBalance",
					data: {ano:ano},
					success:function(data){
						$("#balance").html(data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','));
						$("#realBalance").html(data);
						$("#amount").val("");
						alert("이체완료!");
						getList();
					}
				})
				
			}
		})
	});

	//통장거래내역 출력함수
	function getList(){
	  $.ajax({
	     type : "get",
	     url : "/trade/list",
	     data: {ano:ano},
	     dataType: "json",
	     success:function(data){
	        var template = Handlebars.compile($("#temp").html());
	        $("#tbl").html(template(data));
	     }
	
		});
	}
</script>

통장목록

->각 계좌주명이보이고 개설일 계좌번호잔액이보인다. 통장내역(read) 로 가면

거래내역 -> 계좌정보를 알수있고 본인을 제외한 이체를 할수있다. 스타일에 조건을 줘서 입금은 빨강, 출금은 파란색으로 주었다.

  • 심청이에게 만원을 이체해보자!

거래1

-> 잔액도 잘바뀌고 거래내역에 출력도잘된다.

  • 심청이의 거래내역을 보자

거래2

-> 잘 구동되는것을 확인!

  • 최종 통장 목록 (잔액이 잘바뀌는것을 확인)

최종통장목록

태그:

카테고리:

업데이트:

댓글남기기