본문 바로가기
Spring

Spring Transaction Management

by S2채닝S2 2023. 3. 9.

Transaction의 개념

    : 작업 수행의 논리적 관리

    자세한 내용은 링크 참고

https://cocodata12.tistory.com/49

 

Database Transaction, ACID

데이터베이스 트랜잭션 - 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위 - 유사한 시스템: 트랜잭션의 성공과 실패가 분명하고 상호 독립적이며 일관되고 믿을 수 있는 시

cocodata12.tistory.com

 

Spring Transaction Management

 

Transaction Manager를 이용한 transaction

public void testTransaction(Customer customer){
     var transaction = transactionManager.getTransaction(new DefaultTransactionDefinition());
     try{
         namedParameterJdbcTemplate.update("UPDATE customers SET name=:name WHERE customer_id = UUID_TO_BIN(:customerId)", toParamMap(customer));
         namedParameterJdbcTemplate.update("UPDATE customers SET email=:email WHERE customer_id = UUID_TO_BIN(:customerId)", toParamMap(customer));

         //에러가 발생하지 않고 모두 성공했을 때 commit
         transactionManager.commit(transaction);
     }catch (DataAccessException e){
         logger.error("Got error", e);

         //에러 발생했을 경우 rollback
         transactionManager.rollback(transaction);
     }

 

Transaction Template를 이용한 transaction

    - Transaction Manager 를 간소화한 Template

public void testTransaction(Customer customer){
    transactionTemplate.execute(new TransactionCallbackWithoutResult(){
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            namedParameterJdbcTemplate.update("UPDATE customers SET name=:name WHERE customer_id = UUID_TO_BIN(:customerId)", toParamMap(customer));
            namedParameterJdbcTemplate.update("UPDATE customers SET email=:email WHERE customer_id = UUID_TO_BIN(:customerId)", toParamMap(customer));
        }
    });

 

@Transactional

    - spring에서는 어노테이션을 이용해 선언적 트랜잭션 관리가 가능하다.

    - AOP와 같은 방식으로 동작한다..

    - 위의 코드에서는 개발자가 transactionManager, TransactionTemplate 로 transaction을 관리하는데, 스프링에서는  @Transactional 어노테이션으로 간단하게 트랜잭션을 관리할 수 있다.

 
 

 

* AOP 방식

     - 핵심 비즈니스 로직만 남기고 트랜잭션 처리(commit, rollback 등의 부가기능)을 붙임.

     - @Transactional이 붙은 메소드에 대해 트랜잭션 처리를 함

     - Controller, Service, Repository 중 service의 메소드에 붙여 처리한다.

         >> 보통 Repository는 기본적인 CRUD만 담당하고, 핵심 비즈니스 로직은 Service가 담당하기 때문. 

         >> Service에서 여러 연산들이 묶이기 때문에 트랜잭션 처리가 필요함.

예제

//Repository
Customer insert(Customer customer);
Customer findById(UUID customerId);
Customer update(Customer customer);
void deleteById(UUID customerId);

//Service
//여러 고객을 등록
@Transactional
public List<Customer> multiRegister(List<Customer> customers){
	customers.forEach(repository::insert);
}

@Transactional
public List<Customer> findAll(){return repository.findall();}


//호출부
List<Customer> customers = List.of(
    new Customer(UUID.randomUUID(), "a", "a@gmail.com");
    new Customer(UUID.randomUUID(), "b", "b@gmail.com");
    new Customer(UUID.randomUUID(), "c", "b@gmail.com");//email 중복, error 발생
);

service.multiRegister(customers);
service.findAll().size(); // error가 발생하여 트랜잭션이 취소되었으므로 결과는 0이어야 함

 

 

 

AOP에 대한 자세한 내용은 아래 블로그 글을 참고

https://cocodata12.tistory.com/51

 

관점 지향 프로그래밍(AOP; Aspect Orient Programming)

AOP - 관점 지향 프로그래밍 - Aspect Orient Programming - aspect: 관점, 기능, 관심. - Cross Cutting Concern을 해결해주는 방법 중 하나. - 핵심기능(Business Logic)과 부가기능(Cross Cutting Concerns)을 분리한다. - Cross

cocodata12.tistory.com

 

'Spring' 카테고리의 다른 글

Application Context  (0) 2023.03.14
Spring MVC  (0) 2023.03.14
관점 지향 프로그래밍(AOP; Aspect Orient Programming)  (0) 2023.03.08
RuntimeException 1073741515: Embedded Mysql  (0) 2023.03.02
Spring JDBC: DBCP  (0) 2023.02.27

최근댓글

최근글

skin by © 2024 ttuttak