hyeonga_code

reProject_34_트랜잭션 적용하기 본문

Project_WEATHERWEAR

reProject_34_트랜잭션 적용하기

hyeonga 2024. 1. 28. 05:59
반응형

 

reProject_33_ZenBlog 부트스트랩을 사용하여 사용자 화면 작업(메인페이지, 상품 목록 페이지, 상품

reProject_32_배송관리 페이지 작업 2024.01.20 배송관리는 택배사를 관리하는 페이지가 있어야 해서 작업한 기능이다. 택배사 리스트 페이지, 택배사 추가, 수정, 삭제 기능을 구현했다. 따로 상세 페

hyeonga493.tistory.com

2024.01.26

기존에 작업할 때 트랜잭션이 적용된 줄 알았는데 상품 등록 시 옵션 등록에 오류가 발생했으나 product, product_price 테이블에 삽입한 데이터는 그대로 존재하는 것을 알게되었다. 트랜잭션이 적용이 안되고 있어 다시 트랜잭션을 적용한다.

 

1. 트랜잭션을 사용하기 위해서는 라이브러리가 필요하다.

- aspectjrt : https://mvnrepository.com/artifact/org.aspectj/aspectjrt/1.9.19

- aspectjweaver : https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.9.19

두 라이브러리를 모두 설정해놓았는 줄 알았는데 aspectjweaver가 빠져있었다.

pom.xml 파일에 포함되어 있어야 한다.

<!-- Aspectrt -->
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjrt</artifactId>
		    <version>1.9.19</version>
		    <scope>runtime</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjweaver</artifactId>
		    <version>1.9.19</version>
		    <scope>runtime</scope>
		</dependency>

>> 프로젝트 우클릭 > Maven > Update Project

 

2. applicationContex.xml 파일 수정

1) .xml 파일의 Namespaces에서 tx를 추가

 

2) 트랜잭션을 관리할 관리자를 등록

---- 모든 트랜잭션 관리자는 PlatformTransactionManager Interface를 구현한 클래스

---- 모든 트랜잭션 관리자는  Transaction 관리에 필요한 commit(), rollback() 메소드를 가지고 있음

public interface PlatformTransactionManager{
	TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

 

3) DataSourceTransactionManger 클래스 빈 등록

---- JDBC를 기반이므로 DataSourceTransactionManager 클래스를 사용합니다.

---- JPA를 사용한 DAO 클래스를 사용하는 경우 JPATransactionManager를 적용

<!-- Transaction 관리자 설정 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" />

 

4) 트랜잭션 Advice 설정

---- 트랜잭션 관리 기능 Advice는 <tx:advice> 로 설정

---- 직접 구현하지 않고 스프링 컨테이너가 자동으로 참조하여 생성

------ 트랜잭션 관리 Advice 객체의 클래스 이름이나 메소드를 확인할 수 없음

------ Advice 아이디를 id 속성, 트랜잭션 관리자를 transaction-manager 속성으로 지정만 할 수 있다.

<!-- Transaction aop 설정 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="insert*" rollback-for="Exception"/> 
			<tx:method name="update*" rollback-for="Exception"/> 
			<tx:method name="delete*" rollback-for="Exception"/> 
		</tx:attributes>
	</tx:advice>

 

5) <aop:advisor> 트랜잭션 적용

---- <aop:advisor>

---- <aop:aspect>

------ 포인트컷과 결합할 어드바이스 객체의 아이디와 어드바이스 메소드 이름을 알고 있어야 하지만 스프링 컨테이너가 자동으로 생성하기에 사용할 수 없음

   <!-- aop -->
   <aop:config>
      <aop:pointcut expression="execution(* com.w2..*(..))" id="txPointcut"/>
      <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
   </aop:config>

 

>>> Client가 Service 객체의 메소드를 호출하면 그 메소드의 비즈니스 로직이 수행되며 DB 작업을 진행한다.

진행 도중 문제가 발생하는 경우 txAdvice로 등록된 Advice가 동작하며 txManager의 rollback()함수를 호출하고, 정상 수행된 경우 commit() 메소드를 호출한다.

 

reProject_35_사용자 메인페이지, 상품 목록 페이지 기능 구현

reProject_34_트랜잭션 적용하기 reProject_33_ZenBlog 부트스트랩을 사용하여 사용자 화면 작업(메인페이지, 상품 목록 페이지, 상품 reProject_32_배송관리 페이지 작업 2024.01.20 배송관리는 택배사를 관리

hyeonga493.tistory.com

 

반응형