EMF
EMF 트랜잭션 관리
지이이이율
2009. 6. 8. 19:42
ChangeRecorder
ChangeRecorder는 org.eclipse.emf.ecore.change에 포함되어 있는 도구로, EObject를 상속받은 객체들의 변경을 추적할 수 있는 도구이다. 이를 사용하는 예제는 다음과 같다:// 임의의 ecore 모델을 하나 만든다. Person jiyul = MyFactory.eINSTANCE.createPerson(); jiyul.setName("Jiyul"); // 롤백 디스크립션 작성 시작 ChangeRecorder recorder = new ChangeRecorder(jiyul); // 모델을 변경 시킴 jiyul.setName("Sid Vicious"); // 녹화 종료 ChangeDescription rollbackDescription = recorder.endRecording(); // 녹화된 내용을 역으로 적용 rollbackDescription.apply(); System.out.println(jiyul.getName());위의 코드를 수행 하면, jiyul:Person의 name을 시드 비샤스로 지정하였지만, 화면에는 지율이 출력된다. ChangeRecorder가 jiyul:Person이 발생시키는 모든 Notification을 수집하여 역으로 수행할 수 있는 ChangeDescription을 만들어 주기 때문이다. ChangeDescription은 녹화 이외에도 다른 방법으로도 생성할 수 있다.
트랜잭션 처리
위의 예제를 좀 더 일반화된 트랜잭션 관리 코드로 나타내면 다음과 같은 모양이 된다:ChangeRecorder recorder = new ChangeRecorder(model); try{ 모델을 조작하는 코드들이 여기에 위치한다... }catch(Exception e){ // 모델을 다루는 작업 도중 문제가 발생한 경우 롤백 시킨다. recorder.endRecording().apply(); }
ChangeDescription
그런데 재미있는 점은 모델의 변경을 기술하는 객체인 ChangeDescription 역시, EObject를 상속받는다는 점이다. 이 말은 ChangeDescription 역시 EMF를 통해 제네레이트 된 코드라는 뜻이다. 다시 말해 ChangeDescription은 XML로 시리얼라이즈 될 수 있다. 이 사실은 도전적인 독자들에게, XML로 시리얼라이즈된 ChangeDescription을 이용하여, 네트워크 너머의 모델을 수정할 수 있다라는 멋진 아이디어에 들뜨게 할 것이다. ChangeDescription은 ChangeFactory 및 ChangePackage를 이용하여 직접만들거나, 리소스로 부터 읽거나 쓸수 있다. 여기서는 간단한 예제만을 다뤄 보이겠다:// 녹화 종료 ChangeDescription description = recorder.endRecording(); // 변경된 내용을 xml로 출력 ResourceSet rs = new ResourceSetImpl(); XMLResource resource = (XMLResource) rs.createResource(URI.createFileURI("test.xml")); resource.getContents().add(description); resource.save(System.out, new HashMap<Object, Object>());위의 코드를 수행하면 ChangeDescription의 내용이 시리얼라이즈 되는 것을 확인 할 수 있을 것이다.