SMALL

Spring에서 트랜잭션을 관리하는 방법은 크게 2가지 방법으로 나눌 수 있다.

 

Programmatic Transaction Management

PlatformTransactionManager, TransactionTemplate 등을 이용하여 

사용자가 직접 트랜잭션 개시, 커밋, 롤백 등을 수행하는 방법

 

Declarative Transaction Management

@Transaction 어노테이션을 통해서

트랜잭션에 관한 코드를 비즈니스 로직으로부터 분리해서 사용하는 방법

 

대부분의 경우에는 Declarative(선언적) Transaction Management를 사용하여 트랜젝션을 관리한다.

하지만, 특수한 경우에는 사용자가 직접 Transaction을 관리해야 하는 상황이 생긴다.

해당 경우에 어떠한 방식으로 트랜잭션을 관리하는지 알아보도록 하자

 

Declarative Transaction Management 예시

우선 일반적인 상황에서의 Transaction Management

 

@RequiredArgsConstructor
@Service
@Slf4j
public class ProductService {
    private final ProductRepository productRepository;
    @Transactional
    public String save(ProductSaveRequestDto requestDto) throws DuplicateException {
    	
    	if (productRepository.existsByCode(requestDto.getCode())) {
    		throw new DuplicateException("Code is duplicated. code = "+ requestDto.getCode());
    	}
        return productRepository.save(requestDto.toEntity()).getId().toString();
    }
}

 

Programmatic Transaction Management 예시

우선 TransactionManager를 @Autowired나 생성자를 통해 주입받는다 (1)

( Spring Boot를 사용한다면 자동적으로 bean이 등록되어, 사용만 하면 되지만, 그렇지 않는다면 직접 등록해주어야 한다) 

후에 Transaction을 개시한다 (transactionManager.getTransaction() ) (2)

DB 관련 작업을 진행한 후에  (3)

원하는 시점에 Transaction을 커밋 또는 롤백한다 (4)

@RequiredArgsConstructor
@Service
@Slf4j
public class TestService {
    
    private final TestRepository testRepositroy;
    private final PlatformTransactionManager transactionManager ;  // (1)
    
    public ResponseDto save(RequestDto requestDto) throws Exception {
        
        List<TestDto> list = requestDto.getParams();
        
         // (2)
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        
        try {
            testRepositroy.save(requestDto);  // (3)
        } catch (Exception e) {
            transactionManager.rollback(status);  // (4)
            throw new Exception();
        }
        
        transactionManager.commit(status);  // (4)
        
        ResponseDto responseDto = new ResponseDto();
        return responseDto;
    }
LIST

+ Recent posts