트랜잭션이란?
- 데이터베이스의 상태를 변화시키는 작업(select,insert,update,delete)의 단위
- 2개 이상의 쿼리를 하나의 커넥션으로 묶고, DB에 전송하고 이 과정에서 오류가 날 경우 모든 과정을 되돌림
- 하나 이상의 쿼리에서 동일한 Connection 객체를 유지하는 것
- DB와 JAVA언어가 데이터를 주고 받는 과정에서 원자성을 부여하는 작업
스프링에서의 트랜잭션이란?
- 다이나믹 프록시와 AOP 기술을 통해 트랜잭션을 통제할 수 있음.
스프링에서 트랜잭션을 설정하는 방법?
1. xml
2. @어노테이션
3. AOP에 의한 트랜잭션 선언
우선은 xml에서 트랜잭션을 설정하는 방법을 해보려고한다.
[context-datasource.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- transaction manager -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="delete*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* com.sts.hello.dao.BoardDAO.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
</aop:config>
<bean id="BoardDao" class="com.sts.hello.dao.BoardDAO"/>
</beans>
- transactionManager는 dataSource의 정의를 참조한다.
- tx 태그는 스프링에서 transacition을 적용하기 위해 사용하는데, namespace에서 추가를 해줘야한다.
- 트랜잭션에서 사용할 advice를 설정해준다.
- 다음은 tx:advice에서 사용하는 속성 값에 대한 설명이다.
name : 트랜잭션을 적용할 이름을 명시. 필수 속성이다
propagation : 트랜잭션 동작 설정. 기본으로 REQUIRED
isolation : 트랜잭션의 격리 수준 설정. 기본값 DEFAULT
timeout : 트랜잭션의 시간초과 값을 설정. 기본값 -1이고, 초단위로 입력
read-only : 읽기 전용 여부를 설정. 기본값 false
rollback-for : 롤백을 할 예외를 설정. 여러개로 입력할 경우 ','로 구분. 기본갑 RuntimeException.
no-rollback-for : 롤백하지 않을 예외를 설정. 여러개로 입력할 경우 ','로 구분
자세한 설명 -> 전자정부 트랜잭션
- aop 태그는 트랜잭션을 적용할 대상을 설정 maven dependency 추가
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
- 인터페이스 없이 트랜잭션을 사용할 경우 오류가 나므로, 동적으로 자바 클래스의 프록시를 생성해주는 CGLib를
maven dependency에 추가
<!-- CGLib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
- 트랜잭션에 대한 설정을 끝내고, 이제 트랜잭션을 걸어보겠습니다
[BoardServiceImp.java] 라는 서비스 로직에서 트랜잭션을 걸어주는데, 보통 서비스 단에서 건다고 한다
package com.sts.hello.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sts.hello.dao.BoardDAO;
import com.sts.hello.domain.BoardVO;
@Service(value="boardService")
public class BoardServiceImp implements BoardService {
@Autowired
private BoardDAO boardDAO;
@Override
public void delete(Integer b_no) throws Exception {
// TODO Auto-generated method stub
boardDAO.delete(b_no);
throw new Exception("강제오류!!");
}
}
- 위 소스는 게시판의 삭제 관련 소스인데, 서비스에서 삭제 메소드를 실행 후 강제 익셉션을 걸어주었다
- 그럼 위 사진과 같이 강제오류를 걸었던 익셉션 내용이 나오게 되고, 트랜잭션이 잘 걸렸는지 확인하기 위해 에러
로그를 확인해준다.(트랜잭션을 걸렸다면, 로그에 트랜잭션 관련 로그가 찍혀있을 것이다)
참조 : Full Stack Web Developer 사쿠
관련 용어 : 프로시저,java config,다이나믹 프록시, AOP
'Spring Framework > spring' 카테고리의 다른 글
스프링 tiles(타일즈) 설정하기 (0) | 2019.08.12 |
---|---|
스프링 MVC 설정으로 게시판 만들기 Part_2 (0) | 2019.08.09 |
스프링 MVC 설정으로 게시판 만들기 Part_1 (0) | 2019.08.09 |
스프링 프로젝트 - 트랜잭션 Part_2 (0) | 2019.08.08 |
처음 시작하는 스프링 프로젝트 (0) | 2019.08.08 |