๐ป
์คํ๋ง ํ๋ ์์ํฌ - [Spring] DB์ฐ๋ / ์ค์ต:์ํ(Bank) ํ๋ก๊ทธ๋จ ๋ณธ๋ฌธ
์คํ๋ง ํ๋ ์์ํฌ - [Spring] DB์ฐ๋ / ์ค์ต:์ํ(Bank) ํ๋ก๊ทธ๋จ
๋ํจ๋ 2020. 7. 27. 14:20DB ์ฐ๋์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
mybatis-spring ์ถ๊ฐ
https://github.com/mybatis/spring/releases
Releases · mybatis/spring
Spring integration for MyBatis 3. Contribute to mybatis/spring development by creating an account on GitHub.
github.com
์์ถ ํ์ด์ .jarํ์ผ์ dbLib(workspace์ dbLibํด๋๋ฅผ ์์ฑํด์ฃผ์๋ค)ํด๋ ์์ ์ถ๊ฐํด์ค๋ค.
Window> Preference > User Libraries ์ SpringDB๋ก ์ถ๊ฐํด์ฃผ์๋ค.
Add External JARs... workspace์ dbLib์ ์๋ .jarํ์ผ๋ค ์ ํ
BankPro ํ๋ก์ ํธ ํด๋์ Build Path > User Library ํ ํ ์ ํํ๊ณ Finish
mybatis-spring API
mybatis-spring – MyBatis-Spring | Introduction
What is MyBatis-Spring? MyBatis-Spring integrates MyBatis seamlessly with Spring. This library allows MyBatis to participate in Spring transactions, takes care of building MyBatis mappers and SqlSessions and inject them into other beans, translates MyBatis
mybatis.org
Spring Framework
https://spring.io/projects/spring-framework#learn
Spring Framework
spring.io
[Oracle Sql Developer : ๋ฐ์ดํฐ๋ฒ ์ด์ค]
[ํ๋ก์ ํธ ํ์ผ ๋ฆฌ์คํธ]
BankDto.java
package com.java.bank.dto;
public class BankDto {
private int num;
private String id;
private String name;
private long balance;
public BankDto() {}
public BankDto(int num, String id, String name, long balance) {
super();
this.num = num;
this.id = id;
this.name = name;
this.balance = balance;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getBalance() {
return balance;
}
public void setBalance(long balance) {
this.balance = balance;
}
@Override
public String toString() {
return "BankDto [num=" + num + ", id=" + id + ", name=" + name + ", balance=" + balance + "]";
}
}
[interface] BankDao.java
package com.java.bank.dao;
import java.util.List;
import com.java.bank.dto.BankDto;
public interface BankDao {
public int makeAccount(BankDto bankDto);
public List<BankDto> showData();
public BankDto select(String id);
public int update(BankDto bankDto);
public long viewData(String id);
}
BankDaoImp.java
package com.java.bank.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import com.java.bank.dto.BankDto;
public class BankDaoImp implements BankDao {
private SqlSessionTemplate sqlSessionTemplate;
public BankDaoImp() {}
public BankDaoImp(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
@Override
public int makeAccount(BankDto bankDto) {
System.out.println(bankDto.toString());
// ๋ฆฌํด๊ฐ: 0(์คํจ) ์๋๋ฉด 1(์ฑ๊ณต)
return sqlSessionTemplate.insert("bank_insert", bankDto);
}
@Override
public List<BankDto> showData() {
return sqlSessionTemplate.selectList("bank_select_list");
}
@Override
public BankDto select(String id) {
return sqlSessionTemplate.selectOne("dao.BankMapper.bank_select", id);
}
@Override
public int update(BankDto bankDto) {
return sqlSessionTemplate.update("dao.BankMapper.update", bankDto);
}
@Override
public long viewData(String id) {
return sqlSessionTemplate.selectOne("bank_select_change", id);
}
}
[interface] BankUI.java
package com.java.bank.ui;
public interface BankUI {
public void execute();
}
โ
BankView.java
package com.java.bank.ui;
import java.util.List;
import java.util.Scanner;
import com.java.bank.aop.LogAspect;
import com.java.bank.dao.BankDao;
import com.java.bank.dto.BankDto;
public class BankView implements BankUI {
private BankDto bankDto;
private BankDao bankDao;
//DIํ๊ธฐ ์ํด ์์ฑ์์ setter๋ฉ์๋ ์์ฑ
public BankView() {}
public BankView(BankDto bankDto, BankDao bankDao) {
super();
this.bankDto = bankDto;
this.bankDao = bankDao;
}
public void setBankDao(BankDao bankDao) {
this.bankDao = bankDao;
}
public void setBankDto(BankDto bankDto) {
this.bankDto = bankDto;
}
@Override
public void execute() {
printMenu();
Scanner sc = new Scanner(System.in);
System.out.print("์ ํํ์ธ์: ");
int choice = sc.nextInt();
switch (choice) {
case 1: {
makeAccount();
break;
}
case 2: {
deposit();
break;
}
case 3: {
withdraw();
break;
}
case 4: {
viewChange();
break;
}
case 5: {
showAccount();
break;
}
default:
System.out.println("์๋ชป์
๋ ฅํ์
จ์ต๋๋ค.");
}
sc.close();
}
public void printMenu() {
System.out.println("~~~ MENU ~~~");
System.out.println("1.๊ณ์ข๊ฐ์ค");
System.out.println("2.์
๊ธ");
System.out.println("3.์ถ๊ธ");
System.out.println("4.์์ก์กฐํ");
System.out.println("5.์ ์ฒด์ถ๋ ฅ");
}
public void makeAccount() {
Scanner sc = new Scanner(System.in);
System.out.print("๊ณ์ข๋ฒํธ: ");
bankDto.setId(sc.next());
System.out.print("์ด๋ฆ: ");
bankDto.setName(sc.next());
System.out.print("์
๊ธ์ก: ");
bankDto.setBalance(sc.nextLong());
int check = bankDao.makeAccount(bankDto);
LogAspect.logger.info(LogAspect.logMsg + check);
sc.close();
}
public void showAccount() {
List<BankDto> bankList = bankDao.showData();
LogAspect.logger.info(LogAspect.logMsg + bankList.size());
for(int i=0; i<bankList.size(); i++) {
BankDto dto = bankList.get(i);
System.out.println(dto.toString());
}
}
public void deposit() {
Scanner sc = new Scanner(System.in);
System.out.print("๊ณ์ข๋ฒํธ: ");
String id = sc.next();
bankDto = bankDao.select(id);
LogAspect.logger.info(LogAspect.logMsg + bankDto);
if(bankDto!=null) {
System.out.print("์
๊ธ์ก: ");
long money = sc.nextLong();
bankDto.setBalance(bankDto.getBalance() + money);
int check = bankDao.update(bankDto);
//LogAspect.logger.info(LogAspect.logMsg + bankDto);
if(check > 0) {
System.out.println("์
๊ธ ์๋ฃํ์ต๋๋ค.");
}else {
System.out.println("์
๊ธ ๋์ง ์์์ต๋๋ค. \n๋ค์ ์๋ํด์ฃผ์ธ์.");
}
}else {
System.out.println("๊ณ์ข๋ฒํธ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
sc.close();
}
public void withdraw() {
Scanner sc = new Scanner(System.in);
System.out.print("๊ณ์ข๋ฒํธ:");
String id = sc.next();
bankDto = bankDao.select(id);
LogAspect.logger.info(LogAspect.logMsg + bankDto);
if(bankDto!=null) {
System.out.print("์ถ๊ธ์ก: ");
long money = sc.nextLong();
if(money <= bankDto.getBalance()) {
bankDto.setBalance(bankDto.getBalance() - money);
int check = bankDao.update(bankDto);
if(check > 0) {
System.out.println("์ถ๊ธ ์๋ฃํ์ต๋๋ค.");
}else {
System.out.println("์ถ๊ธ ๋์ง ์์์ต๋๋ค. \n ๋ค์ ์๋ํด์ฃผ์ธ์.");
}
}else {
System.out.println("์์ก์ด ๋ถ์กฑํฉ๋๋ค.");
}
}
sc.close();
}
public void viewChange() {
Scanner sc = new Scanner(System.in);
System.out.print("๊ณ์ข๋ฒํธ:");
String id = sc.next();
long balance = bankDao.viewData(id);
System.out.println("๋จ์ ์์ก์ " + balance + "์ ์
๋๋ค.");
}
}
BankMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.BankMapper">
<insert id="bank_insert" parameterType="com.java.bank.dto.BankDto">
insert into bank values(bank_num_seq.nextval, #{id}, #{name}, #{balance})
</insert>
<select id="bank_select_list" resultType="com.java.bank.dto.BankDto">
select * from bank
</select>
<select id="bank_select" resultType="com.java.bank.dto.BankDto" parameterType="String">
select * from bank where id = #{id}
</select>
<update id ="update" parameterType="com.java.bank.dto.BankDto">
update bank set balance = #{balance} where id=#{id}
</update>
<select id ="bank_select_change" resultType="long" parameterType="String">
select balance from bank where id = #{id}
</select>
</mapper>
LogAspect.java
package com.java.bank.aop;
import java.util.logging.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogAspect {
public static Logger logger = Logger.getLogger(LogAspect.class.getName());
public static final String logMsg = "LogMsg ~~~~~~~~~~~";
public Object advice(ProceedingJoinPoint joinPoint) {
Object obj = null;
try {
logger.info(logMsg + joinPoint.getTarget().getClass().getName() + "\t" + joinPoint.getSignature().getName());
obj = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
} //์๋์ผ๋ก closeํด์ฃผ๊ธฐ ๋๋ฌธ์ .close()ํ์ง ์์๋ ๋๋ค.
return obj;
}
}
appCTX.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- DB ์ค์ -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="java"/>
<property name="password" value="1234"/>
</bean>
<!-- MyBatis / WEBMVC SqlSessionFactoryBuilder - SqlSessionFactory - Session์ค์ -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:com/java/bank/dao/mapper/BankMapper.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean"/>
</bean>
<!-- BankDto ์์ฑ -->
<bean id="bankDto" class="com.java.bank.dto.BankDto"/>
<!-- BankDao ์์ฑ -->
<bean id="bankDaoImp" class="com.java.bank.dao.BankDaoImp">
<constructor-arg ref="sqlSessionTemplate"/>
</bean>
<!-- UI์์ฑ -->
<bean id="bankView" class="com.java.bank.ui.BankView">
<property name="bankDto" ref="bankDto"/>
<property name="bankDao" ref="bankDaoImp"/>
</bean>
<!-- ๊ณตํตํด๋์ค -->
<bean id="logAspect" class="com.java.bank.aop.LogAspect"/>
<!-- AOP ์ค์ -->
<aop:config>
<aop:aspect id="exAspect" ref="logAspect">
<aop:pointcut expression="within(com.java.bank.dao.*)" id="pMethod"/>
<aop:around method="advice" pointcut-ref="pMethod"/>
</aop:aspect>
</aop:config>
</beans>
โ
MainClass.java
package com.java.bank.main;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.java.bank.ui.BankUI;
public class MainClass {
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("appCTX.xml");
BankUI bankUI = (BankUI) ctx.getBean("bankView");
bankUI.execute();
ctx.close();
}
}
BankMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.BankMapper">
<insert id="bank_insert" parameterType="com.java.bank.dto.BankDto">
insert into bank values(bank_num_seq.nextval, #{id}, #{name}, #{balance})
</insert>
</mapper>