[Spring] 트랜잭션의 개념과 처리 방법
트랜잭션이란?
트랜잭션은 "일의 처리 단위"를 의미합니다.
이러한 일의 처리 단위는 왜 필요한 걸까요?
예를 들어 친구에게 계좌 이체하는 과정을 생각해봅시다.
여기에는 1) 내 계좌에서 돈이 인출되는 과정과 2) 친구 계좌로 돈이 입금되는 과정이 필요합니다.
그런데 도중에 서버에 문제가 생겨서 내 계좌에서 돈이 빠져나가기만 하고,
친구 계좌로 돈이 입금되지 않는다면 매우 곤란해질 것입니다.
이러한 문제를 방지하기 위해 필요한 것이 트랜잭션입니다.
즉, 내 계좌에서 인출되는 과정과 친구 계좌로 입금되는 과정을
분해할 수 없는 하나의 최소 단위로 만들고,
하나의 작업이라도 오류가 발생하면 작업 전체를 실행하지 않는 것입니다.
그렇다면 이러한 트랜잭션 처리를 어떻게 할 수 있는지 살펴볼까요?
트랜잭션 처리 방법
1) 트랜잭션 네임스페이스 tx 추가
먼저 xml 파일의 Namespaces 탭에서 tx 네임스페이스를 추가합니다.
tx를 추가해야지만 트랜잭션 어노테이션 설정 및 사용이 가능합니다.

2) 트랜잭션 관리자 및 <tx:annotation-driven> 등록
JDBC는 기본적으로 auto commit이 설정되어 있어서 하나의 작업이 완료될 때마다 자동으로 커밋이 됩니다.
하지만 트랜잭션의 경우 필요한 작업이 모두 완료된 이후에 commit이 되고, 오류가 발생한 경우 rollback이 되어야 합니다.
이러한 트랜잭션 관리에 필요한 commit(), rollback() 메소드를 스프링의 트랜잭션 관리자에서 제공합니다.
이를 사용하기 위해 dataSource를 DI하여 DataSourceTransactionManager를 <bean>으로 등록합니다.
그리고 @Transactional aop 어노테이션을 사용하면 트랜잭션 처리를 간편하게 할 수 있는데요,
@Transactional 어노테이션을 사용할 수 있도록 <tx:annotation-driven> 엘리먼트를 추가합니다.

3) @Transactional 어노테이션을 사용하여 트랜잭션 설정
트랜잭션을 적용할 클래스 또는 메소드에 @Transactional 어노테이션을 붙여서 트랜잭션 설정을 합니다.
아래의 코드를 보면 인출하는 작업과 입금하는 작업은 @Transactional에 의해 하나의 작업 단위로 묶이게 됩니다.
만약 인출 작업이나 입금 작업 중 하나라도 오류가 발생하면 sendMoney() 메소드 자체가 수행되지 않습니다.

이상으로 트랜잭션 처리에 대해 살펴보았는데요,
부족한 부분이 있는 경우 언제든지 댓글로 알려주시면 감사하겠습니다.
그러면 오늘도 즐거운 코딩 데이 되시기 바랍니다😄