brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Sep 10. 2018

예외(Exceptions)

#64 실패 원자성을 갖도록 노력하자

Effective Java - 예외(Exception)


#64 실패 원자성을 갖도록 노력하자


실패 원자성(failure atomic)이란, 호출된 메서드가 실패하더라도 객체 상태는 메서드 호출 전과 같아야 하는 특성을 말합니다.


실패 원자성을 갖기 위한 몇 가지 방법에 대해 알아보겠습니다.




#01 불변 객체로 설계


불변 객체는 실패 원자성과 아무런 관련이 없습니다.

실행이 실패해도 기존 객체의 상태가 바뀌지 않기 때문입니다.




#02 연산 수행 전에 매개 변수의 유효성 검사


객체의 상태가 변경되기 전에 미리 유효성을 검사해 예외를 던질 수 있습니다.


#01 연산 수행 전에 매개 변수 유효성 검사


만약 유효성을 검사하는 코드 없이, 빈 Object[] 배열에서 요소 하나를 꺼내려고 한다면 예외가 발행한 후에 size의 값이 1 감소된 상태가 될 것입니다.

즉, 실패 원자성을 가지지 못한 채, 다음 호출에서도 계속 실패하게 됩니다.




#03 연산 순서 조정


객체를 변경하는 코드 부분에 앞서 실패할 수 있는 코드 부분이 먼저 실행되도록 연산 순서를 조정합니다.


#02 연산 순서 조정


TreeMap에 요소를 추가하려면, 요소 타입이 Integer 타입이어야 합니다.

만약 String 같은 다른 타입을 추가하려면 ClassCastException 예외가 발생합니다.

따라서 요소를 추가하기 전에 적합한 타입인지 먼저 검사를 하도록 순서를 조정하면 됩니다.



#04 복구 코드(recovery code) 작성


흔하지 않지만 연산 도중에 발생하는 실패를 가로채는 복구 코드를 작성합니다.

주로 영속성(디스크 기반의)을 갖는 데이터 구조에 사용됩니다.




#05 임시 복사본 이용


임시 복사본을 만들어 연산을 수행하고, 연산이 끝나면 객체의 내용을 임시 복사본 내용으로 변경합니다.


#03 임시 복사본 이용




실패 원자성은 바람직 하지만, 항상 적용할 순 없습니다.

에러(Error)는 대체로 복구 불가능하기 때문에 실패 원자성 유지 불필요

멀티 스레드 환경에서 동기화 문제가 발생할 수 있음


만약 실패 원자성을 유지할 수 없는 상황이라면 API 문서에 이에 대해 분명하게 작성해 두어야 합니다.

매거진의 이전글 예외(Exceptions)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari