Skip to content

Latest commit

 

History

History
41 lines (25 loc) · 2.55 KB

File metadata and controls

41 lines (25 loc) · 2.55 KB

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

실패 원자적인 특성은 무엇일까? "호출된 메서드가 실패하더라도 해당 객체가 메서드 호출 전 상태를 유지하는 것"을 말한다. 즉, 예외가 발생하더라도 객체 상태가 메서드 호출 전과 똑같이 유지돼야 한다는 것이다.

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

1. 불변 객체로 설계한다.

  • 불변 객체는 태생적으로 실패 원자적이다.
  • 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문

2. 가변 객체일 경우, 매개변수의 유효성을 검사한다.

  • 작업 수행에 앞서 매개변수의 유효성을 검사할 수 있다.
  • 객체 내부 상태를 변경하기 전에, 잠재적 예외의 가능성 대부분을 걸러낼 수 있다.

3. 실패할 가능성이 있는 모든 코드를, 객체의 상태를 바꾸는 코드보다 앞에 배치한다.

  • 계산 이전에는 인수의 유효성을 검사할 수 없는 경우(즉, 2번을 바로 적용하기 어려운 경우), 2번 방식 이전에 사용할 수 있다.
  • ex. TreeMap 에서 기준에 따라 비교할 수 있는 타입인지 아닌지가 중요한데, 이상한 원소를 TreeMap 에 추가하려고 하면 ClassCastException을 던지며 TreeMap 내부 상태를 바꾸지 못하게 막는다.

4. 객체의 임시 복사본에서 작업을 수행한 다음, 작업이 성공적일 때만 원래 객체와 교체한다.

  • 방어적 복사를 수행하여 작업이 성공적인 경우에만 기존 객체와 교체한다.
  • ex. 어떤 정렬 메서드는 접근 속도를 높이기 위해 List 안의 원소들을 복사해서 배열로 옮겨담고, 나중에 다시 List 반환하기도 함
    • 혹시나 정렬에 실패하더라도 기존 리스트는 변하지 않는다.

5. 작업 도중 발생하는 실패를 가로채는 복구 코드를 작성한다.

  • 작업 도중에 실패가 발생하면 그 실패를 가로채서 복구 코드를 실행하게 만든다.
  • 즉, 복구 코드를 실행하여 작업 이전 상태로 되돌리는 방법이다.
  • 자주 쓰이는 방법은 아니다.

실패 원자성을 달성하고자할 때 주의사항

  • 여러 스레드가 동시 접근할 때, 적절한 동기화가 없다면 객체 일관성이 깨질 수 있다.(실패 원자성 달성 불가)
  • 실패 원자성을 항상 달성해야하는 것도 아니다.
    • 실패 원자성을 달성하기 위해 드는 비용이나 복잡도가 너무 크다면 오히려 손해