Spring

@Transactional

JUNGKEUNG 2022. 9. 29. 00:13

스프링에서 @Transactional 을 이용하여 트랜잭션 처리를 하는 방법

DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주면된다.

클래스, 메서드 모두에 @Transactional 어노테이션을 붙이면 메서드 레벨의 @Transactional 선언이 우선 적용된다.

java //게시판의 게시글을 삭제하는 메서드 
@Transactional 
public void removeBoard(Long id) throws Exception { 
replyDAO.removeAll(id); 
//삭제할 게시글의 답글 삭제 
boardDAO.deleteBoard(id); 
//게시글 삭제 
}

@Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다.

 

 

 

테스트 환경에서의 @Transactional 동작

테스트 메서드에 @Transactional을 사용하면 트랜잭션으로 감싸지며, 메서드가 종료될 때 자동으로 롤백된다.

org.springframework.test.context.transaction.TestTransaction 클래스를 이용해 알아보자.

 

 

TestTransaction

TestTransaction 클래스는 @Transactional 이 적용된 테스트 메서드를 감싸고 있는 트랜잭션과 상호 작용할 수 있는 기능을 가지는 유틸리티 클래스이다.

테스트 환경에서 아래 코드를 실행시켜보자. 현재 동작 중인 트랜잭션이 있는지 확인할 수 있다.

assertTrue(TestTransaction.isActive());

아래 코드도 실행시켜보자. 롤백 옵션이 적용되어 있는지 확인할 수 있는데, 디폴트로 롤백 옵션이 적용되어 있다.

assertTrue(TestTransaction.isFlaggedForRollback());

롤백 옵션을 바꾸고 싶다면 아래 코드를 통해 변경할 수 있다.

TestTransaction.flagForCommit(); 
TestTransaction.flagForRollback();

 

 

주의할 점

롤백되지 않는 경우

WebEnvironment의 RANDOM_PORT, DEFINED_PORT를 사용하면 실제 테스트 서버는 별도의 스레드에서 테스트를 수행하기 때문에 트랜잭션이 롤백되지 않는다.

'Spring' 카테고리의 다른 글

연관관계 매핑 고려사항 3가지  (0) 2022.10.25
연관관계 매핑 기초  (1) 2022.10.19
변경 감지와 병합(merge)  (0) 2022.09.29
빈 생명주기 콜백  (0) 2022.07.30
의존관계 자동 주입  (0) 2022.07.24