관리 메뉴

공부한것들을 정리하는 블로그 입니다.

6. 트랜잭션 처리 : 스프링 AOP Advisor 사용 본문

(2019) 사이드 프로젝트/BoardWeb(게시판-MVC1,MVC2,스프링MVC)

6. 트랜잭션 처리 : 스프링 AOP Advisor 사용

호 두 2019. 6. 19. 14:24
반응형

스프링에서는 트랜잭션 관련 설정을 앞에서 살펴본 AOP로 처리합니다. 그리고 추가로 트랜잭션을 제어하는 어드바이스를 설정하기 위해 스프링 설정 파일에 트랜잭션 관련 네임스페이스도 추가해야 합니다.

 

1. 트랜잭션 네임스페이스 등록 : Namespace에서 tx를 추가

 

 

 

2. 트랜잭션 관리자 등록 : 스프링 설정 파일에 DataSourceTransactionManager 클래스를 <bean> 등록합니다.

이는 현재 우리가 가지고 잇는 두 개의 DAO 클래스가 모두 JDBC를 기반으로 동작하기 때문이데, 스프링은 어떤 기술을 이용하여 데이터베이스 연동을 처리햇느냐에 따라 트랜잭션 관리자가 달라집니다.

 

추후 Mybatis나 JPA를 이용하여 DAO 클래스를 추가로 구현 할 것이고, 당연히 그때 트랜잭션 관리자를 변경하게 될 것입니다. ( 예시) JPA : JPATransactionManager )

 

 

트랜잭션 어드바이스도 함께 설정하도록 합니다. 이때 read-only="true" 설정은 읽기 전용으로 처리되어 트랜잭션 관리 대상에서 제외한다는 의미입니다. 참고로 롤백 여부도 속성을 통해 지정 가능합니다.

 

 

 

3. AOP Aspect 앨리먼트 등록

지금까지 트랜잭션 관리 어드바이스 <aop:advisor> 까지의 설정했으니, 비즈니스 메소드 실행 후에 트랜잭션 관리 어드바이스가 동작하도록 AOP 설정만 추가하면 됩니다.

 

이때 <aop:aspect> 앨리먼트를 사용하지 않고 <aop:advisor> 앨리먼트를 사용한다는 점이 기존 AOP설정과는 다릅니다. (우리는 앞에서 포인트컷과 어드바이스를 결합할 때 <aop:aspect> 앨리먼트를 사용했었다)

그 이유는, <aop:aspect>를 사용하려면 포인트컷과 결합할 advice 객체의 id와 method name을 알아야만 <aop:aspect>를 이용하여 설정할 수 있기 때문입니다. 그러나 우리는 트랙잭션 관리 어드바이스를 직접 클래스 구현한게 아니라 <tx:advice>설정을 통해 스프링 컨테이너가 자동으로 생성했으므로 method name을 알 수 없기에 결국 <aop:aspect> 사용이 불가한 것입니다.

 

<aop:advisor>와 <aop:aspect>는 같은 기능의 앨리먼트 이므로 txPointcut으로 지정한 메소드가 호출될 때, txAdvice로 등록한 어드바이스가 동작하여 트랜잭션을 관리하도록 설정하면 됩니다.

 

 

 

 

 

4. 테스트

 

 

이렇게 실행 할 경우 insertBoard() 기능이 실행되었다는 로그는 2번 찍히게 되지만, 그 아래에 pk에 해당하는 seq가 중복되기 때문에 무결성 제약 조건 에러가 출력됩니다.

 

 

트랜잭션에 의해 롤백되므로(스프링 트랜잭션 관리자를 상속하는 인터페이스(PlatformTransactionManager)는 commit과 rollback 메소드를 가지고있음) select문을 통해 조회해볼 경우 글 목록에 변화가 없음을 알 수 있습니다.

 

반응형
Comments