spring - @Transactional(스프링 트랜잭션 적용하기.)

스프링로고

들어가기

Spring에서 트랜잭션을 설정하는 방법은 크게 XML파일을 이용한 설정과, 어노테이션을 이용한 설정이 있다.

이 글에서는 @Transactional 어노테이션을 이용하면 간단하게 트랜잭션 처리에 대해 정리하겠다.

AOP + tx:advice 태그를 이용한 트랜잭션 보다 간단하게 사용 할 수 있다.


root-contenxt.xml에 transactionManager 설정하기

일단 root-context.xml 파일에 트랜잭션 처리를 위한 transactionManager를 설정해야 한다. 아래 내용을 root-context.xml 파일에 추가하자.

1
2
3
4
5
6
7
<!-- 트랜젝션 매니저 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- @Transactional 애노테이션을 sacn하기 위한 설정 -->
<tx:annotation-driven/>

트랜잭션이 필요한 서비스에 @Transactional 어노테이션을 달아주자.

정말 간단하다. 트랜잭션이 필요한 서비스 클래스에 @Transactional 어노테이션을 달아주면된다.

1
2
3
4
5
6
7
8
9
10

//게시글 삭제
@Transactional
@Override
public void removeBoard(BoardVO vo) throws Exception {

replyDAO.removeAllRepl(vo.bno); //삭제할 게시글의 답글 삭제
boardDAO.deleteBoard(vo.bno); //게시글 삭제

}

위처럼 간단한 설정으로 트랜잭션 설정을 할 수 있다.


@Transactional에 대한 조금더 자세한 설정

@Transactional 애노테이션은 위 예제의 처럼 클래스의 메소드 뿐만 아니라, 인터페이스, 클래스 선언에도 사용할수 있다.

메소드에 선언된 @Transactional의 설정이 가산 우선되기 때문에, 공통적인 규칙은 인터페이스, 클래스 등에 적용하고 특별한 설정은 메소드에 적용할수 있다.


@Transactional 속성

isolation (격리레벨)

  • DEFAULT: DB 설정, 기본 격리 수준(기본설정)
  • SERIALIZABLE : 가장 높은 격리, 성능 저하의 우려가 있음
  • READ_UNCOMMITED : 커밋되지 않는 데이터에 대한 읽기를 허용
  • READ_COMMITED : 커밋된 데이터에 대해 읽기 허용
  • REPEATEABLE_READ : 동일 필드에 대해 다중 접근 시 모두 동일한 결과를 보장

설정 예: @Transactional(isolation=Isolation.DEFAULT)

propagation (전파속성)

  • PROPAGATION_MANDATORY : 작업은 반드시 특정한 트랜잭션이 존재한 상태에서만 가능
  • PROPAGATION_NESTED : 기존에 트랜잭션이 있는 경우, 포함되어서 실행
  • PROPAGATION_NEVER : 트랜잭션 상황에 실행되면 예외 발생
  • PROPAGATION_NOT_SUPPORTED : 트랜잭션이 있는 경우에는 트랜잭션이 끝날 때까지 보류된 후 실행
  • PROPAGATION_REQUIRED : 트랜젝션이 있으면 그 상황에서 실행, 없으면 새로운 트랜잭션 실행(기본설정)
  • PROPAGATION_REQUIRED_NEW : 대상은 자신만의 고유한 트랜잭션으로 실행
  • PROPAGATION_SUPPORTS : 트랜젝션을 필요료 하지 않으나, 트랜잭션 상황에 있다면 포함되어서 실행

설정 예: @Transactional(propagation=Propagation.REQUIRED)

readOnly 속성

  • true인 경우 insert, update, delete 실행 시 예외 발생, 기본 설정은 false

설정 예: @Transactional(readOnly = true)

rollbackFor 속성

  • 특정 예외가 발생 시 강제로 Rollback

설정 예: @Transactional(rollbackFor=Exception.class)

noRollbackFor 속성

  • 특정 예외의 발생 시 Rollback 처리되지 않음

설정 예: @Transactional(noRollbackFor=Exception.class)

timeout 속성

  • 지정한 시간 내에 해당 메소드 수행이 완료되이 않은 경우 rollback 수행. -1일 경우 no timeout(Default=-1)

설정 예: @Transactional(timeout=10)

마무리

음.. 전파속성은 어떤경우에 사용할까???