Posts Tagged ‘Memento’

How to persist state of IViewPart

Thursday, January 3rd, 2008

개요

Eclipse는 워크벤치 어드바이저에 다음과 같은 코드를 추가함으로써, 간단하게 레이아웃 및 윈도우 설정을 퍼시스트 할 수 있다:

configurer.setSaveAndRestore(true);

이거야 뭐 대부분의 이클립스 입문서에서 다루는 이야기라 아는 이야기지만 진취적인 개발자라면 여기서 의문이 생겨나야 한다. 레이아웃은 페이지와 페이지에 담긴 뷰와 에디터들의 배치를 담당하고 있다.이 정보가 보존된다면, 이클립스를 다시 시작할때 마다 어떤 뷰와 에디터들을 보여줘야할지 결정할 수 있을 것이다. 하지만 뷰와 에디터들의 상태는 어떻게 되는가? 뷰나 에디터에는 개발자가 직접 추가한 필드나 하위 컨트롤들이 있을 것이다. 이들의 상태는 어떻게 되는가?

결론 부터 말하자면 모조리 날아가버린다. 뷰와 에디터의 배치는 복구되지만 뷰와 에디터의 상태는 복구되지 않는다. 보존한 적도 없고, 보존하는 코드를 작성한 적도 없으니 당연한 결과이다. 앞으로 뷰를 기준으로 설명해 나가겠다.

어디에 뷰의 상태를 보존하는 코드를 삽입해야 하는가?

이클립스 플랫폼은 IViewPart에 제공하는 다음 두 메소드로 상태의 보존과 복구를 제공한다:

  • public void saveState(IMemento)
    현재 뷰의 상태를 메멘토에 보존한다.
  • public void init(IViewSite, IMemento) throws PartInitException
    현재 뷰의 상태를 메멘토로 부터 복구한다.이 메소드는 createPartControls() 보다 먼저 호출된다는 점을 주의해야 한다.

따라서 이 두 메서드를 오버라이드 하는 것만으로도 당신의 뷰는 자동적으로 상태를 기억하고 보존할 수 있게 된다.

메멘토가 뭔가?

단기 기억 상실증을 다룬 영화를 떠올리고 계신 분들이 많으시리라 예상 되는 대목이다. 메멘토는 직역 하면, 기억, 추억 또는 유물등으로 해석할 수 있다. 거참 멋진 용어를 선택하셨구랴 IBM양반들♥

메멘토는 데이터를 보존하기 위한 공간이긴 하지만, 하이버네이트나 iBATIS 처럼 주 컨텐츠로서 데이터를 보존하는 공간이 아니라, 온갖 잡스러운 “기억꺼리”를 보존하는 도구이다. 예를 들면, 사용자가 선택해둔 사항이나, 열려있는 뷰나, 뷰의 소팅 옵션이나 필터 설정들과 같은 잡다한 정보들 말이다.

메멘토는 이클립스 워크벤치에 의해 관리되며 필요한 곳에 준비된 형태로 공급된다. 따라서 개발자는 메멘토가 어디에 보존되는지, 메멘토 도구를 어떻게 얻어올 것인지를 신경 쓸 필요가 없다. 메멘토는 자동으로 관리되는 문맥을 가지고 있기 때문에, 사용할때, 다른 곳에서 같은 이름으로 데이터를 보존했는가 여부를 고민할 필요도 없다. 사용법은 해쉬맵과 거의 동일하다. 주로 사용되는 메서드는 다음과 같다:

  • public void putString(String key, String value);
    특정 키에 String 값을 넣는다.
  • public String getString(String key);
    특정 키의 값을 스트링으로 얻어온다. (Float과 Integer도 마찬가지 형태로 get/put이 제공된다.)
  • createChild(String)
    하위 문맥을 확장한다.
  • getChild(String)
    하위 문맥을 얻어온다.

메멘토는 워크밴치가 종료될때 알아서 XML형태로 보존된다. 워크스페이스 경로 / .metadata / .plugins / org.eclipse.ui.workbench 에 들어가보면 workbench.xml 파일이 있는 데, 이 파일을 보면 메멘토가 어떻게 보존되는지 쉽게 확인 할 수 있다. 메멘토는 원래 잡다한 것을 저장하는 도구이고, XML로 보존되기 때문에 객체나 복잡한 데이터를 저장하는 데에는 적합하지는 않다.