[Effective Java] 실패 원자성을 갖도록 노력하자 |
-
일반적으로 호출된 메소드가 실행에 실패하더라도 객체 상태는 메소드 호출 전과 같아야 한다.
이런 특성을 갖는 메소드를 실패 원자성(failure atomic) 메소드라 한다.
-
가장 간단한 방법은 불변 객체로 설계하는 것이다.
객체가 불변이면 실패 원자성과는 아예 무관하다.
-
가변 객체를 처리하는 메소드의 경우에 실패 원자성을 성취하는 가장 보편적인 방법은
연산 수행 전에 매개 변수의 유효성을 검사하는 것이다.
-
실패 원자성을 성취하는 더 좋은 방법은, 객체를 변경하는 코드 부분에 앞서 실패할 수 있는 코드 부분이 실행되도록 연산 순서를 조정하는 것이다.
-
또 다른 방법은 ( 흔하지 않지만 ) 연산 도중에 발생하는 실패를 가로채는 복구 코드(recovery code)를 작성하는 것이다.
이 방법은 주로 영속성을 갖는 데이터 구조에 사용한다. ( 디스크 )
-
일반적으로 실패 원자성은 바람직한 것이지만,
항상 성취할 수 있는 것은 아니다.
적합한 동기화를 하지 않고 두 스레드가 동일한 객체를 동시적으로 변경하려 하면, 그 객체는 일관성 없는 상태로 남아 있을 수 있다.
예외와는 대조적으로 에러는 대체로 복구 불가능하다.
따라서 에러가 발생했을 때는 메소드에서 실패 원자성을 유지하기 위한 시도 조차도 할 필요 없다.
-
실패 원자성의 성취나 유지가 가능하다고 해서 항상 바람직한 건 아니다.
일부 연산의 경우 비용이나 복잡도를 현저하게 증가시킬 수 있기 때문이다.
-
메소드 명세의 일부분인 예외가 발생하더라도, 객체를 메소드 호출 이전과 같은 상태로 두어야 한다.
만일 이런 규칙이 깨진다면, 어떤 상태가 그대로 있는지 API 문서에 분명하게 나타내야 한다.
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Effective Java] 공유하는 가변 데이터에 접근 시 동기화하자. (0) | 2017.03.07 |
---|---|
[Effective Java] 예외를 묵살하지 말자. (0) | 2017.03.06 |
[Effective Java] 실패 상황 정보를 상세 메세지에 포함하자. (0) | 2017.03.02 |
[Effective Java] 메소드가 던지는 모든 예외를 문서화하자. (0) | 2017.02.28 |
[Effective Java] 하위 계층의 예외 처리를 신중하게 하자. (0) | 2017.02.27 |
댓글