1. 트랜잭션(Transaction)
1-5 Delete,Update,Then(코드 검증)에서 조금 설명했었지만 중요하기 때문에 제대로 설명해보려고 한다.
트랜잭션(Transaction)은 데이터베이스 관리 시스템(DBMS)에서 하나의 논리적 작업 단위로, 여러 데이터베이스 연산(예: 삽입, 수정, 삭제)을 하나로 묶어 처리하는 것을 의미합니다. 트랜잭션은 이 작업들이 모두 성공하거나 모두 실패하도록 보장합니다. 이는 데이터의 무결성을 유지하고, 시스템이 예기치 않은 오류나 중단에도 일관성을 유지할 수 있도록 합니다.
※수정(Update)과 삭제(Delete) 작업에 트랜잭션(Transaction)을 사용하는 것은 데이터 무결성과 일관성을 보장하기 위해 매우 중요합니다
트랜잭션의 주요 특성: ACID
트랜잭션의 가장 중요한 특성은 ACID라고 불리는 네 가지 속성입니다. 이 속성들은 트랜잭션이 데이터베이스의 신뢰성을 보장하도록 하는 기본 요소입니다.
- Atomicity(원자성):
- 모두 또는 아무것도: 트랜잭션 내의 모든 작업이 성공적으로 완료되거나, 하나라도 실패하면 트랜잭션의 모든 작업이 취소(롤백)되어야 한다는 원칙입니다. 예를 들어, 은행 계좌 간의 송금 작업에서 출금만 되고 입금이 되지 않으면 안 되므로, 전체 작업이 모두 성공해야 트랜잭션이 완료됩니다.
- Consistency(일관성):
- 일관된 데이터 상태 유지: 트랜잭션이 완료되면 데이터베이스는 일관성 있는 상태를 유지해야 합니다. 트랜잭션이 완료된 후 데이터는 모든 비즈니스 규칙과 제약 조건을 만족해야 합니다. 예를 들어, 은행 계좌에서 금액을 이체할 때, 트랜잭션 전후의 총 금액은 변하지 않아야 합니다.
- Isolation(격리성):
- 독립적인 실행: 트랜잭션이 서로 독립적으로 실행되도록 보장하는 속성입니다. 한 트랜잭션이 완료될 때까지 다른 트랜잭션이 그 중간 상태를 볼 수 없으며, 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 합니다. 이를 통해 데이터의 무결성을 유지합니다.
- Durability(지속성):
- 영구적 반영: 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 반영되어야 합니다. 시스템 장애가 발생하더라도 트랜잭션의 결과가 데이터베이스에 남아 있어야 합니다.
트랜잭션의 사용 예시
트랜잭션은 일반적으로 다음과 같은 경우에 사용됩니다:
- 은행 계좌 이체: 한 계좌에서 금액을 출금하고 다른 계좌에 입금하는 작업은 트랜잭션으로 묶여야 합니다. 이 작업 중 하나라도 실패하면 전체 작업이 취소되어야 합니다.
- 온라인 쇼핑몰: 주문 처리 과정에서 재고 감소, 결제 처리, 주문 기록 등 여러 작업이 이루어지는데, 이 모든 작업은 하나의 트랜잭션으로 처리되어야 합니다. 만약 결제 과정에서 오류가 발생하면, 재고 감소와 주문 기록도 취소되어야 합니다.
트랜잭션 관리
트랜잭션 관리는 주로 다음과 같은 방식으로 이루어집니다:
- Commit: 트랜잭션이 성공적으로 완료되어 모든 작업이 확정되었을 때, 데이터베이스에 변경 사항을 영구적으로 적용하는 과정입니다.
- Rollback: 트랜잭션 내에서 오류가 발생했을 때, 트랜잭션이 시작되기 전의 상태로 데이터를 되돌리는 과정입니다.
트랜잭션을 올바르게 사용하면 데이터베이스의 무결성과 안정성을 높일 수 있으며, 복잡한 비즈니스 로직을 안전하게 처리할 수 있습니다.
2. Transaction(readOnly=true)
Transaction(readOnly=true)
는 주로 Java 기반의 Spring Framework에서 사용되는 설정으로, 해당 트랜잭션이 읽기 전용임을 명시합니다. 이 설정은 성능 최적화와 데이터 안전성을 위해 중요하게 사용됩니다.주요 기능과 이점
- 읽기 전용 최적화:
readOnly=true
로 설정된 트랜잭션은 데이터 수정이 발생하지 않는다는 것을 DBMS에게 알려줍니다. 이는 성능 최적화로 이어질 수 있습니다. 데이터베이스는 트랜잭션에서 변경 작업이 발생하지 않음을 알기 때문에, 특정한 최적화를 적용할 수 있습니다. 예를 들어, 일부 데이터베이스는 읽기 전용 트랜잭션에 대해 락(lock)이나 로깅(logging) 작업을 최소화하여 성능을 향상시킬 수 있습니다.
- 데이터 안전성:
- 이 설정은 개발자가 실수로 데이터를 변경하는 것을 방지합니다.
readOnly=true
로 설정된 트랜잭션 내에서 데이터베이스 수정 작업(삽입, 수정, 삭제 등)을 시도할 경우, 예외가 발생하도록 설정할 수 있습니다. 이는 읽기 작업만 허용되는 메서드에서 불필요한 데이터 수정이 발생하는 것을 막아줍니다.
- 명확한 의도 표현:
- 코드의 가독성을 높이고 유지보수를 용이하게 합니다. 메서드나 클래스에
@Transactional(readOnly=true)
를 적용함으로써, 이 메서드가 오직 데이터 조회에만 사용된다는 것을 명확히 표현할 수 있습니다.
사용 예시
@Service
public class MyService {
@Transactional(readOnly = true)
public List<MyEntity> getEntities() {
// 데이터베이스에서 데이터를 조회하는 코드
return myRepository.findAll();
}
}
위 예시에서
getEntities
메서드는 데이터베이스에서 데이터를 조회만 하는 메서드입니다. @Transactional(readOnly = true)
를 사용하여 트랜잭션이 읽기 전용임을 명시함으로써, 불필요한 데이터 수정이 발생하지 않도록 보호하고 성능을 최적화합니다.적용 범위
- 조회 작업: 주로 데이터 조회 메서드에서 사용됩니다. 예를 들어, 대용량 데이터 조회, 복잡한 쿼리 실행 등이 해당됩니다.
- 성능 최적화: 트랜잭션 오버헤드를 줄이고 데이터베이스 리소스를 효율적으로 사용할 수 있습니다.
- 안전성 보장: 개발자가 실수로 데이터를 변경하지 않도록 예방할 수 있습니다.
제한사항
- 데이터 수정 불가:
readOnly=true
로 설정된 트랜잭션에서는 데이터 삽입, 수정, 삭제 작업이 예외를 발생시킬 수 있습니다. 따라서 이 트랜잭션 내에서는 이러한 작업을 수행하지 않도록 주의해야 합니다.
Transaction(readOnly=true)
는 주로 데이터를 조회하는 메서드에서 사용되며, 성능 최적화와 데이터 안전성을 위해 중요한 설정입니다.Share article