@Transactional
자바 스프링을 사용하다 보면, 데이터베이스와 상호작용하는 부분이 많다.
예를 들어 사용자가 어떤 정보를 저장하거나 삭제할 때 DB에 데이터를 추가, 변경, 삭제하는 작업을 수행한다.
이런 작업이 잘못되면 데이터의 일관성이 깨질 수 있다. 이때 등장하는 것이 바로 트랙잭션(Transactionl)이고,
@Transactional이라는 특별한 어노테이션이 이와 관련이 있다.
@Transactional 이란?
트랜잭션은 데이터베이스에서 "모든 작업이 성공하거나, 아무작업도 하지 않는 것"을 보장해주는 개념이다.
쉽게 말해 한번에 여러 작업이 일어나는 경우, 중간에 문제가 생기면 아예 처음부터
아무것도 하지 않은 것처럼 만드는 것을 트랜잭션이라고 한다.
예) 친구에게 돈을 송금하는 상황을 생각해보자 두가지 작업이 있다.
1. 내 계좌에서 돈을 차감
2. 친구의 계좌에 돈을 입금
이 두가지 작업은 모두 성공해야 제대로 송금이 완료되었다고 할 수 있다.
만약 중간에 문제가 생겨 내 계좌에서는 돈이 빠졌는데 친구 계좌에 입금되지 않았다면 문제가 생긴다.
이런 상황을 방지하기 위해 두 작업 중 하나라도 실패하면 모든 작업을 되돌리는 역할이 트랜잭션이라고 생각하면 된다.
@Transactional이 하는 일( 코드예시)
@Service
public class BankService {
@Transactional
public void transferMoney(String fromAccount, String toAccount, int amount) {
// 1. 돈을 보내는 계좌에서 금액 차감
accountRepository.decreaseBalance(fromAccount, amount);
// 2. 돈을 받는 계좌에 금액 추가
accountRepository.increaseBalance(toAccount, amount);
}
}
위 코드에서는 transferMoney라는 메서드가 두 가지 작업을 수행한다.
1. 돈을 보내는 사람의 계좌에서 돈을 차감.
2. 돈을 받는 사람의 계좌에 돈을 추가
이때 @Transactional이 붙어 있기에 중간에 에러가 발생하면 모든 작업을 취소하고 처음상태로 돌린다.
@Transactional의 기본 규칙
트랜잭션은 다음 네 가지 특징(ACID)을 가진다.
1. Atomicity(원자성): 모든 작업이 전부 성공하거나, 아무 것도 일어나지 않은 것처럼 되돌려진다.
2. Consistency(일관성): 트랜잭션이 끝나면 데이터베이스는 항상 일관된 상태를 유지해야 한다.
3. Isolation(고립성): 여러 트랜잭션이 동시에 실행되어도 서로 간섭하지 않는다.
4. Durability(지속성): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영된다.
이 규칙들 덕분에 @Transactional을 통해 안전하게 DB작업을 처리할 수 있다.
'Dev > Spring' 카테고리의 다른 글
DI와 IoC (2) | 2024.10.11 |
---|---|
@GeneratedValue (4) | 2024.10.08 |
@RestController와 @Controller의 차이 (2) | 2024.10.04 |
Spring Dependency (2) | 2024.09.27 |
스프링부트 기본 포트 바꾸기 (0) | 2024.09.12 |
댓글
이 글 공유하기
다른 글
-
DI와 IoC
DI와 IoC
2024.10.11 -
@GeneratedValue
@GeneratedValue
2024.10.08 -
@RestController와 @Controller의 차이
@RestController와 @Controller의 차이
2024.10.04 -
Spring Dependency
Spring Dependency
2024.09.27