TIL] 토비의 스프링 스터디 -3 트랜잭션

BRINCE·2022년 11월 18일
3

스프링 스터디

목록 보기
10/10

에러 발생 환경

여러가지 작업을 한번에 처리하는 작업을 수행 중에 네트워크가 끊기거나 서버에 장애가 생겨서 작업이 완료되지 않는다면, 끊기기 직전까지 변경된 정보들은 어떻게 해야할까요?

에 대한 답변으로 그때까지 진행된 변경 작업을 모두 취소시키는게 현명하다.
-> 데이터가 일부만 변경됨으로써 발생하는 사용자들의 불만을 최소한으로 하기 위해 롤백을 하는것이다.

테스트 케이스

서비스중인 사이트/프로그램 에서 한번에 사용자의 등급을 업그레이드 시켜주는 코드를 작성한다고 치자.

테스트를 하기 위해서는 기존에 동작중이던 서버를 다운시키는것은 멍청한 행동이기 때문에 테스트 클래스를 생성해 해당 문제 상황을 의도적으로 만들어 테스트한다.

테스트 코드 작성

기존에 사용하던 클래스의 대역을 사용한다.

static class TestUserService extends UserService{
private String id;

private TestUserService(String id) {
	this.id = id; }
    
protected void upgradLevel(User user){
	 if(user.getId().equals(this.id)) throw new Exception(); //예제
     super.upgradeLevel(user);
     }
}

틀이되는 테스트 클래스를 기존의 서비스 클래스를 상속받아 메소드를 오버라이딩 한다.

@Test public void upgradeAllOrNothing() {
UserService testUserService = new TestUserService(users.get(3).getId()); //테스트용 오브젝트
testUserService.setUserDao(this.userDao); //Dao 수동 의존성주입
		userDao.deleteAll();
	for(User user : users) userDao.add(user);
    	try {
        testUserService.upgradeLevels();  	
    	fail("TestUserServiceException expected");
        }					
    	catch(Exception e){
        }					
    	checkLevelUpgraded(users.get(1), false);}

-> UserDao 를 주입해주고 나면 testUserService 는 따로 빈을 정의해줄 필요 없이 UserDao 를 사용해 Data Access 기능을 사용할 수 있다. // 스프링 DI 스타일의 장점이기도 하다.

해당 메소드를 실행하면

java.lang.AssertionError: Expected: is <BASIC>	got: <SILVER>

해당 메시지를 출력하며 테스트가 실패한다.

두번째 사용자의 레벨이 바뀌고 예외가 발생하여 나머지 사용자의 레벨은 바뀌지 않았지만, 그대로 유지가 되고있는 모습이다.

테스트 실패의 원인

해당 코드는 모든 흐름을 하나의 작업으로 치지 않고, 흐름상 존재하는 모든 작업 하나하나가 모여 메소드가 완성되는 구조이다.

트랜잭션이란 더 이상 나눌 수 없는 단위작업을 말한다.

작업을 쪼개서 작은 다위로 만들 수 없다는 것은 트랜잭션의 핵심 속성인 원자성을 의미한다.

따라서 중간에 예외가 발생해서 작업을 완료할 수 없다면, 아예 작업이 시작되지 않은 것처럼 초기 상태로 돌려놔야 하고. 이것이 바로 진정한 트랜잭션이다.

profile
자스코드훔쳐보는변태

0개의 댓글