반응형
오늘은 JDBC(Java Database Connectivity)를 활용한 트랜잭션 관리 기법에 대해 심화 학습합니다. 트랜잭션 관리는 데이터 무결성과 시스템 안정성을 유지하는 데 매우 중요한 요소입니다.
1. 트랜잭션(Transaction)이란?
트랜잭션은 데이터베이스에서 하나의 작업 단위를 나타내며, 여러 작업이 하나의 단위로 처리되어야 하는 경우 사용됩니다.
트랜잭션은 다음 네 가지 속성을 가지고 있습니다: ACID
- Atomicity (원자성): 작업은 모두 성공하거나 모두 실패해야 함.
- Consistency (일관성): 트랜잭션 전후의 데이터 상태는 일관성을 유지해야 함.
- Isolation (고립성): 트랜잭션 간의 작업은 독립적으로 처리됨.
- 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) 코드 설명
- setAutoCommit(false): 자동 커밋을 비활성화하여 트랜잭션을 수동으로 제어합니다.
- commit(): 모든 작업이 성공했을 때 트랜잭션을 적용합니다.
- rollback(): 작업 중 오류가 발생했을 때 이전 상태로 되돌립니다.
- try-with-resources: PreparedStatement 자원을 안전하게 관리합니다.
3. 트랜잭션 관리 시 주의 사항
- 동시에 여러 트랜잭션을 열지 말 것: 데이터 충돌을 방지합니다.
- 예외 처리 철저히 하기: 트랜잭션 실패 시 반드시 롤백해야 합니다.
- DB 연결 자원 관리: 연결을 열고 닫는 순서를 항상 확인하세요.
4. 실무 활용 사례
트랜잭션을 통한 주문 시스템 처리
주문 시스템에서 다음 작업들이 단일 트랜잭션으로 처리되어야 합니다:
- 주문 테이블에 주문 생성.
- 재고 감소.
- 결제 기록 생성.
트랜잭션을 통해 작업이 성공적으로 처리되지 않으면 모든 작업을 되돌려야 데이터 무결성을 보장할 수 있습니다.
5. 트랜잭션의 대안: Spring Framework
JDBC로 직접 트랜잭션을 관리하는 것은 번거롭습니다.
대규모 프로젝트에서는 Spring Framework의 TransactionManager를 사용하는 것이 더 효율적입니다.
@Service
public class OrderService {
@Transactional
public void processOrder(Order order) {
// 주문 생성
orderRepository.save(order);
// 재고 감소
stockService.reduceStock(order.getProductId(), order.getQuantity());
// 결제 처리
paymentService.processPayment(order);
}
}
Spring의 @Transactional 어노테이션을 사용하면 자동으로 트랜잭션이 관리됩니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
RESTful API와 Pagination 구현 (0) | 2025.01.03 |
---|---|
JDBC 배치 처리와 성능 최적화 (0) | 2025.01.02 |
MyBatis 캐싱(Cache) 사용하기 (0) | 2025.01.02 |
MyBatis에서 1:N 관계 매핑 (3) | 2025.01.01 |
MyBatis ResultMap 활용하기 (0) | 2025.01.01 |