트랜잭션의 정의
데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 수행되어야 할 일련의 연산입니다.
정의를 이해해보면, DB 의 데이터에 접근해 변경을 시도하는 작업(기능) 이라고 이해할 수 있습니다.
먼저 트랜잭션의 예시로 A의 계좌에서 B 의 계좌에 입금하는 작업을 들어보겠습니다.
1. A 의 계좌를 확인합니다.
2. A의 계좌에서 10000원을 B 계좌로 입금합니다. A의 잔액에서 -10000원을 차감하고 저장합니다.
3. B의 계좌를 확인합니다.
4. B의 계좌에 10000원을 더하고 저장합니다.
위처럼 하나의 작업을 진행하는데 이것을 트랜잭션이라고 합니다.
예시를 보니 트랜잭션의 필요성을 생각해볼 수 있습니다. 실패했을 때 만약 잔액이 원상복구 되지 않으면 큰일이 나겠죠??
하나의 트랜잭션은 commit 또는 rollback 되어야 합니다.쉽게 말하면, 성공하던가 실패하면 다시 처음상태로 복구되어야합니다.
트랜잭션의 특징을 알아보겠습니다.
원자성 : 트랜잭션은 모두 성공하거나 실패해야 합니다.
-> 한 작업에 여러 로직이 있다고 해도 하나의 로직이 실패하면 rollback 됩니다.
일관성 : 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 합니다.
독립성 : 두개 이상의 트랜잭션이 실행되고 있을 경우, 하나의 트랜잭션 작업에 다른 트랜잭션이 참여할 수 없습니다.\
지속성 : 트랜잭션이 성공했을 경우, 그 결과는 영구적으로 반영되어야 합니다.
트랜잭션의 상태입니다.
Commit : 트랜잭션이 성공적으로 끝났을때, 트랜잭션이 수행한 연산이 완료되어 DB 가 일관성이 있는 것입니다.
Rollback : 트랜잭션이 어떠한 이유로 실패했을 때, 트랜잭션이 수행한 연산을 모두 취소한 것입니다.
++ 테스트 코드에서 @Transaction 을 사용할때 주의할점을 참고하면 좋을거 같습니다.
https://tecoble.techcourse.co.kr/post/2020-08-31-jpa-transaction-test/
간단하게 요약하면,
일반적으로 아는 데로 Test 시 @Transaction 을 사용하면 자동으로 각 메서드 실행 이후 자동으로 Rollback 된다.
하지만 실수로 Test 코드에서만 적용하고 실제 로직에서 빼먹고 Test 를 실행하면 LazyInitailizationException 에러가 발생한다. @Transaction을 실제 로직에도 잘 적용 후 사용해야 한다.
결론
1. @Transaction을 테스트 코드에서 사용하려면 실제 로직을 잘 확인해야합니다.
2. @BeforeEach 나 @AfterEach 를 사용하는 방법도 있습니다.
@BeforeEach
void clean() {
// 전부 삭제하는 메서드 사용
...Repository.deleteAll();
}
참고
'Knowledge > CS' 카테고리의 다른 글
[CS] RDBMS 와 NoSQL 의 차이 (0) | 2023.02.09 |
---|---|
[CS] 시스템 콜 (0) | 2023.01.23 |
[CS] 스프링 프레임워크란? (0) | 2023.01.13 |
[CS] HTTP 1.0 / 1.1 / 2 (0) | 2023.01.11 |
[CS] 네트워크 토폴로지 (0) | 2022.12.30 |
댓글