본문 바로가기
DB/Code

CODE [day_05] DB / 08_1. Transaction (COMMIT, ROLLBACK) 필요성을 확인하는 예제 - 신용카드 발급 시에 포인트를 지급하기

by 파프리카_ 2020. 8. 12.
728x90
반응형

트랜잭션 처리가 되지 않았을 때, 발생되는 문제를 확인하는 예제

SQL

 

CARD TABLE 생성

 

CREATE TABLE card(
  id	VARCHAR2(100)	PRIMARY KEY,
  name	VARCHAR2(100)	NOT NULL
  );

 

POINT TABLE 생성

CREATE TABLE point(
  id		VARCHAR2(100)	PRIMARY KEY,
  point_type	VARCHAR2(100)	NOT NULL,
  point		NUMBER		NOT NULL
);

 

 

 


JAVA JDBC

 

TestDAO class (main class)

카드 테이블에 카드 정보가 insert되고,  포인트 테이블에 포인트 정보가 insert될 때,
문제가 발생되었을 경우 포인트 정보는 등록되지 않고 , 카드 정보만 존재하는 경우를 만들어 본다.

--> 논리적 오류

 

/TestTransaction1.java

package test;

import model.CardDAO;

/**
 * 트랜잭션 처리가 되지 않았을 때, 발생되는 문제를 확인하는 예제
 * 카드 테이블에 카드 정보가 insert되고,
 * 포인트 테이블에 포인트 정보가 insert될 때,
 * 문제가 발생되었을 경우 포인트 정보는 등록되지 않고 
 * 카드 정보만 존재하는 경우를 만들어 본다.
 * --> 논리적 오류
 * @author yewoo
 *
 */
public class TestTransaction1 {
	public static void main(String[] args) {
		try {
			CardDAO dao = new CardDAO();
			
			// 카드 생성과 포인트 부여하는 기능
			// registerCardAndPoint(id, name, point_type, point)
            		dao.registerCardAndPoint("java", "아이유", "cgv", 1000);
            
            		// 오류 ! -> 카드는 발급 OK, 포인트는 발급 X !
			dao.registerCardAndPoint("java2", "복숭아", "롯데", 1000);
			
            		System.out.println("카드와 포인트 INSERT 완료! \n");
                    
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

> 오류가 없을 때 결과

 

[ Card TABLE ]

[ Point TABLE ]

 

> 논리적 오류가 있을 때 결과 (CardDAO class에서 insertPointSql 쿼리문에 오류 발생시킴)

 

[ Card TABLE ] **java2 Card는 생성이 되었으나**

[ Point TABLE ] **java2에 Point가 들어오지 않았다 ! **


DAO ( Data Access Object ) class

: 데이베이스 연동 로직을 정의한 객체

하나의 Connection 내에서 여러 개의 기능을 넣을 수 있다 !

 

CardDAO

카드와 포인트 정보를 함께 등록하는 메서드를 구현 : registerCardAndPoint
 --> transaction 처리의 필요성을 확인하는 예제

 

** Connect (pstmt 1 - 카드 등록, pstmt 2 - 포인트 등록)

두번째 test 실행 시, pstmt2에 오류가 생기도록 insertPointSql문을 이상하게 쓴다.

 

/CardDAO.java

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import common.DbInfo;

/**
 * 카드와 포인트 정보를 함꼐 등록하는 메서드를 구현
 * -> transaction 처리의 필요성을 확인하는 예제
 * @author yewoo
 *
 */
public class CardDAO {
	
	//생성자
	public CardDAO() throws ClassNotFoundException {
		Class.forName(DbInfo.DRIVER_NAME);
	}
	
	//closeAll
	public void closeAll(PreparedStatement pstmt, Connection con) throws SQLException {
		if (pstmt != null)
			pstmt.close();
		if (con != null)
			con.close();
	}

	//registerCardAndPoint method
	public void registerCardAndPoint(String id, String name, String point_type, int point) throws SQLException {
		Connection con = null;
		PreparedStatement pstmt = null;
		try {
			con = DriverManager.getConnection(DbInfo.URL, DbInfo.USER, DbInfo.PASS);
			
			// 1. card table에 insert
			String insertCardSql = "INSERT INTO card(id, name) "+
									"VALUES(?, ?)";

			pstmt = con.prepareStatement(insertCardSql);
			pstmt.setString(1, id);
			pstmt.setString(2, name);
			int resultCard = pstmt.executeUpdate();
			System.out.println("CART INSERT SUCCESS --> " + resultCard);
			pstmt.close();		
					
			// 2. point table에 insert
			String insertPointSql = "INSERT INTO point(id, point_type, point) "+
									"VALUES(?, ?, ?)";
			pstmt = con.prepareStatement(insertPointSql);
			pstmt.setString(1, id);
			pstmt.setString(2, point_type);
			pstmt.setInt(3, point);
			int resultPoint = pstmt.executeUpdate();
			System.out.println("POINT INSERT SUCCESS --> " + resultPoint);

		} finally {
			closeAll(pstmt, con);
		}
	}
}
728x90
반응형