반응형
목차는 다음과 같다.
1. 트랜잭션
1) name Space 설정
2) 트랜잭션 관리자 클래스 등록
3) 어떤 비즈니스 메서드에 대해(언제), 무슨 공통로직을 수행할지(무엇을)
4) 결과
1. 트랜잭션
트랜잭션은 작업의 처리 단위이다.
이전에 사용하던 advice클래스(해당 링크 포스팅 하단)는 .xml이나 @의 방법이 모두 가능하나, 트랜잭션 처리는 xml으로만 가능하다. 기본 제공하는 클래스를 가져다 쓸 예정인데, 눈에 보이는 클래스 파일이 없기 때문에 클래스명& 메서드명을 알 수 없으므로, 어노테이션을 달기 어렵다.
1) name Space 설정
tx라는 선택항목을 체크하여 저장한다.
2) 트랜잭션 관리자 클래스 등록
어떤 방식으로 DB연동(JDBC, Mybatis, JPA 등)을 사용하고 있는지에 따라 관리자 클래스가 달라진다.
- 현재는 커넥션을 관리하는 방식으로 DB를 연동하기 때문에, DataSourceTransactionManager클래스를 사용하게 될 예정이다.
- 후에 DB연동 방식이 달라지게 되면 다른 클래스를 사용하면 된다.
위의 내용은 기존 실습에서 사용하던 설정이다. 주석을 통해 트랜잭션 관리자 클래스 등록을 위한 코드를 확인할 수 있다.
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><!-- destroy-method로 연결해제 메서드 추가 -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hamdb"/>
<property name="username" value="root"/>
<property name="password" value="12341234"/>
</bean>
<!-- JDBCTemplate생성 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<context:component-scan base-package="com.test.app"/>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy><!-- 초기설정 -->
<!-- 트랜잭션 관리자 클래스 등록 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
3) 어떤 비즈니스 메서드에 대해(언제), 무슨 공통로직을 수행할지(무엇을)
마찬가지로 맨 아래쪽 주석을 통해 해당되는 코드를 확인할 수 있다.
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><!-- destroy-method로 연결해제 메서드 추가 -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hamdb"/>
<property name="username" value="root"/>
<property name="password" value="12341234"/>
</bean>
<!-- JDBCTemplate생성 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<context:component-scan base-package="com.test.app"/>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy><!-- 초기설정 -->
<!-- 트랜잭션 관리자 클래스 등록 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 동작 시점과 동작할 공통로직을 설정 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/><!-- 트랜잭션 처리(commit, rollback)가 들어가지는 않도록 참조만 해둠 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.test.app..*(..))" id="txPointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /><!-- aspect대신 사용!스프링 프레임워크가 지원하는 클래스에 대한 것은 이 설정으로 등록! -->
</aop:config>
</beans>
<aop:pointcut>의 expression(표현식)에 대한 설명을 첨부하였다.
4) 결과
서비스클래스의 insert메서드가 한 번 수행되면 dao의 insert메서드가 두 번 호출 되도록 하여 일부러 예외를 발생시켰다.
package com.test.app.board.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.test.app.board.BoardService;
import com.test.app.board.BoardVO;
import com.test.app.common.LogAdvice;
@Service("boardService")
// Shape: Circle,Rect,Tri,...
// @Component: @Service,@Repository,@Controller,...
public class BoardServiceImpl implements BoardService {
@Autowired // DI
private BoardDAO boardDAO;
@Override
public void insertBoard(BoardVO vo) { // 코드는 이와 같다
boardDAO.insertBoard(vo);
boardDAO.insertBoard(vo);
}
@Override
public BoardVO getBoard(BoardVO vo) {
return boardDAO.getBoard(vo);
}
@Override
public List<BoardVO> getBoardList(BoardVO vo) {
return boardDAO.getBoardList(vo);
}
@Override
public void updateBoard(BoardVO vo) {
boardDAO.updateBoard(vo);
}
@Override
public void deleteBoard(BoardVO vo) {
boardDAO.deleteBoard(vo);
}
}
그에 대한 실행 결과이다.
반응형
'Spring' 카테고리의 다른 글
이미지 업로드 + 예외처리 (0) | 2022.04.12 |
---|---|
[레이어] 비즈니스 컴포넌트 (0) | 2022.04.11 |
[AOP] 다양한 어노테이션 : Controller_3 (0) | 2022.04.07 |
[AOP] JDBC Template_DAO2 (0) | 2022.04.06 |
[AOP] xml을 @로 바꾸기 : 횡단관심_aop(2) (0) | 2022.04.05 |