반응형

프로젝트 기능을 수행하다보면 각종 다양한 접근 방식이나 데이터 처리로 인해 오류를 만나게 됩니다.

이런 경우 하나의 서비스를 처리하면서 데이터에 대한 일관적인 상태를 유지하고 문제가 없게 관리를 해야합니다.

 

트랜잭션

정보처리기사 공부를 하다보면 트랜잭션 개념을 만나게 되는데, 여기서 나왔던 설명이 괜찮게 느껴져서 인용해겠습니다.

 

1. A라는 사람이 B의 중고 물건이 마음에 들어서 거래를 진행하게 되었습니다.

2. A는 B에게 물건에 해당하는 금액을 어플을 통해 송금하였습니다.

3. 송금을 했기때문에 A계좌에서는 해당하는 금액만큼 돈이 빠져나갔습니다.

4. 그사이 B계좌로 돈이 입금되어야하지만 알 수 없는 오류가 발생합니다.

5. A는 계좌에서 금액이 빠져나갔지만 B는 돈을 못받는 현상을 막기 위해 트랙잭션이 발생하고, A의 계좌는 원래대로 돌아옵니다.


이런식으로 데이터를 처리하는데 오류나 다양한 상황에 대하여 안정성을 확보하고 성공한 경우에만 반영을 해주는 것을 트랜잭션이라고 합니다.

 

 

 

트랜잭션의 특징

트랜잭션은 4가지의 특징을 지닙니다.

-원자성, 일관성, 독립성, 지속성

 

1. 원자성(Atomicity)

DB에 모두 반영하거나 반영되지 않는 것을 말합니다. 즉, 모두 성공으로 처리하거나 모두 실패로 처리해야합니다.

 

2. 일관성(Consistency)

트랜잭션 작업 처리의 결과가 항상 일관되어야 함을 말합니다.(데이터 타입이 반환 후와 전이 동일해야 함)

 

3. 독립성(Isolation)

동시 발생하는 트랜잭션들이 서로에게 영향을 미치지 않아야합니다.

 

4. 영속성(Durability)

트랜잭션을 성공적으로 마치면 결과가 영구적으로 저장되어야 합니다.

 

 

스프링 프로젝트 트랜잭션 설정하기

1. 어노테이션을 통한 설정하기

트랜잭션 설정을 위해서 다양한 방법이 있지만 그 중 어노테이션을 통한 설정 방법을 알아보겠습니다.

먼저 컨텍스트부분에 아래의 한 줄을 추가해주면 간단하게 적용이 가능합니다.

<tx:annotation-driven transaction-manager="txManager"/>

 

 

context-transaction.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

	<tx:annotation-driven transaction-manager="txManager"/>
	
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
</beans>

이후 트랜잭션을 처리하고 싶은 메소드나 클래스, 인터페이스 등에 @Transactional 어노테이션을 걸어주면 된다.

 

 

XXXService.java

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE)
public HashMap<Object, Object> insertUser(HashMap<Object, Object> params) {
	int result = loginMapper.insertUser(params);
	params.clear();
	params.put("result", result);
	return params;
}

inserUser라는 매퍼를 통해 insert쿼리를 수행하는 도중 오류가 발생하면 트랜잭션이 발생한다.

 

반응형