-
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 key나 Notnull 같은 설정 값은 복사 되지 않는다(데이터 값만 복사)
B1Dao.java(A1Dao.java 복사)
>> B1Dao의 인터페이스를 추출해야되지만 생략하고 진행
TxService.java
TxServiceTest.java
>> conn의 주소 값이 다르다
TxService.java
>> @Transactional 은 RunTimeException과 Error만 롤벡한다
따라서Transactional(rollbackFor = Exception.class) 모든 예외를 롤벡
TxServiceTest.java
>> txService.insertA1WithTxSuccess( ) 호출 결과는 생략
>> @Transactional으로 conn의 주소 값이 일치하고 AOP를 넣어주어 rollback( )호출
DB의 값이 입력되지 않았다
5) @Transactional의 속성
6) propagation속성의 값
※REQUIRES_NEW와 NESTED 차이점
- REQUIRES_NEW는 ①Tx에 다른 ②Tx 만든다 (①번과②번은 서로 다른 Tx)
- NESTED는 Tx 안에 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가 적용된다
반응형'Spring > 02 Spring DI와 AOP' 카테고리의 다른 글
12 서비스 계층의 분리와 @Transactional(1) (0) 2023.07.08 11 AOP의 개념과 용어 (0) 2023.07.07 10 Transaction, Commit, Rollback (0) 2023.07.05 09 DAO의 작성과 적용(2-2) (0) 2023.07.04 09 DAO의 작성과 적용(2-1) (0) 2023.07.03