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 |