-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[7주차](양재승, 김수환, 권용현) #9
Comments
chapter 6. AOP
트랜잭션 4가지 속성트랜잭션이라고 모두 같은 방식으로 동작하는 것이 아니다. DefaultTransactionDefinition이 구현하고 있는 TransactionDefinition 인터페이스는 트랜잭션 동작방식에 영향을 줄 수 있는 4가지 속성을 정의하고 있다.
포인트컷과 트랜잭션 속성의 적용 전략프록시 방식 AOP는 같은 타깃 오브젝트 내의 메소드를 호출할 때는 적용되지 않는다 프록시 방식의 AOP에서는 프록시를 통한 부가 기능의 적용은 클라이언트로부터 호출이 일어날 때만 가능하다. (여기서 클라이언트는 인터페이스를 통해 타깃 오브젝트를 사용하는 다른 모든 오브젝트) 반대로 타깃 오브젝트가 자기 자신의 메소드를 호출할 때는 프록시를 통한 부가기능의 적용이 일어나지 않는다. 따라서 같은 오브젝트 안에서의 호출은 새로운 트랜잭션 속성을 부여하지 못한다는 사실을 의식하고 개발할 필요가 있다. 타깃 안에서의 호출에는 프록시가 적용되지 않는 문제를 해결할 수 있는 방법은 두 가지가 있다.
트랜잭션 경계설정의 일원화트랜잭션 경계설정의 부가기능을 여러 계층에서 중구난방으로 적용하는 건 좋지 않다. 일반적으로 특정 계층의 경계를 트랜잭션 경계와 일치시키는 것이 바람직하다. 비즈니스 로직을 담고 있는 서비스 계층 오브젝트의 메소드가 트랜잭션 경계를 부여하기에 가장 적절한 대상이다. |
[6.7] 트랜잭션 어노테이션과 포인트컷
@Trasactional포인트컷과 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방식은 세밀하게 튜닝된 트랜잭션 속성의 경우 포인트컷과 트랜잭션 속성 사용으로는 적합하지 않다.
트랜잭션 속성과 포인트컷
4 단계 대체정책
[1] // 선언 타입
public interface Service {
[2] // 선언 메소드
void method1();
[3]
void method2();
}
[4] // 타겟 클래스
public class Servicelmpl implements Service {
[5] // 타겟 메소드
public void method1() (
[6]
public void method2() {
}
@transactional 적용
@Transactional
public interface UserService {
void add(User user);
void deleteAll();
void update(User user1);
void upgradeLevels();
// 메소드 레벨에 @Trasactional이 없으므로 타입레벨에 부여된 디폴트 속성이 부여된다.
@Transactional(readOnly = true)
User get(String id);
@Transactional(readOnly = true)
List<User> getAll();
// 메소드 레벨에 부여됐기 때문에 메소드 마다 반복된다.
} [6.8] 트랜잭션 지원 테스트선언적 트랜잭션과 트랜잭션 전파 속성
REQUIRED로 전파속성 지정
선언적 트랜잭션 : AOP를 이용해 코드 외부에서 트랜잭션 기능을 부여해주는 방법
트랜잭션 동기화
트랜잭션 동기화 기술은 같은 DB Connection을 공유하는 특성을 이용하여 트랜잭션 전파 속성에 따라 참여할 수 있도록 한다. 트랜잭션 매니저를 이용한 트랜잭션 제어트랜잭션 매니저를 사용해 테스트 데이터를 조작하는 등의 작업을 수행할 수 있다. public class UserServiceTest {
...
@Test
public void transactionSync(){
DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
TransactionStatus txStatus = transactionManager.getTransaction(txDefinition);
userService.deleteAll();
userService.add(users.get(0));
userService.add(users.get(1));
transactionManager.commit(txStatus);
}
} 실행되는 트랜잭션은 3개
트랜잭션 동기화 검증스프링 트랜잭션 추상화가 제공하는 트랜잭션 동기화 기술과 트랜잭션 전파 속성 덕에 테스트도 트랜잭션으로 묶을 수 있다. public class UserServiceTest {
...
@Test
public void transactionSync(){
userDao.deleteAll(); // 초기화
assertThat(userDao.getCount(), is(0));
DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
TransactionStatus txStatus = transactionManager.getTransaction(txDefinition);
userService.add(users.get(0));
userService.add(users.get(1));
assertThat(userDao.getCount(), is(2));
transactionManager.rollback(txStatus);
assertThat(userDao.getCount(), is(0));
}
} 롤백이 잘 되는 지 테스트 할 수 있다.
롤백 테스트테스트가 끝나면 롤백 하는 테스트
public class UserServiceTest {
...
@Test
public void transactionSync() {
DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
TransactionStatus txStatus = transactionManager.getTransaction(txDefinition);
try {
userService.deleteAll();
userService.add(users.get(0));
userService.add(users.get(1));
} finally {
transactionManager.rollback(txStatus);
}
}
}
테스트에서 사용하는 트랜잭션 어노테이션스프링은 어노테이션을 통해 테스트를 편리하게 만들 수 있는 여러 기능을 제공한다. ** @transactional **
@TransactionConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext.xml")
@Transactional
@TransactionConfiguration(defaultRollback = false)
public class UserServiceTest {
@Test
@Rollback //롤백
public void add(){}
} 6.8.10 @NotTransactional과 Propagation.NEVER
@Transactional(propagation = Propagation.NEVER)
|
The text was updated successfully, but these errors were encountered: