@트랜잭션 정책
스프링에서는 @Transactional 어노테이션을 통해 포인트 컷과 트랜잭션 속성을 지정할 수 있도록 도와줍니다.
포인트 컷이란? : 공통기능을 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈
스프링은 @Transactional 어노테이션을 적용할 때 타킷 메소드, 타깃 클래스, 선언 메소드, 선언 타입(클래스, 인터페이스)의 순서에 따라서 적용되어 있는지 차례로 확인하고 가장 먼저 발견되는 속성정보를 사용하게 합니다.
예를 들어 위와 같은 인터페이스와 클래스가 존재할때에 앞서 말한바와 같이 우선순위는 타깃 메소드>타깃 클래스>선언 메소드>선언 타입 이기에 ServiceImpl 클래스에 있는 메소드에 @Transactional이 가장 먼저 적용된후, ServiceImpl 클래스에 붙은 @Transactional, Service 인터페이스의 있는 메소드, Service 인터페이스 순서로 적용이 됩니다.
위와 같이 @Transactional이 적용되어 있을때 method()는 자신의 @Transaction 속성을의 따르지만 method2()는 자동으로 ServiceImpl 클래스의 @Transactional의 속성을 따릅니다.
속성
1. 읽기 속성
@Transactional(readOnly = true)
: 읽기 속성을 지정하면 본 메소드는 읽기 전용으로 데이터를 변경하지 않으므로 코드의 가독성이 올라간다. (이외에 여러 이점이 있으나 간단하지 않아 생략)
2. 전파 속성
@Transactional(propagation = Propagation.REQUIRED)
: 전파 속성을 지정해줄 경우, 앞에서 트랜잭션이 있으면 참여하고 없으면 자동으로 새로운 트랜잭션을 생성해준다. 예를 들어 A메소드에서 B메소드를 호출할 때 A메소드의 전파속성이 REQUIRED로 되어있다면 B의 트랜잭션에 포함된다. 즉 B메소드가 롤백된다면 A메소드 호출이 성공했더라도 A메소드 또한 롤백된다.
3. 테스트
@Transactional 어노테이션은 테스트에서도 유용하다. 사용방법은 기존의 타깃 클래스나 메소드와 같지만 롤백 테스트은 불가능하다.
@Autowired
PlatformTransactionManager platformTransactionManager;
@Test
public void transation() throws Exception{
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(defaultTransactionDefinition);
try{
...
}
finally {
platformTransactionManager.rollback(transactionStatus);
}
}
물론 위와 같은 방식으로 롤백테스트를 진행할 수 있지만 그렇다면 @Transactional의 편의성보다 떨어지기에 @Rollback 어노테이션을 사용할 수 있다.
@Test
@Transactional
@Rollback
public void transation() throws Exception{
method();
method2();
}
확연히 코드가 줄여들었지만 같은 기능과 역할을 수행할 수 있다!! Rollback을 수행하고 싶지 않다면 value = false로 지정해주면 된다. 주의해야할 점은 @Rollback 어노테이션은 메소드 레벨에만 적용할 수 있다.
'Spring' 카테고리의 다른 글
IoC 컨테이너란 무엇인가 (0) | 2024.04.16 |
---|---|
어노테이션이란? (0) | 2024.04.02 |
Mockito 프레임워크 정리(TDD 작성, 테스트 코드 작성) (0) | 2024.03.22 |
JAVA Mail을 이용한 메일 발송 (0) | 2024.03.20 |
트랜잭션 (1) | 2024.03.16 |