DB(baek)

2021-12-02 40transaction,JDBC42,43

Hesitater 2021. 12. 2. 11:20
728x90

2021-12-02

 

 

40transaction,

JDBC42,JDBC43

 

 

 

 

 

 

 

 

 

 

★40transaction.sql

 

ranscation : 하나의 업무 단위

보통 예를 돈을 송금하는 것을 한다

-- 예 : 돈을 송금
-- 1. 하나의 계좌에서 출금
-- 2. 또 다른 계좌에 입금

출금 과 입금이 다되어야 송금이 끝남 출금은 됬는데 입금이 안되면
출금한돈을 계좌로 다시 넣어야함

그걸 sql과 JDBC에서 



초기상태

CREATE TABLE mytable29Bank (
id INT PRIMARY KEY AUTO_INCREMENT,
    money INT NOT NULL
);

INSERT INTO  mytable29Bank (money) VALUES (10000),(20000);

SELECT * FROM mytable29Bank;

1 - 10000
2 - 20000


테이블의 데이터를 변경 시
insert, update, delete

-- auto COMMIT disable 
SET autocommit = 0; -- disable = 0 이되는 상태


commit이라는 명령어를 내려야 완성된다. (COMMIT을 해야 테이블에 반영된다)
하나의 transaction을 


이 데이터를 보는 사람은 COMMIT


COMMIT을 한 이후에 ROLLBACK은 되지 않습니다.

-- auto commit 활성화
SET autocommit = 1;

 

 

 

40transaction.sql

 

USE test;


-- transaction : 하나의 업무 단위
-- 예 : 돈을 송금
-- 1. 하나의 계좌에서 출금
-- 2. 또 다른 계좌에 입금


CREATE TABLE mytable29Bank (
	id INT PRIMARY KEY AUTO_INCREMENT,
    money INT NOT NULL
);


INSERT INTO  mytable29Bank (money) VALUES (10000),(20000);

SELECT * FROM mytable29Bank;

-- 1번 계좌에서 2번 계좌로 5000원 송금업무

-- 1) 1번 계좌에서 출금
UPDATE mytable29Bank SET money = 5000 WHERE id = 1;
-- 2) 2번 계좌에 입금
UPDATE mytable29Bank SET  money = 25000 WHERE id = 2;

-- 초기값 세팅
UPDATE mytable29Bank SET money = 10000 WHERE id = 1;
UPDATE mytable29Bank SET  money = 20000 WHERE id = 2;

-- auto COMMIT disable
SET autocommit = 0; -- disable = 0 이되는 상태

-- 다시 5000원 송금 1 -> 2
-- 1) 1번 계좌에서 출금
UPDATE mytable29Bank SET money = 5000 WHERE id = 1;
SELECT * FROM mytable29Bank;
-- 3) 번개 맞음(우리는 이전상태로 돌려야함)
ROLLBACK; -- 이전 상태로 원복

-- 2) 2번 계좌에 입금 -- 번개 맞았으니 실행 되면 안됨
-- UPDATE mytable29Bank SET  money = 25000 WHERE id = 2;


-- 다시 날씨 좋은 날 5000원 송금 1 -> 2
-- 1) 1번 계좌에서 출금
UPDATE mytable29Bank SET money = 5000 WHERE id = 1;
SELECT * FROM mytable29Bank;

-- 2) 2번 계좌에 입금 -- 
 UPDATE mytable29Bank SET  money = 25000 WHERE id = 2;
SELECT * FROM mytable29Bank;

-- 3) 업무 완료 - table에 반영
COMMIT;
SELECT * FROM mytable29Bank;

ROLLBACK; -- commit 이후 ROLLBACK은 적용 안됨

-- auto commit 활성화
SET autocommit = 1;

UPDATE mytable29Bank SET money = 30000 WHERE id = 1;
SELECT * FROM mytable29Bank;

ROLLBACK; -- 자동 커밋활성 상태라서 ROLLBACK이 안됨

 

처음 mytable29Bank 만들고 초기값 넣은 상태

 

예를 들어보통 방식이

1번계좌에서 5천원 출금하고 2번계좌에 5천원 입금한다.

출,입금 한후 mytable29Bank 상태

 

값을 다시 10000,20000 로 초기화 한후

만약 출금하고 그 다음에 어떤 문제가 생겼을때 출금한 돈을 다시 돌려 놓아야 한다.

지금 mariadb는 돌릴수 없게 자동으로 반영되게 해놓았는데 자동으로 반영된상태를

자동으로 반영하지 않도록 하는 명령어

-- auto COMMIT disable
SET autocommit = 0; -- disable = 0 이되는 상태

이걸 실행한후

다시 송금 업무를 진행해 보겠습니다. 그런데 그 중간에 번개맞음(그냥 어떤문제를 표현)  번개 맞기전에 SELECT 해보면

id=1 에서 5천원이 빠져 나간 상태입니다.

우리가 번개맞았을때  그 이전 상태로 돌려야합니다.

그떄 명령어가  ROLLBACK; 이라는 명령어입니다.

ROLLBACK을 실행한후 mytable29Bank 상태를 보면 다시 5천원이 들어와있습니다.

 

다시 날씨가 좋은날 송금을 시도하였습니다.

성공했습니다. 그런데 이 업무가 테이블에 실제로 우리 눈에는 반영 된것처럼 보이지만 반영된게 아니다

transcation이 완성된 상태가아니다 transcation은 언제 완성되냐면 반영하라는 명령어를 써야 반영된다

그게 commit이라는 명령어이다. (SET autocommit = 0;) 아까 오토커밋을 비활성화 해놓고 업무가 끝나면 수동으로 반영 시켜줘야 한다. 그게 COOMIT; 이라는 명령어이다. 이 명령어를 실행해야 실제로 테이블에 반영이 됩니다.

 

 

우리는 커밋하기전에도 저렇게 보였고 커밋한 이후에도 저렇게 보이지만 저 데이터를 보고 있는사람은

쿼리를 날리고 있는사람만 커밋하기 이전의 셀렉트한 결과가 저거다 (이것저것...)

커밋하기 이전의 셀렉트한 결과가 지금 쿼리를 날리고 있는 세션에서만 확인할 수 있고  다른 세션에서는 10000원,20000원으로 남아있습니다. (테이블의 반영이 안되있기 때문에)

결론은 커밋을해야 테이블에 반영이 되고 현재세션 또는 다른 세션에서도 5천원 2만5천원으로 보입니다.

그러면 자동으로  커밋게하지 않고  우리가 수동으로 커밋하는 방법을 JDBC로 완성을 해야합니다.

오토 커밋이 필요한 경우는

SET autocommit = 1;

 

 

 

 

○결과값

 

 

 

 

★JDBC42Servlet,Bank , BankDao, v42.jsp

 

예시로 복잡하지 않게

 

1번계좌에서 2번계좌로 송금하는 

 

// 2. request 분석/가공

// 3. business logic

// 3.1 1번 출금

// 3.2 2번 입금

// 3.99 commot

// 4. add attribute

// 5. forward/redirect

출금과 입금사이의 문제가 생기면 롤백을 해야한다는 생각이 필요

 

JDBC42Servlet 초반에 문제 없을시

package jdbc11;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import jdbc11.bean.Bank;
import jdbc11.dao.BankDao;

/**
 * Servlet implementation class JDBC42Servlet
 */
@WebServlet("/jdbc11/s42")
public class JDBC42Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public JDBC42Servlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// v42 forword
		String path = "/WEB-INF/view/jdbc11/v42.jsp";
		request.getRequestDispatcher(path).forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 0. 사전 작업
		ServletContext application = request.getServletContext();
		DataSource ds = (DataSource) application.getAttribute("dbpool");
		BankDao dao = new BankDao();

		// 2. request 분석, 가공
		String moneyStr = request.getParameter("money");
		int money = Integer.parseInt(moneyStr);

		// 3. business logic( 주로 db작업)
		// 3. 0 auto commit disable
		// 3.1 1번 출금

		try (Connection con = ds.getConnection()) {

			Bank bank1 = dao.getBankById(con, 1); // 1번 계좌 조회
			bank1.setMoney(bank1.getMoney() - money);

			dao.update(con, bank1); // 1번 계좌 update
			
			// 문제 발생
			

			// 3.2 2번 입금
			Bank bank2 = dao.getBankById(con, 2); // 2번 계좌 조회
			bank2.setMoney(bank2.getMoney() + money);

			dao.update(con, bank2); // 2번 계좌 update(입금)

		} catch (Exception e) {
			e.printStackTrace();
		}

		// 3.99 commit

		// 4. setattribute

		// 5. forward/ redirect

	}

}

 

JDBC42Servlet 중반부 (문제 발생 시킴 1번계좌와 2번 계좌 사이에서

String a = "a";

Integer.parseInt(a); 로 numberformatexception 발생시키게

package jdbc11;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import jdbc11.bean.Bank;
import jdbc11.dao.BankDao;

/**
 * Servlet implementation class JDBC42Servlet
 */
@WebServlet("/jdbc11/s42")
public class JDBC42Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public JDBC42Servlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// v42 forword
		String path = "/WEB-INF/view/jdbc11/v42.jsp";
		request.getRequestDispatcher(path).forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 0. 사전 작업
		ServletContext application = request.getServletContext();
		DataSource ds = (DataSource) application.getAttribute("dbpool");
		BankDao dao = new BankDao();

		// 2. request 분석, 가공
		String moneyStr = request.getParameter("money");
		int money = Integer.parseInt(moneyStr);

		// 3. business logic( 주로 db작업)
		
		
		// 3.1 1번 출금

		try (Connection con = ds.getConnection()) {
			// 3. 0 auto commit disable
			
			
			Bank bank1 = dao.getBankById(con, 1); // 1번 계좌 조회
			bank1.setMoney(bank1.getMoney() - money);

			dao.update(con, bank1); // 1번 계좌 update
			
			// 문제 발생
			String a = "a";
			Integer.parseInt(a);

			// 3.2 2번 입금
			Bank bank2 = dao.getBankById(con, 2); // 2번 계좌 조회
			bank2.setMoney(bank2.getMoney() + money);

			dao.update(con, bank2); // 2번 계좌 update(입금)

			// 3.99 commit
		
			
		} catch (Exception e) {
			e.printStackTrace();
		}


		// 4. setattribute

		// 5. forward/ redirect

	}

}

 

 

JDBC42Servlet 후반부(문제생길시)

Connection con = null; 밖에서 사용해서 밖으로 빼고 Try with resource 구문 못써서

close 해줘야 하면서 그걸 다시 try catch문으로 잡고잡는다. + nullpoint 익셉션이나 rollback 하다가도 익센션나면 try catch 로 잡아야함

package jdbc11;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import jdbc11.bean.Bank;
import jdbc11.dao.BankDao;

/**
 * Servlet implementation class JDBC42Servlet
 */
@WebServlet("/jdbc11/s42")
public class JDBC42Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public JDBC42Servlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// v42 forword
		String path = "/WEB-INF/view/jdbc11/v42.jsp";
		request.getRequestDispatcher(path).forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 0. 사전 작업
		ServletContext application = request.getServletContext();
		DataSource ds = (DataSource) application.getAttribute("dbpool");
		BankDao dao = new BankDao();

		// 2. request 분석, 가공
		String moneyStr = request.getParameter("money");
		int money = Integer.parseInt(moneyStr);

		// 3. business logic( 주로 db작업)
		
		
		// 3.1 1번 출금
		Connection con = null;
				
		try  {
			con = ds.getConnection();
			// 3. 0 auto commit disable
			con.setAutoCommit(false);
			
			Bank bank1 = dao.getBankById(con, 1); // 1번 계좌 조회
			bank1.setMoney(bank1.getMoney() - money);

			dao.update(con, bank1); // 1번 계좌 update
			
			// 문제 발생
	//		String a = "a";
	//	Integer.parseInt(a);

			// 3.2 2번 입금
			Bank bank2 = dao.getBankById(con, 2); // 2번 계좌 조회
			bank2.setMoney(bank2.getMoney() + money);

			dao.update(con, bank2); // 2번 계좌 update(입금)

			// 3.99 commit
			con.commit();
			
		} catch (Exception e) {
			e.printStackTrace();
			
			if (con != null) {
				try {
					con.rollback();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		} finally {
			if ( con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}


		// 4. setattribute

		// 5. forward/ redirect

	}

}


Bank 빈

package jdbc11.bean;

public class Bank {
	private int id;
	private int money;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	
	
	
}


BankDao

package jdbc11.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import jdbc11.bean.Bank;

public class BankDao {

	public Bank getBankById(Connection con, int id) {
		
		String sql = "SELECT id, money FROM mytable29Bank WHERE id = ? ";
		
		try (PreparedStatement pstmt = con.prepareStatement(sql)) {
			pstmt.setInt(1, id);
			
			try (ResultSet rs = pstmt.executeQuery()) {
				if (rs.next()) {
					Bank bank = new Bank();
					
					bank.setId(id);
					bank.setMoney(rs.getInt("money"));
					
					return bank;
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		return null;
	}

	public void update(Connection con, Bank bank) {
		String sql = "UPDATE mytable29Bank"
				+ " SET money = ? "
				+ " WHERe id = ? ";
		
		try (PreparedStatement pstmt = con.prepareStatement(sql)) {
			pstmt.setInt(1, bank.getMoney());
			pstmt.setInt(2, bank.getId());
			
			pstmt.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	
	}
}


v42.jsp

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


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<style>
input::-webkit-input-placeholder {
  color: red;
  font-style: italic;
}
</style>
<title>Insert title here</title>
</head>
<body>

<h1>1번계좌에서 2번 계좌로 송금</h1>

<form action="" method="post">
	<input type="number" name="money" placeholder="금액을 입력" value="0"> 원<input type="submit" value="송금">
</form>



<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

 

 

○결과값

처음 mytable28Bank 값

초기 JDBC42Servlet 실행시화면

여기서 1500원을 송금해보면 id=1에서 1500원 출금되었고 id=2에서 1500 입금되었음

 

 

중반부 문제 발생시키는 JDBC42Servlet 코드 작성후

실행하기전 mytable29table 상태

 

500원을 송금 시켜보겠습니다. 출금이 되었는데 입금이 되지 않았습니다.

 

그리하여 문제들이 발생하면 ROLLBACK 되게 해야합니다.

con.rollback(); 을 하고싶어서 Connection을 밖으로 뺴느라고 finally블록, 널포인트익셉션방지한다고 if문도 추가되고 

체크드 익셉션도 추가되었다.

중간과정에서 문제가생겨도 출금은 되지만 입금이 안되었다면 후반부에 작성한 코드로 인하여

중간에 문제 발생시 ROLLBACK되어 금액이 그대로입니다

 

그리고 문제가되는 코드들을 주석처리하고 다시 실행해보고 입,출금을 해보면 전송이 잘됩니다.

 

//		String a = "a";
//		Integer.parseInt(a);

 

 

 

 

★JDBC43Serlvet

 

 

JDBC42Servlet과 유사한 예제

 

계좌 2에서 1로 입금

 

 

JDBC43Servlet

package jdbc11;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import jdbc11.bean.Bank;
import jdbc11.dao.BankDao;

/**
 * Servlet implementation class JDBC43Serlvet
 */
@WebServlet("/jdbc11/s43")
public class JDBC43Serlvet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public JDBC43Serlvet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// v43으로 이동
		String path = "/WEB-INF/view/jdbc11/v43.jsp";
		request.getRequestDispatcher(path).forward(request, response);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 0. 
		ServletContext application = request.getServletContext();
		DataSource ds = (DataSource) application.getAttribute("dbpool");
		BankDao dao = new BankDao();
		
		// 2.
		int money = Integer.parseInt(request.getParameter("money"));
		
		// 3.
		Connection con = null;
		
		try {
			con = ds.getConnection();
			
			//   3.0 auto commit disabled (false)
			con.setAutoCommit(false);
			//   3.1 2번계좌 출금
			Bank bank2 = dao.getBankById(con, 2);
			bank2.setMoney(bank2.getMoney() - money);
			dao.update(con, bank2);
			
			//   3.1 1번계좌 입금
			Bank bank1 = dao.getBankById(con, 1);
			bank1.setMoney(bank1.getMoney() + money);
			dao.update(con, bank1);
			
			//   3.99 commit
			con.commit();
		} catch (Exception e) {
			e.printStackTrace();
			//   3.exception rollback
			if (con != null) {
				try {
					con.rollback();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		// 4,5
	}

}

 

 

v43.jsp

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


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="<%=request.getContextPath()%>/resource/css/mystyle.css">
<style>
input:-ms-input-placeholder {
  color: red;
  font-style: italic;
  background-color : violet;
}
</style>

<title>Insert title here</title>
</head>
<body>

<!-- .container>.row>.col>h1{2번 계좌에서1번 계좌로} -->
<div class="container">
	<div class="row">
		<div class="col">
			<h1 class="myHeader tb">2번 계좌에서1번 계좌로</h1> <br>
			<form action="" method="post">
  				<input type="number" name="money" value="0" placeholder="입금할 금액"> 원 
  				<input class="myBtn" type="submit" value="송금">
			</form>
			
		</div>
	</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

 

 

 

○결과값

 

입금하기전 mytable29Bank 정보들

JDBC43Servlet 실행시

 

1500원보내보면 잘보내짐