Spring-트랜잭션 (중요!!!) , @Transactional (exception 도중 처리 막는것)

2019. 7. 19. 09:11Spring

---------------------------트랜잭션  중요!!-------------------------

트랜잭션
        - 여러 번의 SQL 명령을 하나의 논리적인 작업그룹으로 정하는 것
        - 대상 SQL 명령은 INSERT, UPDATE, DELETE가 해당된다.
        - 예
                - 게시판 글쓰기
                        - SELECT - 사용자가 해당 서비스에 글쓰기 권한을 가졌는지 조회
                        - INSERT - 작성한 글을 테이블에 저장
                        - UPDATE - 사용자의 포인트를 10 증가시키기
                        - UPDATE - 사용자의 등급을 변경하기
                        * 위의 작업에서 SQL 명령이 실행될 때마다 즉시 데이터베이스에 반영하면 <--Auto Commit
                          부분적인 성공이 발생할 가능성이 있다.
                        - 글이 데이터베이스에 저장됐지만, 포인트가 증가되지 않는 상황
                        - 글도 저장되고, 포인트도 증가됐지만, 등급이 변경되지 않는 상황

                // JDBC 기술 사용시
                public void addBoiard(Board board) {
                        try {
                                Connection con = getConnection();
                                con.setAutoCommit(false);        <--- 자동 커밋기능 비활성화 시킴

                                // SELECT
                                // INSERT
                                // UPDATE
                                // DELETE

                                con.commit();      <--- 모든 SQL 명령이 정상 실행되면 DB 반영
                        } catch (Exception e) {
                                con.rollback();    <--- SQL 명령 실행 중 에러가 발생하면 DB 반영 전부 취소
                        }
                }

                // hibernate 기술 사용시
                public void addBoard(Board board){
                        try {
                                Session session = sessionFactory.openSession();
                                Transaction tx = session.beginTransaction();

                                seesion.persist(board);
                                session.commit();
                        } catch (Exception e) {
                                session.rollback();
                        }
                }

스프링의 트랜잭션 처리
        - DB Access 기술과 무관하게 모든 트랜잭션매니저가 구현할 기능을 정의한 
          PlatformTransactionManager 인터페이스를 만들었다.
                - 주요 메소드 
                        TransactionStatus     getTransaction(TransactionDefinition definition)
                        void                  commit(TransactionStatus status)
                        void                  rollback(TransactioinStatus status)
        - 각각의 DB Access기술에 적합하게 PlatformTransactionManager를 구현한 구현클래스를 제공한다.

                - 주요 기술별 트랜잭션 매니저

                        주요기술           트랜잭션매니저
                        --------------------------------------------------------
                        Spring JDBC        DataSourceTransactionManager 
                        ibatis             DataSourceTransactionManager
                        mybatis            DataSourceTransactionManager
                        JPA                JpaTransactionManager
                        Hibernate          HibernateTransactionManager
                        JTA                JtaTransactionManager
                        --------------------------------------------------------

                - 스프링에서의 트랜잭션 처리 방법
                        - 선언적 트랜잭션처리 (Declarative Transaction Management)
                                - 코드에서 직접 트랜잭션을 처리하지 않고, 선언적으로 트랜잭션을 관리하는 것
                                - @Transactional 어노테이션을 활용한다.
                                - 적용 예)
                                        빈 설정 파일 

 <bean id="tracsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">"
 </bean>
 <tx:annotation-driven transaction-manager="transactionManager" />

                                


                                        코드
                                        @Transactional
                                        public interface xxxService {
                                                void order(Order order);
                                                List getOrders(String userId);
                                        }

                                        @Service
                                        public class xxxServiceImpl implements xxxService {
                                                @AutoWired Dao1 dao1;
                                                @AutoWired Dao2 dao2;
                                                @AutoWired Dao3 dao3;    

                                                public void order(Order order){
                                                        dao1.insertxxx();
                                                        ...
                                                }                                            
                                        }
                                        * xxxService의 모든 구현 메소드가 실행될 때마다 트랜잭션처리가 수행된다.


                                - XML 설정을 이용한 선언적 트랜잭션처리 (이러면 @Transactional도 안써도된다.)
                                - 적용 예)
                                        빈 설정
                                        

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 	<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
		
<!-- AOP 설정을 이용한 선언적 트랜잭션 처리-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"></tx:advice>
<aop:config>
	<aop:advisor advice-ref="txAdvice" pointcut="within(com.sample.aop.service.*serviceImpl)"/>
</aop:config>





                        - 프로그래매틱 트랜잭션처리 (Programmactic Transaction Management)
                                - 프로그램에서 직접 트랜잭션을 관리하고자 할 때 사용하는 방법
                                - 실제 프로젝트에서 거의 사용되지 않음