728x90
반응형
스프링은 @Transactional 애노테이션을 이용해서 트랜잭션을 처리하기 위해 내부적으로 AOP를 사용합니다.
실제로 @Transactional 애노테이션을 적용하기 위해 @EnableTransaction Management 태그를 사용하면 스프링은 @Transactional 애노테이션이 적용된 빈 객체를 찾아서 알맞은 프록시 객체를 생성합니다.
ChangePasswordService
package spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
public class ChangePasswordService {
@Autowired
private MemberDao memberDao;
@Transactional
public void changePassword(String email, String oldPwd, String newPwd) {
Member member = memberDao.selectByEmail(email);
if(member == null) {
throw new MemberNotFoundException();
}
member.changePassword(oldPwd, newPwd);
memberDao.update(member);
}
public void setMemberDao(MemberDao memberDao) {
this.memberDao = memberDao;
}
}
MainForCPS
package main;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import config.AppCtx;
import spring.ChangePasswordService;
import spring.MemberNotFoundException;
import spring.WrongIdPasswordException;
public class MainForCPS {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
ChangePasswordService cps = ctx.getBean("changePwdSvc", ChangePasswordService.class);
try {
cps.changePassword("madvirus@madvirus.net", "3333", "1111");
System.out.println("암호 변경");
} catch (MemberNotFoundException e) {
System.out.println("회원 데이터 미존재");
} catch (WrongIdPasswordException e) {
System.out.println("암호가 올바르지 않음.");
}
ctx.close();
}
}
스프링은 프록시를 이용해서 트랜잭션을 처리합니다.
ChangePasswordService 클래스의 메서드에 @Transactional 애노테이션이 적용되어 있으므로 스프링은 트랜잭션 기능을 적용한 프록시 객체를 생성합니다.
1) MainForCPS 클래스에서 getBean() 메서드를 실행하면
2) ChangePasswordService 객체 대신에 트랜잭션 처리를 위해 생성한 프록시 객체를 리턴합니다.
3) 해당 프록시 객체는 @Transactional 애노테이션이 붙은 메서드를 호출하면 위의 그림 1.1: getTransaction() 메서드를 호출하여 PlatformTransactionManager 사용해서 트랜잭션을 시작합니다.
4) 트랜잭션을 시작한 후 실제 객체의 메서드를 호출하고(1.2: changePassword(), 1.3: return),
5) 성공적으로 실행되면 트랜잭션을 커밋합니다.(1.4: commit())
728x90
반응형
'Spring' 카테고리의 다른 글
[Spring] @Transactional 속성 (0) | 2024.03.04 |
---|---|
[Spring] @Transactional 적용 메서드 롤백 처리 (0) | 2024.03.04 |
[Spring] Spring DB 트랜잭션 처리 (1) | 2024.02.28 |
[Spring] Spring DB - 익셉션 변환처리 (0) | 2024.02.27 |
[Spring] Spring DB 연동 과정에서 발생하는 Exception (0) | 2024.02.26 |