[ Item 76 ] 가능한 한 실패 원자적으로 만들라

둥그냥·2022년 6월 19일
0

Effective Java 독서

목록 보기
13/15

📚 [ Item 76 ] 가능한 한 실패 원자적으로 만들라

  • 호출 된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다.
  • 이러한 특성을 실패 원자적 이라고 한다.

메서드를 실패 원자적으로 만드는 방법

  1. 불변 객체로 설계한다.
  • 불변 객체는 태생적으로 실패 원자적이다.
  • 메서드가 실패하면 새로운 객체가 만들어 지지 않을 수 있으나 기존 객체가 불안정한 상태에 빠지는 일은 결코 없다. 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문이다.
  1. 가변 객체의 메서드를 실패 원자적으로 만드는 가장 흔한 방법은 작업 수행에 앞서 매개변수의 유효성을 검사하는 것

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

    이렇게 하지 않으면 size의 값이 음수가 되어 다음번 호출도 실패하게 만든다

  2. 객체의 임시 복사본에서 작업을 수행한 다음, 작업이 성공적으로 완료되면 원래 객체와 교환하는 것이다.

    • 예를 들어 어떤 정렬 메서드에서는 정렬을 수행하기 전에 입력 리스트의 원소들을 배열로 옮겨 담는다.
  3. 작업 도중 발생하는 싪채를 가로채는 복구 코드를 작성하여 작업 전 상태로 되돌리는 방법

    • 주로 (디스크 기반의)내구성을 보장해야 하는 자료구조에 쓰임
    • 자주 쓰이는 방법은 아니다.

💡 실패 원자성 규칙

  • 실패 원자성은 일반적으로 권장되는 항목이지만 항상 달성할 수 있는 것은 아니다.
  • 실패 원자성으로 만들 수 있더라도 항상 그리 해야 하는 것도 아니다. 실패 원자성을 달성하기 위한 비용이나 복잡도가 아주 큰 연산도 있기 때문이다.
  • 메서드 명세에 기술한 예외라면 설혹 예외가 발생하더라도 객체의 상태는 메서드 호출 전과 똑같이 유지돼야 한다는 것이 기본 규칙이다.
    • 이 규칙을 지키지 못한다면 실패 시의 객체 상태를 API 설명에 명시해야 한다.

0개의 댓글