๐Ÿ’ป

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ - [Spring] DB์—ฐ๋™ / ์‹ค์Šต:์€ํ–‰(Bank) ํ”„๋กœ๊ทธ๋žจ ๋ณธ๋ฌธ

KITRI/SPRING

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ - [Spring] DB์—ฐ๋™ / ์‹ค์Šต:์€ํ–‰(Bank) ํ”„๋กœ๊ทธ๋žจ

๋˜ํšจ๋‹ˆ 2020. 7. 27. 14:20

DB ์—ฐ๋™์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

 

 

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

.zipํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

 

์••์ถ• ํ’€์–ด์„œ .jarํŒŒ์ผ์„ dbLib(workspace์— dbLibํด๋”๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค)ํด๋” ์•ˆ์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

mybatis-3.5.5.jar
1.66MB
mybatis-spring-1.3.2.jar
0.05MB
ojdbc6.jar
2.05MB

 

Window> Preference > User Libraries ์— SpringDB๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. 

 

Add External JARs... workspace์˜ dbLib์— ์žˆ๋Š” .jarํŒŒ์ผ๋“ค ์„ ํƒ

Apply and Closeํ•˜๊ณ  ๋‹ซ๊ธฐ

 

BankPro ํ”„๋กœ์ ํŠธ ํด๋”์— Build Path > User Library ํ•œ ํ›„ ์„ ํƒํ•˜๊ณ  Finish

 

 

 

 

 

 

mybatis-spring API

http://mybatis.org/spring/

 

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 : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค]

BANKํ…Œ์ด๋ธ”

[ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ]

์ „์ฒด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ

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

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>

 

1. ๊ณ„์ขŒ๊ฐœ์„ค
2. ์ž…๊ธˆ
์ถœ๊ธˆ
5. ์ „์ฒด์กฐํšŒ

 

๋ฐ˜์‘ํ˜•
Comments