코딩기록 저장소 🐕/spring(JPA)🌱

트랜잭션

kimkongmom 2023. 10. 12. 17:47

 

 

 

📚 트랜잭션 예제
온라인 쇼핑몰에서 결제할 때를 생각해보자.

연로그는 친구의 생일을 앞두고 생일 선물을 사려고 한다.

선물을 골라 결제할 때 총 2가지 작업이 이루어진다.

 

판매처에 돈 보내기
판매처에서 돈 받기
 

 1만 성공하거나 2만 성공하는 경우가 발생해서는 안된다. 돈 보내는데 실패하면 판매처는 돈을 받을 수 없어야하고, 반대로 돈을 보냈는데 판매처가 돈을 못받는 상황이 발생하면 안된다. 모든 작업이 성공적으로 완료되어야 작업 결과를 적용하고, (commit) 작업 중에 어느 한 곳에서라도 오류가 발생하면 작업 실행 전의 상태로 돌아가야하는 것 (rollback)이 트랜잭션의 개념이다.

 

 

✨ 트랜잭션 ACID
Atomicity; 원자성: 트랜잭션 내의 작업들은 모두 성공 또는 모두 실패한다.
Consistency; 일관성: 모든 트랜잭션은 일관성 있는 DB 상태를 유지한다. (ex: DB의 무결성 제약 조건 항상 만족)
Isolation; 격리성: 동시에 실행되는 트랜잭션들은 서로 영향을 미치지 않는다. (ex: 동시에 같은 데이터 수정 X)
Durability; 지속성: 트랜잭션이 성공적으로 끝나면 그 결과는 항상 기록되어야 한다.
 

여기서 조금 더 신경써야하는 포인트는 격리성이다. 격리성을 완벽하게 보장하려면 트랜잭션을 순서를 정해 하나씩 실행해야 한다. 하지만 이런 경우 성능이 너무 나빠지기 때문에 트랜잭션 격리 수준이 존재한다.

 

 

😋 트랜잭션 관리의 종류
 

💡 비즈니스 로직과 트랜잭션 코드의 분리
비즈니스 로직과 트랜잭션 처리 로직이 동시에 존재한다면?

코드의 중복이 생길 수 있고 비즈니스 로직에만 집중하기 어렵다.

 

비즈니스 로직에만 집중하기 위해 Spring은 크게 2가지 트랜잭션 기술을 지원해준다.

 

1. TransactionTemplate

 데이터 접근 기술에는 JdbcTemplate, JPA 등 여러가지가 존재한다. 이 기술이 바뀌면 트랜잭션을 사용하는 방법도 달라진다. Spring에서는 이러한 상황을 고려해 트랜잭션에 대한 추상화를 지원한다. PlatformTransactionManager 인터페이스를 이용하면 된다. 해당 인터페이스는 총 3가지 메서드를 제공한다.

getTransaction(): 현재 TransactionStatus를 return
commit(): 변경 내역 커밋
rollback(): 변경 내역 롤백
 

TransactionTemplate은 위의 Transaction Manager를 주입 받아 사용한다. 해당 클래스를 이용해 개발자가 트랜잭션 시작/종료 지점을 명시적으로 결정할 수 있게 된다.

 

2. @Transactional 어노테이션

 또는 @Transactional 어노테이션을 지원해준다. 우리는 DB와 관련된, 트랜잭션이 필요한 클래스 혹은 메서드에 @Transactional 어노테이션을 달기만 하면 된다. 

(+참고로 클래스에 다는 경우, 해당 클래스 및 하위 클래스까지 적용된다.)

 

🔻 @Transactional의 우선 순위 (클래스 vs 메서드)

더보기
 

 

💥 프로그래밍적 트랜잭션 관리 vs 선언적 트랜잭션 관리
프로그래밍 트랜잭션 관리; Programmactic Transaction Management
ex: TransactionManager, TransactionTemplate
트랜잭션 관련 코드를 직접 작성하는 방법

선언적 트랜잭션 관리; Declarative Transaction Management
ex: @Transactional
과거엔 xml을 이용해 설정하기도 함
프로그래밍 트랜잭션 관리에 비해 간편

 

 

 

 

'코딩기록 저장소 🐕 > spring(JPA)🌱' 카테고리의 다른 글

시험 review  (0) 2023.10.16
10/16 restApi  (0) 2023.10.16
SpringMyBatis  (0) 2023.10.12
Spring AOP  (0) 2023.10.11
Springjdbc  (0) 2023.10.11