Effective Java 76. 가능한 한 실패 원자적으로 만들라

Jung Ho Seo·2020년 9월 1일
0

EffectiveJava

목록 보기
32/35
post-thumbnail

가능한 한 실패 원자적으로 만들라

실패 원자적(failure-atomic)

작업 도중 예외가 발생해도 그 객체는 여전히 정상적으로 사용할 수 있다면 멋지지 않을까? 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 이러한 특성을 실패 원자적 이라고 한다.

메서드를 실패 원자적으로 만들기

가장 간단한 방법은 불변 객체로 설계하는 것이다. 불변 객체는 실패 원자적이다. 메서드가 실패하면 새로운 객체가 만들어지지 않을 수는 있으나, 기존 객체가 불안정한 상태에 빠지는 일은 결코 없다.

가변 객체는 어떻게 하면 좋을까? 가장 흔한 방법은 작업 수행에 앞서 매개변수의 유효성을 검사하는 것이다. 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성을 걸러낼 수 있는 방법이다.

예시

public Object pop() {
	if (size == 0)
		throw new EmptyStackException();
	Object result = elements[--size];
	elements[size] = null; // 다 쓴 참조 해제
	return result;
}

이 메서드는 처음의 if문에서 size의 값을 확인하여 0이면 바로 예외를 던진다.

또 다른 방법은 객체의 임시 복사본에서 작업을 수행한 다음, 작업이 성공적으로 완료되면 원래 객체와 교체하는 것이다. 예를 들어 어떤 정렬 메서드에서는 정렬을 수행하기 전에 입력 리스트의 원소들을 배열로 옮겨 담는다. 이렇게 하면 만약 정렬에 실패하는 일이 생기더라도 입력 리스트는 변하지 않는다.

마지막으로는 실패를 가로채는 복구코드를 작성하여 작업 전 상태로 되돌리는 방법이 있다. 주로 내구성을 보장해야 하는 자료구조에 쓰인다.

profile
책, 글, 개발

0개의 댓글