ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] @Transactional사용법 ( 트랜잭션: transaction )
    Web/Servlet && Spring 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로 묶어 주면 하나의 작업 단위로 인식해 메소드 안의 인자가 하나라도 에러가 나면 실행이 되지 않는다.

     

    반응형

    댓글

Designed by Tistory.