우리나라가 인구의 1/4이 서울에 있고, 경기도의 수도권까지 치면 무려 절반이 바둥바둥 몰려 있다고 그런다. 그래서 서울만 지나치게 팽창함으로써 야기되는 각종 사회적 문제가 심각한 수준이며, 이는 이제 어제오늘 일이 아니다.
이와 비슷한 맥락으로, <날개셋> 한글 입력기도 6만여 줄이 좀 넘는 소스 코드의 절반 가까이를 커널인 Ngs3.dll이 차지한다.
그도 그럴 것이 커널에는 문자와 문자열을 처리하는 기초 루틴부터 시작해서 모든 프런트 엔드들이 공유하는 한글 입력 오토마타가 들어있고, 방대한 제어판 GUI를 담당하는 코드도 있다. 수식과 XML parser 역시 거기에 있다. 그러니 덩치가 월등히 크지 않을 수가 없다. 앞으로 한글 입력과 관련된 기능이 또 추가된다면 커널은 더욱 커질 것이다.
그럼에도 불구하고 본인은 Ngs3.dll만이 지나치게 팽창하는 걸 방지하고, <날개셋> 한글 입력기의 코드가 소프트웨어 공학적으로 최대한 바람직하고 보기 좋게(?) 분포하게 하려 노력하고 있다.
그 일환으로 가장 먼저 도입한 개념은 바로 플러그 인이다. <날개셋> 한글 입력기가 제공하는 동일한 성격의 여러 액세서리 기능들을 이미 플러그 인이 분담해 오고 있다.
가령, 20여 종류에 달하는 텍스트 필터들과, <날개셋> 한글 입력기를 처음 접한 사용자가 유용하게 사용하는 빠른설정들은 모두 NgsX.nip라는 플러그 인이 제공하고 있다. <날개셋> 커널은 텍스트 필터와 빠른설정의 프로토콜만을 제시하고, 그 프로토콜대로 구현된 추가 기능들은 플러그 인으로부터 얻어 오는 것이다.
더 나아가, 한글뿐만이 아니라 임의의 상태와 임의의 조합 문자· 변환 후보를 지원하는 ‘<날개셋> 고급 입력기’라든가 ‘동시 입력 스키마’ 역시 플러그 인 담당이다. 커널이 직통으로 제공하는 기능이 아니다. Ngs3.dll의 과포화를 방지함과 동시에, 기반 클래스로부터 이런 확장까지 가능하다는 것을 시연할 목적으로, 이 확장 입력 기능들은 의도적으로 플러그 인으로 구현되었다.
‘부수로 한자 입력’, ‘한손 입력기’ 같은 보조 입력 도구들은 PadUI.nip라는 제2의 플러그 인을 통해 제공되고 있다. <날개셋> 편집기가 아니라 외부 모듈에서 제어판을 호출해 보면 시스템 계층에 ‘한글 표현 방식’ 탭이 있는데, 이 탭도 저 플러그 인이 제공하는 기능이다. 외부 모듈뿐만이 아니라 입력 패드(NgsPad.exe)에서 호출한 제어판도 동일한 탭 UI를 공유하고 있다.
플러그 인은 자신만의 제어판 탭을 갖출 수도 있으며, ‘시스템 계층’은 그런 확장을 하라고 존재하는 계층인 것이다.
이뿐만이 아니다.
제어판의 ‘시스템 계층’에 가면 글꼴 본뜨기를 다시 하는 명령을 찾을 수 있는데, 이때 글꼴 본뜨기를 <날개셋> 편집기 프로그램을 특수한 옵션을 주어 실행하는 형태로 구현된다. 본뜨는 코드는 Ngs3.dll에 있는 게 아니라 NgsEdit.exe의 내부에 있다. 딱히 컴포넌트화할 필요도 없이 <날개셋> 프로그램이 내부적으로만 잠깐 쓰는 보조 기능이니까 말이다.
이런 추세에 따라, 최근에 본인은 이런 리팩터링 작업을 했다.
<날개셋> 한글 입력기 제어판의 글쇠배열 편집기는 글쇠배열과 관련된 굉장히 다양한 종류의 파일을 열 수 있다.
자체 포맷은 말할 것도 없고, 윈도우 운영체제의 키보드 드라이버(NT 계열과 9x 계열 모두)와 아래아한글의 역대 글쇠배열 파일을 모두 지원한다. 그래서 <날개셋> 한글 입력기는 한글 입력 자체도 강력한 기능을 제공하지만, 여타 외국어 글자판과 한글 글자판을 손쉽게 병행해서 쓸 수 있다는 점에서도 매우 유용하고 편리하다.
지금까지는 해당 포맷들의 변환 코드가 모두 Ngs3.dll에 있었다.
그러나 그러던 것을 NgsConv.exe로 옮겼다. 그런 파일 포맷을 불러올 때는 잠시 <날개셋> 변환기를 호출한 후, 그 결과를 가져오게 바꿨다는 뜻이다. 이동한 코드의 양은 대략 8~900줄 정도.
이건 컴퓨터의 입장에서 성능이 향상된 변화라고 볼 수는 없다.
서로 다른 프로세스끼리 데이터를 주고받기 위해 오버헤드가 예전보다 훨씬 더 커지고, 사실 Ngs3.dll의 크기가 감소한 것보다 NgsConv.exe의 크기는 더 증가했기 때문이다(당연한 말이지만).
그러나 외부 파일 변환이 수천· 수만 번 반복되어야 하는 프로세스는 아니고 자주 쓰이는 기능도 아니며, 창의적인 기능이라기보다는 호환성 유지에 가까운 기능인 만큼, NgsConv로 기능이 이동한 것은 바람직한 조치임이 틀림없다.
<날개셋> 변환기는 지난 5.0 버전에서 첫 도입된 후로 그 중요성이 야금야금 커져 왔다.
초창기에는 진짜 기본적인 한글 코드 변환과, <날개셋> 3~4.x 데이터 파일을 변환하는 기능밖에 없었다가 한컴 2바이트 코드 변환 기능이 커널에서 이곳으로 완전히 이동했으며, 이번에 또 대규모 기능 이동이 이뤄졌다. 한글 입력기가 한글 입력과 관련된 데이터나 한글 코드를 변환하는 유틸리티를 제공하는 것은 completeness 차원에서 매우 의미 있는 일이며, 이번 리팩터링은 프로그램의 디자인 관점에서도 바람직한 개편임이 틀림없다.
Posted by 사무엘