destroyApp()는 당신의 친구
Vikram Goyal
이 팁은 RecordStore 작업의 스레드 안전에 관해 썬 포럼에서 이루어진 최근의 토론에 대한 답변입니다. 이번 토론은 여러 가지 다른 방향으로 진행되었지만, 그 핵심이 되는 문제는 바로 타사 라이브러리가 안전하지 못하게 작동할 때 스스로를 어떻게 보호할 것인가 하는 것이었습니다.
그에 대한 해답이 간단하지는 않지만, 이 테크팁에서는 이번 토론이 시작될 때 제기되었던 구체적인 예제에 답해보도록 하겠습니다. 아마 그렇게 하는 것이 실제로 그런 문제를 다루기 위한 일반적인 지침을 제공하는 데 도움이 될 것입니다.
RecordStore의 안전
이 문제는 개별 레코드 항목의 안전 문제로 요약됩니다. 레코드 항목 메소드 자체는 원자성, recordStore.addRecord(), 성격을 지니므로 스레드로부터의 안전이 보장됩니다. 하지만, 포럼 토론에서도 지적된 바와 같이, 레코드 저장소에 기록 중인 두 개의 레코드에 관해 일관성을 평가하고 애플리케이션 관리 소프트웨어(AMS)가 두 개의 호출 사이에서 destroyApp()를 호출했기 때문에 하나만 입력되고 두 번째 항목은 중단된 경우 데이터를 관리할 방법이 없어졌습니까? 현재 데이터가 불일치합니까?
물론, 그렇지 않습니다.
타사 소프트웨어에서 destroyApp() 메소드를 호출하더라도, 바로 이 점에서 이 메소드에 대한 진짜 이유가 드러납니다.
다음 코드에서 필자는 이 시나리오를 일관되게 처리하는 destroyApp() 메소드를 제시합니다.
public void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
if(!unconditional) {
if(!recordsWritten) { // Records have not been written yet -- wait!
throw new MIDletStateChangeException();
} else { // Records written -- MIDlet can be destroyed!
}
} else { // must destroy
if(!recordsWritten) {
// Roll back the record that was written.
if(storage != null) { // Was the store ever opened?
try {
storage.deleteRecord(recordId1);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
destroyApp() 메소드는 MIDlet을 실제로 닫기 전에 마치지 않은 항목을 완료할 방법을 제공합니다. AMS가 MIDlet를 무조건 닫으려 할 수도 있으며, 이런 경우에는 MIDlet을 닫는 수 밖에 없습니다. 하지만, 무조건 닫지 않아도 되고 쓰기 작업 중인 경우에는 MIDletStateChangeException을 스로우(throw)하여 쓰기 작업을 마칠 수 있습니다.
모든 데이터가 기록되어 있는 경우(이 경우에는 두 개의 레코드 항목)에만 데이터가 일관된 것으로 간주되기 때문에, recordsWritten이라는 플래그로 이를 표시합니다. 그런 다음 이 플래그를 사용하여 데이터의 상태를 모니터합니다.
이 플래그가 false로 설정되어 있으면 쓰기 작업을 마치지 않은 것이므로, 기록된 데이터를 전부 롤백해야 합니다. 두 레코드 중 어느 하나의 쓰기가 완료되기 전에 destroyApp() 메소드가 호출될 가능성이 있습니다. 그 가능성은 충분하며, 첫 번째 레코드를 삭제하려고 하면 예외가 발생하고 이 예외는 자동으로 무시됩니다.
데이터 쓰기 및 삭제 작업은 그 자체가 원자성을 지니므로, 쓰기 작업 간에는 데이터가 손상되지 않는다는 점을 확신할 수 있습니다. 데이터 손상을 더욱 확실히 방지하기 위해, 쓰기 또는 삭제 작업 중에 스토리지 객체에 대해 동기화할 수 있습니다.
이 간단한 예를 통해 타사 라이브러리의 효과를 더욱 적절히 처리하는 방법을 간파할 수 있기를 바랍니다. 일관성과 데이터 안전은 복잡한 주제이므로, 개발자는 특정 솔루션 개발에 임하기 전에 해당 문제 영역을 상세히 파악해야 합니다.
자료
자바 튜토리얼의 동시성 트랙
자바 동시성의 실제
더 나은 코딩 방법: 썬마이크로시스템즈 기술 전문가 Brian Goetz와의 대화
게시일: 2009/9/11 02:41PM, 게시자: Christine Dorffi, 게시물: Mobility | Comments[0] | Permalink
"Java ME" 카테고리의 다른 글
- 블루투스와 GPS 사용: 1부 - 무선 직렬 포트 데이터 읽기 (댓글 0개 / 트랙백 0개) 2008/08/11
- 서비스 지향 아키텍처 및 자바 ME (댓글 7개 / 트랙백 0개) 2007/04/10
- destroyApp()는 당신의 친구 (댓글 0개 / 트랙백 0개) 2009/09/28
- 자바 ME 장치 매트릭스로 필터 사용 (댓글 0개 / 트랙백 0개) 2008/03/13
- Java ME를 사용한 블루레이 디스크 애플리케이션 개발 제 1 부: 나만의 애플리케... (댓글 0개 / 트랙백 0개) 2008/10/13
- 모바일 플랫폼의 비교: Java ME와 Adobe Flash Lite (댓글 0개 / 트랙백 1개) 2008/06/03
- NetBeans Mobility Pack 5.0 입문을 위한 속성 가이드 (댓글 5개 / 트랙백 0개) 2006/09/26
- 모바일 자바 플랫폼의 현재와 미래 (댓글 5개 / 트랙백 1개) 2006/07/26
- MIDlet의 로깅과 모니터링을 위한 간단한 전략 (댓글 0개 / 트랙백 0개) 2009/10/22
- 아프리카에서 전하는 소식: 이 지역에서 자바 ME 플랫폼에 주어진 과제와 기회 (댓글 0개 / 트랙백 0개) 2008/12/16
2009/09/28 15:17
2009/09/28 15:17
댓글을 달아 주세요