@Transactional 어노테이션은 Spring에서 트랜잭션 처리를 위해 사용된다.
이를 메소드 또는 클래스에 명시하여 내부적으로 AOP를 통한 트랜젝션 처리 코드가 실행된다.
이 트랜잭션이 붙은 메소드 내의 작업 단위들은 하나로 묶여 실행된다.
@Transactional
public void method() throws Exception {
try {
searchDB();
insertDB();
updateDB();
deleteDB();
} catch (Exception e) {
updateFailHistory();
throw new RuntimeException("method fail");
}
}
위 코드에서 DB 조회, 삽입, 수정, 삭제 로직을 실행하는 중 하나라도 예외가 발생한다면 모든 작업들은 rollback된다.
이를 트랜잭션의 원자성(Atomicity) 이라고 한다.
원자성이라는 특징을 통해 트랜잭션이 데이터베이스에 모두 반영되던가, 전혀 반영되지 않도록 하여 논리적인 작업단위 별로 일처리가 이루어질 수 있도록 한다.
만약 메소드 안에서 각각 rollback이 일어난다면 오작동 했을 시 원인을 찾기가 어려우며, 데이터의 일관성을 유지할 수 없다.
그런데 위 코드에서 예외가 발생하게 되면, catch 문에서 db에 실패 히스토리를 삽입하는 updateFailHistory() 메소드 또한 rollback된다.
따라서 상황에 따라 transaction을 분리하는 작업 또한 필요할 것이다.