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로 묶어 주면 하나의 작업 단위로 인식해 메소드 안의 인자가 하나라도 에러가 나면 실행이 되지 않는다.
반응형