티스토리 뷰

반응형

서론

어플리케이션을 만듦에 있어서 데이터베이스에 정보를 업데이트하고 지우고, 인설트하는 것은 필수적인 요소라고 볼 수 있다. 데이터베이스에 정보를 최신화 함에 있어서 중요한 것이 바로 Transcation관리이다. 어떻게 일의 단위를 어떻게 묶어 주느냐에 따라 데이터의 품질이 좋아지냐 나빠지느냐에 기로에 서게 된다. 예를 들어 한 어플리케이션의 기능에서 A, B 두 개의 테이블에 정보를 각각 업데이트 한다고 하자. 첫번째 정보를 정상적으로 최신화 하였지만 프로그램 오류에 의해서 중간에 오류가 발생하였을 경우 첫번째 정보는 rollback되어야 한다. 만약 Transaction이 정상적으로 처리되지 않는다면 분명 기능은 동작하였고 A 테이블에는 데이터가 있지만 B 테이블에는 데이터가 존재 하지 않는 문제점이 발생하게 된다.

이렇듯 Transaction을 스프링을 사용하게 되면 @Transactional 어노테이션을 사용하여 처리 할 수 있다.

이번 포스팅에서는 @Transactional 어노테이션을 사용하기 위한 설정방법(JavaConfig)과 사용자 정의 Transactional 어노테이션을 사용하는 방법에 대해서 포스팅한다. 포스팅에 사용한 스프링 버전은 4.2.5버전이다.


Transaction 설정

우선 자바로 설정을 하기 위해서는 TransactionManagementConfigurer를 구현한 클래스가 필요하다. 해당 인터페이스를 구현하게 되면 annotationDrivenTransactionManager(): PlatformTransactionManager라는 클래스를 구현하게 한다.

아래에서  바로 설정한 소스를 보자.



여기서 주목할 부분은 PlatformTransactionManager transactionManager() 메소드이다. 해당 메소드에는 빈이름을 설정을 해주었는데 이 빈이름을 사용하여 이후 사용자 정의 Transcational 어노테이션을 만들 수 있다. 

이후 우리가 구현하여야 했던 메소드의 리턴값으로 transactionManager메소드의 결과값을 리턴하게 해준다.

사용자 Transactional어노테이션 정의
사용자 어노테이션 정의는 평소 어노테이션을 생성하는 것과 일치한다. 이 선언한 어노테이션에 @Transactional 어노테이션을 선언함으로써 사용자가 생성한 어노테이션이 Transcation을 위해 동작하게 된다. 



@Transactional 어노테이션 안에 value값을 보면 joduBaiscTransaction이라는 값을 볼 수 있다. 이처럼 여러개의 DataSource를 사용할 경우 빈 이름을 전달하여 각각의 DataSource에 Transaction을 만들어 줄 수 있다. 또한 같은 DataSource라도 동작하는 메소드마다 Transaction 성질이 달라 질 수 있는데 이 경우 어노테이션을 더 만들어서 처리 해 줄 수 있다.

여기서 처음에 내가 실수 했던 부분이 rollbackFor 옵션을 주지 않아서 에러가 발생했음에도 롤백 되지 않는 문제를 발생 시켰던 적이 있다.

rollbackFor에 선언되는 익셉션의 종류에 따라서도 트랜잭션을 구분 할 수 있음을 알아두자.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함