공부한것들을 정리하는 블로그 입니다.
6. 트랜잭션 처리 : 스프링 AOP Advisor 사용 본문
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문을 통해 조회해볼 경우 글 목록에 변화가 없음을 알 수 있습니다.
'(2019) 사이드 프로젝트 > BoardWeb(게시판-MVC1,MVC2,스프링MVC)' 카테고리의 다른 글
7-3. 글 상세 조회 : getBoard.jsp (0) | 2019.06.24 |
---|---|
7-2. 글 목록 조회, 글 검색 기능 : getBoardList.jsp, BoardDAO.java (0) | 2019.06.24 |
7-1. 로그인, 로그아웃, 로그인 검증 및 실패 후처리 : login.jsp, login_proc.jsp, logout_proc.jsp (3) | 2019.06.24 |
7. MVC Model1 아키텍처로 게시판 개발 : web.xml, representation-layer.xml, index.jsp (0) | 2019.06.20 |
5-1. DAO클래스 구현 : JdbcDaoSupprot 클래스를 상속하는 방법, JdbcTemplate 클래스를 <bean> 등록하고, 의존성 주입으로 처리하는 방법 (0) | 2019.06.19 |
5. 스프링 JDBC : JDBCUtil을 스프링JDBC로 교체, RowMapper 추가 (0) | 2019.06.19 |
4-4. 별첨) 프로젝트 첨부 (0) | 2019.06.19 |
4-3. 시스템로그를 로그파일(.log)로 자동저장하기: log4j (0) | 2019.06.18 |