ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13 서비스 계층의 분리와 @Transactional(2)
    Spring/02 Spring DI와 AOP 2023. 7. 9. 22:22
    반응형

    서비스 계층의 분리와 @Transactional(2)

    4-3) 실습(@Transactional 주입)

    root-context.xml

     

     

    A1DaoTest.java

     

    MySQL 에디터(테이블 b1생성)

    >> 데이터를 없이(false) a1과 같은 테이블 b1을 생성

    >> 조건문 where false를 생략하면 a1의 테이블을 복사한 b1이 생성

    >> primary keyNotnull 같은 설정 값은 복사 되지 않는다(데이터 값만 복사)

     

     

    B1Dao.java(A1Dao.java 복사)

    >> B1Dao의 인터페이스를 추출해야되지만 생략하고 진행

     

     

    TxService.java

     

    TxServiceTest.java

    >> conn의 주소 값이 다르다

     

     

    TxService.java

    >> @Transactional RunTimeExceptionError만 롤벡한다

         따라서Transactional(rollbackFor = Exception.class) 모든 예외를 롤벡

     

     

    TxServiceTest.java

    >> txService.insertA1WithTxSuccess( ) 호출 결과는 생략

    >> @Transactional으로 conn의 주소 값이 일치하고 AOP를 넣어주어 rollback( )호출

         DB의 값이 입력되지 않았다

     

     

    5) @Transactional의 속성

     

     

    6) propagation속성의 값

    REQUIRES_NEWNESTED 차이점

    - REQUIRES_NEWTx에 다른 Tx 만든다 (번과번은 서로 다른 Tx)

    - NESTEDTx 안에 sub Tx 만든다 (하나의 Tx안에서 sub tx을 만든다) ex) 게임의 세이브 포인트

     

     

    7) REQUIRED

    >> REQUIRED - Tx가 진행 중이면 참여하고, 없으면 새로운 Tx시작(디폴트)

    >> B2에서 예외가 발생하면 A1으로 Rollback

    >> A2에서 예외가 발생하면 A1으로 Rollback // 두 개의 Tx가 마치 하나인것처럼 돌아간다

     

     

    7-1) REQUIRES_NEW

    >> RWQUIRES_NEW는 새로운 Tx가 필요하다는 의미

    >> B2에서 예외가 발생하면 B1으로 Rollback (A1, A2는 커밋된다)

    >> A2에서 예외가 발생하면 A1으로 Rollback (B1, B2는 커밋된다)

     

     

    7-2) 실습 (실습시, 주의 사항만)

    TxService.java (REQUIRED 실습)

    >> 4)-3에서 TxService.java 내용 참조

    >> 결과는 생략하였다

     

     

    TxService.java (REQUIRES_NEW 실습)

    >> @Transactional 쓰면 insert( )4개를 호출한 주소(콘솔 conn )가 같게 나온다

    insertB1WithTx( )메서드도 위와 같이변경

    insertB1WithTx( )메서드 작성시 PROPAGATION_REQUIRES_NEW 변경

     

    @Transanctional이 동작하지 않는 이유는 같은 클래스에

    속한 메서드끼리의 호출(내부 호출)이기 때문이다

     

    프록시 방식(디폴트)AOP는 내부 호출인 경우, Advice가 적용되지 않는다

    그래서 Tx가 적용되지 않았던 것이다

     

    두 메서드를 별도의 클래스로 분리하면 Tx가 적용된다

     

     

     

    반응형
Designed by Tistory.