. 설정 저장의 주체

설정은 사람마다 다른 취향을 반영하기 위한 수단이다. 사람에 따라 좋아하는 색상이나 글꼴 모양, 동작방식이 모두 다르다. 시력이 안 좋아서 큰 글꼴에 고대비 색상을 원하는 사람도 있고 한 화면에 많은 내용을 보고 싶어하는 사람도 있다. 그래서 ApiEdit는 설정을 변경할 수 있는 API를 제공하고 호스트는 이 API를 호출할 수 있는 UI를 제공했다.

사용자들은 자기가 쓰기 편하게 설정을 마음대로 바꿀 수 있는데 이 작업은 다소 많은 테스트를 필요로 한다. 색상도 조합해보고 글꼴도 이것저것 바꿔 봐야 마음에 드는 모양을 찾을 수 있으며 동작방식은 옵션을 바꿔 가며 직접 사용해 봐야 자기에게 가장 적합한 값을 찾을 수 있다. 제공하는 옵션이 많으면 많을수록 시간이 더 많이 걸릴 것이다. 자기에게 꼭 맞는 설정을 찾는 것이 이렇게 쉬운 일이 아니기 때문에 한 번 선택해놓은 설정을 저장할 필요가 있다. 마음에 꼭 드는 설정상태를 어렵게 찾았는데 다시 실행하면 원래대로 되돌아 가서는 곤란하다.

설정을 변경하는 기능을 컨트롤이 제공하지 않듯이 설정을 저장하는 기능도 컨트롤의 몫이 아니다. 설정상태를 저장하고 다시 복구하는 일은 호스트 프로그램의 책임이자 또한 권리이기도 하다. 호스트는 저장할 필요가 있는 설정만 선별적으로 저장할 수 있으며 프로그램의 정책상 어울리지 않는 설정은 저장하지 않을 수도 있다. 예를 들어 줄번호 넣기 기능은 잘 사용되지도 않고 화면출력이 깔끔하지 않으므로 디폴트값은 FALSE로 두고 사용자가 원할 때 잠시만 바꿀 수 있도록 하는 정책을 쓰고 싶다면 그렇게 할 수도 있다.

ApiEditSetDefaultSetting에 작성되어 있는 초기화 코드는 어디까지나 디폴트 설정에 불과하다. 호스트가 컨트롤을 생성할 때 아무런 설정 변경도 하지 않을 때 그때 적용되는 설정상태가 바로 SetDefaultSetting에 있는 컨트롤 디폴트 설정이다. 이 디폴트 외에 호스트가 제공하는 디폴트는 따로 존재할 수도 있다. 호스트는 컨트롤을 생성할 때 목적에 맞게 컨트롤의 설정을 적절하게 변경한 후 사용하는데 이 설정은 사용자에게 직접 보여지는 호스트 디폴트 설정이다.

예를 들어 ApiEdit는 탭 크기에 대해 4라는 디폴트 설정을 제공하고 있는데 호스트는 이 디폴트를 무시하고 컨트롤을 생성할 때마다 SetTabWidth 함수를 호출하여 디폴트를 8로 바꿀 수도 있는 것이다. 이 프로그램의 사용자는 자기가 직접 바꾸지 않는 한 8이라는 탭 크기를 사용하게 될 것이다. 요약하자면 컨트롤의 디폴트와 호스트의 디폴트는 다르다.

ApiEditSetDefaultSetting에 있는 디폴트값은 호스트가 설정을 전혀 변경하지 않을 때 적용되는 값이다. 당근은 자신의 디폴트를 가지고 있기 때문에 ApiEdit의 디폴트 설정은 현재 무시되고 있는 셈이다. 이 설정은 충분히 무난하게 설정되어 있어야 하며 ApiEdit의 컨트롤 디폴트는 그렇게 선택되어 있다. 설정 저장 기능을 작성하기 위해 Dangeun3를 복사하여 Dangeun4 프로젝트를 새로 만들고 실습을 진행하도록 하자.