Spring 14 트랜잭션 관리(@Transactional)

Kang.__.Mingu·2024년 9월 16일

Spring

목록 보기
13/21

SpringMVC 기능을 사용한 웹프로그램에서 TransactionManger 객체를 사용해 트랜잭션을 관리하는 방법

  1. spring-tx 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml
    =>spring-jdbc 라이브러리를 프로젝트에 빌드 처리하면 라이브러리 의존관계에 의해 자동으로 빌드 처리

  2. Spring Bean Configuration File(root-context.xml)에 TransactionManager 관련 클래스를 Spring Bean으로 등록

<!-- annotation-driven : @Transcational 어노테이션을 사용해 TransactionManager 객체로
트렌젝션 관리 기능을 제공하는 엘리먼트 -->
<tx:annotation-driven/>
  1. Spring Bean Configuration File(servlet-context.xml)에 트렌젝션 처리를 위한 Spring AOP 설정(root-context.xml 에 등록하면 안해도 따로 설정 안해도 되는 거 같긴 함)
	<!-- TransactionManager 객체를 사용해 트렌젝션를 관리할 수 있도록 설정하기 위해 tx 네임스페이스에
	spring-tx.xsd 파일을 제공받아 엘리먼트를 사용할 수 있도록 설정 -->
	<!-- advice : TransactionManager 객체로 Advisor를 생성하기 위한 엘리먼트 -->
	<!-- Advisor : 삽입위치(JoinPoint)가 정해져 있는 횡단관심코드가 작성된 Advice 객체 -->
	<!-- id 속성 : advice 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
	<!-- transaction-manager 속성 : TransactionManager 기능을 제공하는 Spring Bean의 식별자
	(beanName)를 속성값으로 설정 -->
	<!-- => TransactionManager 객체를 사용해 예외가 발생되지 않은 경우 커밋 처리하고
	예외가 발생될 경우 롤백 처리 -->
	<!-- attributes : TransactionManager 객체에 의해 커밋 또는 롤백 처리될 메소드의 목록을
	설정하기 위한 엘리먼트 - 하위 엘리먼트 : method 엘리먼트 -->
	<!-- method : TransactionManager 객체에 관리될 메소드의 이름과 트렌젝션 처리 방식을 설정하기 위한 엘리먼트 -->
	<!-- name 속성 : TransactionManager 객체에 관리될 메소드의 이름을 속성값으로 설정 -->
	<!-- => 메소드의 이름에는 [*] 기호를 사용해 설정 가능 -->
	<!-- rollback-for 속성 : 롤백 처리하기 위한 예외를 속성값으로 설정 -->
	<!-- read-only 속성 : false(기본) 또는 true(트렌젝션 불필요) 중 하나를 속성값으로 설정 -->
	<!-- 
	<tx:advice id="txAdvisor" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" rollback-for="Exception"/>
			<tx:method name="modify*" rollback-for="Exception"/>
			<tx:method name="remove*" rollback-for="Exception"/>
			<tx:method name="get*" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	-->

	<!-- Spring AOP 기능을 사용하기 위해 aop 네임스페이스에 spring-aop.xsd 파일을 제공받아 
	엘리먼트를 사용할 수 있도록 설정 -->
	<!-- advisor : Advisor를 제공받아 사용하기 위한 엘리먼트 -->
	<!-- advice-ref 속성 : Advisor를 생성한 advice 엘리먼트의 식별자를 속성값으로 설정 -->
	<!-- 
	<aop:config>
		<aop:advisor advice-ref="txAdvisor" pointcut="execution(* xyz.itwill09.service..*(..))"/>
	</aop:config>
	-->

=> 트랜잭션 관리를 위한 AOP 설정 대신 @Transcational 어노테이션 사용 가능

@Transcational

TransactionManager 객체에 의해 트랜잭션 관리될 메소드에 @Transcational 어노테이션을 사용하면 예외가 발생하지 않은 경우 커밋 처리하고 예외가 발생된 경우 롤백 처리

  • @Transcational 어노테이션을 사용하기 위해서는 Spring Bean Configuration File(root-context.xml)에 annotation-driven 엘리먼트 작성

  • Spring Bean Configuration File에서 tx 네임스페이스에 spring-tx.xsd 파일을 제공 받아야만 annotation-driven 엘리먼트를 사용 가능

  • rollbackFor 속성: 롤백 처리될 예외 클래스의 Class 객체를 속성값으로 설정 - 생략 가능

  • 테스트 메소드에 @Transactional 어노테이션을 사용하면 예외 발생에 상관 없이 무조건 롤백 처리


  • PointBoardServiceTest.java
  • PointUserServiceTest.java
  • PointBoardServiceImpl.java 참고
  • root-context.xml(설정)
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글