728x90
1. 관련 링크 : AOP - 개념정리
2. 관련 링크 : AOP 연습1(메시지 전송기능 구현)
3. 관련 링크 : AOP 연습2(로그 출력)
4. 관련 링크 : DB - 트랜잭션 개념정리
AOP 트랜잭션 설정방법
1. root-context.xml에 Namespace 탭를 클릭하고, tx(트랜잭션)를 추가한다.
2. root-context.xml에 Source에 Source에 트랜잭션 Namespace 태그가 자동적으로 생성되는데 하단에 트랜잭션관련 코드를 작성한다.
<!-- 트랜잭션 관련 설정 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 트랜잭션 관련 어노테이션을 자동인식-->
<tx:annotation-driven/>
3. 트랜잭션 처리를 하고 싶은 클래스나, 메서드에 @Transactional
어노테이션을 추가하면 자동적으로 트랜잭션을 수행한다.
ServiceImpl 클래스에서 메시지를 저장하고, 포인트를 적립하는 메서드에
@Transactional
어노테이션을 추가한다.
만약 메시지를 발송업무와 포인트를 적립업무를 수행하다가 둘 중 하나라도 오류가 발생하게되면 둘 다 수행 전상태로 Rollback하게 된다.
@Service
public class MessageServiceImpl implements MessageService {
@Inject
MessageDAO messageDao;
@Inject
PointDAO pointDao;
// 메시지 작성(DB저장, 포인트적립)
@Transactional // * 트랜잭션처리 대상 메서드
@Override
public void addMessage(MessageVO vo) {
// 공통업무 - 로그 확인
// 핵심업무 - 메시지 저장, 회원 포인트 적립
// 메시지를 테이블에 저장
messageDao.create(vo);
// 메시지를 발송한 회원에게 10포인트 추가
pointDao.updatePoint(vo.getSender(), 10);
}
// 메시지 열람
@Override
public MessageVO readMessage(String userid, int mid) {
return null;
}
}
트랜잭션 적용 확인
1. 오류발생
pointMappper에서 오타로 인한 오류를 발생시켜보자.
ARC에서 메시지를 전송하면 400에러 발생
2. ServiceImpl클래스의 addMessage메서드에 트랜잭션을 설정하지 않았을 때
DB확인 - 메시지테이블에 사용자가 발송한 메시지가 저장되었지만, 회원테이블의 포인트는 적립되지않았다.
3. ServiceImpl클래스의 addMessage메서드에 트랜잭션을 설정했을 때
DB확인 - 작업수행하기 전으로 Rollback