hyeonga_code
reProject_34_트랜잭션 적용하기 본문
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
'Project_WEATHERWEAR' 카테고리의 다른 글
reProject_36_사용자 장바구니 기능 구현(수량 변경, 선택 삭제, 전체 삭제) (0) | 2024.01.29 |
---|---|
reProject_35_사용자 메인페이지, 상품 목록 페이지 기능 구현 (0) | 2024.01.28 |
Project_구글 계정으로 이메일 보내기_앱 비밀번호 생성하기 (1) | 2024.01.27 |
reProject_33_ZenBlog 부트스트랩을 사용하여 사용자 화면 작업(메인페이지, 상품 목록 페이지, 상품 상세 페이지) (1) | 2024.01.27 |
reProject_32_배송관리 페이지 작업 (1) | 2024.01.26 |