[Effective Java] 64. 실패 원자성 달성을 위해 노력하라.

1 분 소요

일반적으로 메서드 호출이 정상적으로 처리되지 못하고 예외가 발생한 경우 객체의 상태는 메서드 호출 이전과 동일해야 한다.
이를 만족할때 실패원자성(failure atomicity)을 갖췄다고 한다.

1. failure atomicity를 달성 방법

1.1. Immutable 객체로 설계한다.

변경 불가능한 객체의 경우 실패 원자성은 당연히 따라오는 결과이다.

규칙 15 참고

1.2. 인자 유효성을 먼저 검사한다.

변경 가능한 객체인 경우 실제 연산을 수행하기 전에 인자 유효성을 먼저 검사하도록 할 수 있다. 즉, 연산 도중에 객체의 상태가 변경되는 것을 방지하는 것이다.

예를 들어 아래 코드는 size 변수 유효성을 앞에서 점검하기 때문에 --size에 의한 객체 상태 변화를 사전에 방지한다.

public Object pop() {
	if(size == 0) {
		throw new EmptyStackException();
	}	
	Object result = elements[--size];
	elements[size] = null;
	return result;
}

규칙 38 참고

1.3. 복구 코드를 작성한다.

사용 빈도가 훨씬 낮은 방법이다. 예외가 발생했을때 이전 객체 상태로 되돌리는 복구코드를 만드는 방법이다.

1.4. 임시 객체로 연산한다.

객체의 임시 복사본을 만들어 연산을 수행하고 연산이 정상적으로 마치면 복사본 객체의 내용으로 원본 객체 상태를 변경한다.

2. failure atomicity 달성할 수 없는 경우

일반적으로 권장되지만 항상 만족할 수 있는 것은 아니다.

예를 들어 객체가 여러 Tread에 의해 동시에 변경되었을때 발생할 수 있는 ConcurrentModificationException의 경우 일단 발생하면 객체 상태는 이미 깨졌다고 보는 것이 좋다.

그리고, Exception과 달리 Error는 복구가 불가능하기에 굳이 실패 원자성을 달성하려고 할 필요가 없다.

댓글남기기