반응형

오늘은 JDBC(Java Database Connectivity)를 활용한 트랜잭션 관리 기법에 대해 심화 학습합니다. 트랜잭션 관리는 데이터 무결성과 시스템 안정성을 유지하는 데 매우 중요한 요소입니다.


1. 트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스에서 하나의 작업 단위를 나타내며, 여러 작업이 하나의 단위로 처리되어야 하는 경우 사용됩니다.
트랜잭션은 다음 네 가지 속성을 가지고 있습니다: ACID

  1. Atomicity (원자성): 작업은 모두 성공하거나 모두 실패해야 함.
  2. Consistency (일관성): 트랜잭션 전후의 데이터 상태는 일관성을 유지해야 함.
  3. Isolation (고립성): 트랜잭션 간의 작업은 독립적으로 처리됨.
  4. Durability (지속성): 트랜잭션이 성공하면 데이터는 영구적으로 저장됨.

2. JDBC를 사용한 트랜잭션 처리

1) 트랜잭션 기본 코드 구조

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

public class TransactionExample {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        String user = "your_username";
        String password = "your_password";

        Connection conn = null;

        try {
            // 데이터베이스 연결
            conn = DriverManager.getConnection(url, user, password);

            // 자동 커밋 끄기
            conn.setAutoCommit(false);

            // SQL 실행
            String sql1 = "INSERT INTO Employee (id, name, age) VALUES (1, 'Alice', 30)";
            String sql2 = "INSERT INTO Employee (id, name, age) VALUES (2, 'Bob', 25)";

            try (PreparedStatement pstmt1 = conn.prepareStatement(sql1);
                 PreparedStatement pstmt2 = conn.prepareStatement(sql2)) {

                pstmt1.executeUpdate();
                pstmt2.executeUpdate();

                // 트랜잭션 커밋
                conn.commit();
                System.out.println("트랜잭션이 성공적으로 커밋되었습니다.");
            }
        } catch (SQLException e) {
            try {
                if (conn != null) {
                    // 트랜잭션 롤백
                    conn.rollback();
                    System.out.println("트랜잭션이 롤백되었습니다.");
                }
            } catch (SQLException rollbackEx) {
                rollbackEx.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException closeEx) {
                closeEx.printStackTrace();
            }
        }
    }
}

2) 코드 설명

  1. setAutoCommit(false): 자동 커밋을 비활성화하여 트랜잭션을 수동으로 제어합니다.
  2. commit(): 모든 작업이 성공했을 때 트랜잭션을 적용합니다.
  3. rollback(): 작업 중 오류가 발생했을 때 이전 상태로 되돌립니다.
  4. try-with-resources: PreparedStatement 자원을 안전하게 관리합니다.

3. 트랜잭션 관리 시 주의 사항

  1. 동시에 여러 트랜잭션을 열지 말 것: 데이터 충돌을 방지합니다.
  2. 예외 처리 철저히 하기: 트랜잭션 실패 시 반드시 롤백해야 합니다.
  3. DB 연결 자원 관리: 연결을 열고 닫는 순서를 항상 확인하세요.

4. 실무 활용 사례

트랜잭션을 통한 주문 시스템 처리

주문 시스템에서 다음 작업들이 단일 트랜잭션으로 처리되어야 합니다:

  1. 주문 테이블에 주문 생성.
  2. 재고 감소.
  3. 결제 기록 생성.

트랜잭션을 통해 작업이 성공적으로 처리되지 않으면 모든 작업을 되돌려야 데이터 무결성을 보장할 수 있습니다.


5. 트랜잭션의 대안: Spring Framework

JDBC로 직접 트랜잭션을 관리하는 것은 번거롭습니다.
대규모 프로젝트에서는 Spring FrameworkTransactionManager를 사용하는 것이 더 효율적입니다.

@Service
public class OrderService {
    @Transactional
    public void processOrder(Order order) {
        // 주문 생성
        orderRepository.save(order);

        // 재고 감소
        stockService.reduceStock(order.getProductId(), order.getQuantity());

        // 결제 처리
        paymentService.processPayment(order);
    }
}

Spring의 @Transactional 어노테이션을 사용하면 자동으로 트랜잭션이 관리됩니다.

반응형

+ Recent posts