본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 실패 원자성을 갖도록 노력하자

by 돼지왕 왕돼지 2017. 3. 3.
반응형

 [Effective Java] 실패 원자성을 갖도록 노력하자


API, api 문서, Atomic, Effective JAVA, failure atomic, recovery code, [Effective Java] 실패 원자성을 갖도록 노력하자, 가변 객체, 객체 상태, 노력, 대조, 데이터, 동기화, 디스크, 매개 변수 유효성 검사, 메소드, 메소드 호출 전, 복구 코드, 복잡도, 불변, 불변 객체, 비용, 성취, 시도, 실패, 실패 원자성, 실패 원자성 메소드, 실패할 수 있는 코드 부분 실행 순서, 에러, 연산 수행 전, 연산 순서 조정, 영속성, 예외, 원자성, 적합한 동기화


-
일반적으로 호출된 메소드가 실행에 실패하더라도 객체 상태는 메소드 호출 전과 같아야 한다.
이런 특성을 갖는 메소드를 실패 원자성(failure atomic) 메소드라 한다.


-
가장 간단한 방법은 불변 객체로 설계하는 것이다.
객체가 불변이면 실패 원자성과는 아예 무관하다.


-
가변 객체를 처리하는 메소드의 경우에 실패 원자성을 성취하는 가장 보편적인 방법은
연산 수행 전에 매개 변수의 유효성을 검사하는 것이다.


-
실패 원자성을 성취하는 더 좋은 방법은, 객체를 변경하는 코드 부분에 앞서 실패할 수 있는 코드 부분이 실행되도록 연산 순서를 조정하는 것이다.


-
또 다른 방법은 ( 흔하지 않지만 ) 연산 도중에 발생하는 실패를 가로채는 복구 코드(recovery code)를 작성하는 것이다.
이 방법은 주로 영속성을 갖는 데이터 구조에 사용한다. ( 디스크 )


-
일반적으로 실패 원자성은 바람직한 것이지만,
항상 성취할 수 있는 것은 아니다.
적합한 동기화를 하지 않고 두 스레드가 동일한 객체를 동시적으로 변경하려 하면, 그 객체는 일관성 없는 상태로 남아 있을 수 있다.
예외와는 대조적으로 에러는 대체로 복구 불가능하다.
따라서 에러가 발생했을 때는 메소드에서 실패 원자성을 유지하기 위한 시도 조차도 할 필요 없다.


-
실패 원자성의 성취나 유지가 가능하다고 해서 항상 바람직한 건 아니다.
일부 연산의 경우 비용이나 복잡도를 현저하게 증가시킬 수 있기 때문이다.


-
메소드 명세의 일부분인 예외가 발생하더라도, 객체를 메소드 호출 이전과 같은 상태로 두어야 한다.
만일 이런 규칙이 깨진다면, 어떤 상태가 그대로 있는지 API 문서에 분명하게 나타내야 한다.





반응형

댓글