티스토리 뷰

Transaction Template와 달리 트랜잭션 처리를 코드에서 직접적으로 수행하지 않고 설정 파일이나 어노테이션을 사용해서 트랜잭션의 범위, 롤백 규칙 등을 정의한 것이라 합니다.

그럼 @Transactional을 사용해서 서비스 클래스에서 트랜잭션을 만들어주는 방식은 선언적 트랜잭션 방식을 사용하였다는 것을 알겠습니다. 이제 이것에 대해 더 자세히 알아보겠습니다. 

 

트랜잭션의 정의 방식

1. <tx:advice> 태그를 이용해서 트랜잭션을 처리합니다. 

2. @Transactional 어노테이션을 이용한 트랜잭션 설정을 합니다. 

3. TransactionProxyFactoryBean 태그를 이용해서 트랜잭션을 처리합니다. 

트랜잭션은 설정파일에서 이렇게 설정하여 사용할 수 있습니다. 여기서 <tx:advice>, <tx:attribute>, <tx:method> 태그를 사용해서 트랜잭션의 속성을 정의한다고 합니다. 

 

<tx:advice> 태그는 트랜잭션을 적용할 때 사용될 Advisor를 생성합니다. 

Advisor = Advice(부가 로직) + PointCut(삽입될 장소)

<tx:method> 태그는 트랜잭션을 설정할 메소드 및 트랜잭션 속성을 설정합니다. 

<tx:attributes> 태그의 자식 태그로 설정합니다.

name 속성은 트랜잭션이 적용될 메소드의 이름을 명시합니다. 따라서 이것이 PointCut의 역할을 하는거 같습니다.

 

propagation 속성은 트랜잭션의 전파 규칙을 설정합니다. 쓰레드 로컬을 공유하면서 트랜잭션을 전파하는데 이것에 대한 설정을 해주는 것을 알수 있습니다. 그럼 이따 어떤 전파 설정이 있는지도 알아보겠습니다.

 

isolation 속성은 트랜잭션 격리 레벨을 설정합니다. 이것은 제가 알고 있는 것입니다. 크게 4가지가 있고 일관성과 성능의 반비례 관계에서 레벨이 올라갈 수록 일관성은 지켜지지만 성능은 떨어지게 됩니다.  자신이 원하는 레벨을 골라 설정하면 됩니다. 

 

read-only 속성은 읽기 전용 여부를 설정해주는 것입니다. 아마 데이터 락에 대한 이야기 같습니다. 읽기에서는 데이터가 변하지 않아서 락을 덜 엄격하게 걸고, 그 외의 데이터 조작이 이루어지는 작업에서는 엄격한 락을 거는 것을 말하는 것 같습니다. 

 

no-rollback-for 속성은 트랜잭션을 롤백하지 않을 예외 타입을 설정합니다. 

 

rollback-for 속성은 트랜잭션을 롤잭할 예외 타입을 설정합니다.

 

timeout 속성은 트랜잭션의 타임아웃 시간을 초 단위로 설정합니다. 

 

트랜잭션 적용은

위 그림 처럼 aop를 사용하여 이루어집니다. 

pointcut을 통해 AspectJ 포인트 컷 표현식을 사용하였고 모든 sevice의 메소드를 어드바이스한다는 것을 알 수 있습니다. 그리고 어떤 트랜잭션 설정을 통해 만들어진 트랜잭션이 사용될지는 advice-ref="txAdvice를 통해 알수 있습니다. 위에 설정한 Advice의 이름을 보면 같은 것을 알 수 있습니다. 

 

트랜잭션 전파 방식

MANDATORY 

  • 호출 전에 반드시 진행 중인 트랜잭션이 있어야 합니다. 만약 없다면 예외를 발생시킵니다. 

NESTED

  • 이미 진행 중인 트랜잭션이 존재하면 중첩된 트랜잭션에서 실행되어야 함을 말합니다.
  • 중첩된 트랜잭션은 본 트랜잭션과 독립적으로 커밋되거나 롤백될 수 있습니다. 
  • 만약 본 트랜잭션이 없다면 REQUIRED와 동일하게 작동합니다. 
  • 이것 방식은 벤더 의존적이고 지원이 안되는 경우도 많습니다. 

NEVER

  • 트랜잭션 진행 상황에서 실행 될 수 없습니다. 
  • 만약 진행중인 트랜잭션이 있다면 예외를 발생 시킵니다.

SUPPORTED

  • 트랜잭션이 없는 상황에서 실행됩니다.
  • 만약 진행 중인 트랜잭션이 있다면 해당 메소드가 반환되기 전까지 잠시 중단합니다. 

REQUIRED

  • 트랜잭션 상황에서 실행되어야 합니다.
  • 진행 중인 트랜잭션이 있다면 이 트랜잭션에서 실행됩니다. 
  • 없으면 새로 트랜잭션을 시작합니다.

REQUIRED_NEW

  • 자신만의 트랜잭션 상황에서 실행되어야 합니다.
  • 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션은 해당 메소드가 반환되기 전에 잠시 중된됩니다.

SUPPORTS

  • 진행 중인 트랜잭션이 없더라도 실행 가능하고, 트랜잭션이 있는 경우에는 이 트랜잭션 상황에서 실행됩니다. 

 

'SPRING' 카테고리의 다른 글

Util클래스의 장단점  (1) 2021.03.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함