Web/Servlet && Spring

[Spring] @Transactional사용법 ( 트랜잭션: transaction )

jinsiri 2019. 8. 29. 21:35

Transaction이란? DBMS에서 수행하는 작업의 단위이다.

ACID 원자성, 일관성, 격리성, 지속성

 

여러 작업이 동시에 실행이 되어야 할때, 즉 한트랜잭션에 3가지 작업이 있다고 가정하고 1가지 작업에서 에러가 나면 이 트랜잭션은 중지 되어야 한다.

그래서 Spring에서 트랜잭션을 구현할 수 있다.

 

트랜잭션 설정방법

servlet-context.xml  내용 추가

<!-- 트랜잭션 사용하기 위해 -->
<beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!-- name은 DataSourceTransactionManager클래스의 변수 명이고 ref는 위의 dataSource를 DI하겠다는 것 -->
	<beans:property name="dataSource" ref="dataSource" />
</beans:bean>

servlet-context.xml 에서 Namespaces에서 tx체크 후 태그 하나 더 추가

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

StudentDAO.java 메소드 추가

private JdbcTemplate jdbcTemplate;

// DataSource는 sql것으로 임포트
// 세터 주입방식
@Autowired
public void setDataSource(DataSource dataSource) {
	this.jdbcTemplate = new JdbcTemplate(dataSource);
}

public void create(Student student) {
	String sql = "INSERT INTO Student(id, name, age) values(?,?,?)";
	jdbcTemplate.update(sql, student.getId(), student.getName(), student.getAge());
}

// 학생수정 메소드 (일부러 잘못된 sql문 입력)
public void update(Student student) {
	String sql = "INSERT INTO Student_Bad(id, name, age) values(?,?,?)";
	jdbcTemplate.update(sql, student.getId(), student.getName(), student.getAge());
}

//학생 입력 후 에러가 발생하는 학생 수정을 호출
@Transactional // 이 메소드에서 실행되는 작업은 전부 하나의 작업으로 처리되어서 하나가 에러나면 다른건 실행을 안한다.
public void sampleTransaction(Student student) {
	this.create(student);
	this.update(student);
}

Controller에서 호출

create메소드는 정상작동하지만 update는 에러가 난다. 이 메소드들을 @Transactional로 묶어 주면 하나의 작업 단위로 인식해 메소드 안의 인자가 하나라도 에러가 나면 실행이 되지 않는다.

 

반응형