- 테스트용 UserService
- 원자성 all or norhing
- 트랜잭션 경계 설정
- 트랜잭션 동기화
- Connection 파라미터 제거 ➜
TransactionSynchronizationManager , DataSourceUtils
- 스프링의 트랜잭션 서비스 추상화
- 트랜잭션 API 의존관계 문제 해결 ➜
PlatformTransactionManager , TransactionStatus
- 글로벌 트랜잭션 등 변경 by 트랜잭션 설정 분리 ( DI )
- 메일 서비스 추상화
트랜잭션 테스트 위한 트랜잭션 중단 로직 테스트용 코드 GitHub
static class TestUserLevelUpgrade implements UserLevelUpgradePolicy {
private final String id;
public TestUserLevelUpgrade(String id) {
this.id = id;
}
@Override
public boolean canUpgradeLevel(User user) {
Level currentLevel = user.getLevel();
switch (currentLevel) {
case BASIC:
return (user.getLogin() >= UserService.MIN_LOG_COUNT_FOR_SILVER);
case SILVER:
return (user.getRecommend() >= UserService.MIN_RECOMMEND_FOR_GOLD);
case GOLD:
return false;
default:
throw new IllegalArgumentException("Unknown Level: " + currentLevel);
}
}
@Override
public void upgradeLevel(User user) {
if (user.getId().equals(this.id)) {
throw new TestUserServiceException();
}
user.upgradeLevel();
}
}
static class TestUserServiceException extends RuntimeException {}
TransactionSynchronizationManager,DataSourceUtilsPlatformTransactionManager,TransactionStatus트랜잭션 테스트 위한 트랜잭션 중단 로직 테스트용 코드 GitHub