Spring - 계좌관리프로그램
- 돈을 이체하는 프로그램이다. 입금은 내계좌 잔액이 증가하고 출금은 감소한다.
- 먼저 테이블을 생성
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)
);
-> 여기에 몇개 샘플 데이터를 입력했다.
- 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 + "]";
}
}
- 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);
}
}
- 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>
- 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());
}
}
- 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);
}
}
- 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) 로 가면
-> 계좌정보를 알수있고 본인을 제외한 이체를 할수있다.
스타일에 조건을 줘서 입금은 빨강, 출금은 파란색으로 주었다.
- 심청이에게 만원을 이체해보자!
-> 잔액도 잘바뀌고 거래내역에 출력도잘된다.
- 심청이의 거래내역을 보자
-> 잘 구동되는것을 확인!
- 최종 통장 목록 (잔액이 잘바뀌는것을 확인)
댓글남기기