1 minute read

1.TransactionManager

하나의 메서드는 하나의 Connection을 가진다. 하지만 하나의 메서드에 하나의 Connection을 가지면 중복된 메서드의 Connection은 개별 커넥션을 갖기 때문에 Tx가 안된다는 문제가 발생한다. 예를들어 UserDao의 deleteUser(100);를 실행하면 메서드에 해당하는 Connection이 commit되면서 100이라는 키를 가진 유저의 정보가 삭제될거다. 그런데 여기에 deleteUser(200);을 실행한 후 rollback을 해야하는 상황이 발생하면, 이미 deleteUser(100);이 실행된 Connection은 commit 되었기에 rollback이 되지 않는다. 이 문제를 해결하기 위해선 두 메서드의 Connection을 하나의 Connection으로 관리될 필요가 있는데, TransactionManager가 그 역할을 한다.

1.2 TransactionManager로 Transaction 적용하기

Dao에서 Connection을 얻거나 반환 할 때 DataSourceUtils를 사용한다.

  • TxM 설정코드

  • TxM 적용

TxM로 Tx를 적용하면

①new DataSourceTranscationManager(ds);를 통해 TxM를 생성한다. 그리고

②tm.getTranaction(…);를 통해 Tx의 속성을 정의하고 Tx는 시작된다.

③try ~ catch문을 통해 Tx가 실행되는데 코드를보면 a1Dao.insert();가 모두 성공했을 때 commit이 되고 실패 했을 시 rollback한다. a1Dao.insert(1,100); 과 a1Dao.insert(1,200);은 서로 다른 Connection을 갖는다 그래서 Tx이 따로 실행되지만 TxM을 통해 이 Connection을 하나의 Connection으로 묶어 동시에 Tx가 가능하게 된다.

  • Bean으로 TxM 설정

TxM을 사용하기 위해 앞에서와 같이 코드를 작성하는 방법도 있지만 간편하게 위의 사진과 같이 Bean으로 등록하는 방법도 있다. 개인적으로 Dao에 TxM을 설정하기보단 xml의 Bean으로 설정하는게 더 낫다고 생각한다.참고로 tx:annotation-driven/은 앞으로 살펴 볼 @Transcational을 사용하기 위해 설정한다.

2.Transational

@Transactional은 AOP의 주요 개념인 핵심기능과 부가기능을 분리하는 방식을 사용한다. 위의 코드를 보면 빨간색 박스를 친 코드가 핵심기능을 담당한다. 이외의 코드들은 모두 부가기능을 담당한다. 부가기능은 항상 반복되기 때문에 분리할 필요가 있는데, @Transactional은 이 두 코드(부가기능, 핵심기능)를 분리한다. 핵심기능 코드를 @Transcational이 붙은 메서드에 넣어 사용하면, 스프링은 부가기능을 따로 설정하여 개발자 입장에서 핵심기능에 더 집중 할 수 있게 한다. @Transactional은 클래스나 인터페이스도 붙을 수 있다.

2.1 @Transactional의 속성

2.2 propagation의 속성 값

  • REQUIRED

  • REQUIRES_NEW


출처
스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)

Comments