반응형
스프링에서 @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 |