|
|
초성-중성-종성 조합 처리
입력 시퀀스를 기반으로 글자 조합 상태 유지
상태 기계(FSM: Finite State Machine) 또는 if-else 방식 가능
libhangul을 쓰면 이 부분을 간편하게 해결 가능 (단, 자체 오토마타 설계 시 직접 구현 필요)
2. 입력기 프레임워크 이해
각 OS에서 제공하는 입력기 프레임워크를 이해해야 함
Windows: COM/TSF 구조
macOS: InputMethodKit
Linux: ibus/fcitx/scim
텍스트 입력 흐름 및 composition(조합 중 입력), commit(완성 입력) 개념 이해 필요
3. 시스템 연동
IME 등록 및 설치 방법 파악
Windows는 DLL 등록과 레지스트리 처리 필요 (구글 입력기 문서에서 참고 가능)
macOS는 앱 번들 설치 후 로그인/재부팅 필요
Linux는 ibus 등록 후 설정
4. UI 구성 (선택적)
입력기 UI는 OS별로 구현 난이도가 다름
Windows는 트레이 메뉴 등 TSF 기반 UI가 필요
macOS는 메뉴바 연동이 쉬운 편
설정 파일 기반 레이아웃 변경 방식도 가능 (나빌 입력기 방식)
💡 실전 지식 요약 (나빌 입력기 기준)
주제요약
| 프로그래밍 언어 | Windows: C++ / COM macOS: Swift, Objective-C |
| 빌드 툴 | Windows: Visual Studio (InstallShield 없이 등록 방법 필요) macOS: Xcode |
| 사용한 라이브러리 | libhangul (Windows에서 사용, Mac은 자체 오토마타) |
| 입력기 설치 | macOS는 install.sh, Windows는 레지스트리 등록 |
| 문제점 및 해결 | - 입력기 설치 후 재로그인 필요 - 일부 앱(파이어폭스 등)에서 composition 커서 이슈 - 완성 타이밍 문제 (preedit/commit 처리 필요) - IMKit, TSF 등의 문서 부족으로 샘플/레퍼런스 코드 의존 |
| 디버깅 방식 | 실험적으로 반복: 빌드 → 설치 → 재로그인 → 테스트 |
| 자판 지원 | 초기엔 3-18Na 자판만, 이후 세벌식 390과 두벌식 추가 |
| 지원하지 않는 기능 | 한자 입력, 모아치기 등은 libhangul에 따라 달라짐 |
🧠 학습 경로 제안 (프로그래밍 초심자 기준)
전체 OS 대상 IME를 만들고자 한다면 각 플랫폼마다 최소 3~6개월 이상의 학습 및 개발 기간이 소요됩니다. 프로그래밍 경험이 없다면 이보다 더 길 수 있습니다.
🗓️ 예상 학습 순서 (입문자 기준)
단계내용소요기간 (예상)
| 1단계 | C/C++ 기본 문법, Swift 기초, Git 사용법 | 1개월 |
| 2단계 | libhangul 구조 학습, 한글 조합 방식 이해 | 1개월 |
| 3단계 | 각 플랫폼 IME API 개념 및 샘플 분석 | 1~2개월 |
| 4단계 | Windows (TSF+COM) 입력기 구현 | 2개월 |
| 5단계 | macOS (IMKit) 입력기 구현 | 1~2개월 |
| 6단계 | Android/iOS 키보드 앱 개발 | 2~3개월 |
| 7단계 | UI 개선, 자판 전환, 세벌식/두벌식 추가 기능 | 수시 보완 |
🧭 시작 포인트 추천
GitHub 소스 분석
윈도우용 TSF IME
Microsoft의 샘플 입력기
중국어/일본어 오픈소스 IME 코드
macOS용 IMKit
Objective-C 또는 Swift로 개발 가능
추가로 도움이 될 수 있는 주제나 구현 난이도 비교, 구체적인 오토마타 설계 방법, 자판 정의 방식(libhangul용 자판 파일 등)도 필요하시면 이어서 도와드리겠습니다. 원하시는 방향이 있다면 알려주세요!
4o
나의 말:
도움이 될 수 있는 주제가 뭐 있는데?
ChatGPT의 말:
아주 좋은 질문이십니다. 나빌 입력기 후기를 바탕으로 IME 앱 개발을 더 잘 이해하고 구현하기 위해 도움이 될 수 있는 주제들을 다음과 같이 정리해드리겠습니다. 입문자~중급자까지 점프하는 데 정말 유용한 주제들이며, 필요에 따라 단계적으로 학습해도 좋습니다:
🧠 IME 개발에 도움이 되는 주요 주제들
1. 한글 오토마타 구조와 구현 방식
초성/중성/종성 조합 원리
유한 상태 기계(FSM)로 오토마타 구현
libhangul을 쓸지, 자체 구현할지 선택 기준
두벌식 vs 세벌식 처리 차이 (특히 종성/초성 분리 처리)
👉 관련 내용 요청하시면 오토마타 상태도나 실제 코드 예시도 드릴 수 있습니다.
2. 자판 정의 및 커스터마이징 방법
libhangul의 자판 정의 파일(.key 파일) 구조
자판 전환 로직 구현 (입력기 내에서 자판 바꾸기)
사용자 커스텀 자판 추가하는 방법
🛠 예: 3-18Na, 세벌식 최종, 두벌식, 옛한글 자판 등
3. Composition/Preedit 처리 방식
입력 중인 글자 상태(Preedit)와 완성된 글자(Commit)의 구분
IME와 응용 프로그램 사이의 데이터 전달 흐름
글자 완성 타이밍 조절: 다음 초성을 입력해야 직전 글자가 확정되는 문제
⚠ 이 부분은 앱마다 다르게 반응하여, 실전에서 반드시 고려해야 합니다.
4. macOS의 InputMethodKit 실전 사용법
Xcode 프로젝트 설정 방법
InputController 클래스와 이벤트 흐름
macOS에서 오토마타 연결 구조
📘 Swift / Obj-C 혼합 사용법도 포함 가능
5. Windows TSF 구조와 COM 개념 이해
TSF(Text Services Framework)의 동작 원리
COM(Component Object Model) 기본 구조
DLL 등록 방식, GUID 관리, 레지스트리 수정
TSF 앱 테스트 시나리오: 메모장, 워드패드, 웹 브라우저 등
🧩 실전에서 자주 발생하는 버그들(예: 조합 글자 깨짐, 커서 깜박임 등)에 대한 대응 전략도 포함
6. libhangul 직접 포팅 및 확장 방법
libhangul을 Windows/macOS에 빌드하는 방법
자판 추가, 기능 확장 (예: 모아치기, 옛한글 확장)
libhangul의 오토마타 내부 구조 이해
🔧 직접 고친 경험을 바탕으로 문서화된 예시를 드릴 수 있습니다.
7. 각 OS에서의 설치/배포 자동화
macOS: .app 패키지 + install.sh
Windows: DLL 등록 스크립트, 인스톨러 없이 수동 설치
Linux: ibus, fcitx 환경에서 입력기 등록 방법
앱스토어/패키지 배포 고려사항 (macOS App Store는 IME 배포 불가)
8. 문제 해결 사례 모음 ("삽질 방지 백서")
"입력기 설치했는데 안 뜨는" 문제: 재로그인 필요
조합 중 글자가 사라지는 문제
특정 앱에서 입력기 동작이 다르게 나타나는 문제 (예: 파이어폭스 vs 메모장)
💡 실전에서 발생했던 문제와 그 해결 과정을 공유해드릴 수 있습니다.
9. UI/UX 구성: 사용자 자판 선택, 설정 파일 연동
메뉴바/트레이에 자판 전환 기능 넣기
설정파일 기반 자판 설정 (Keyboard.dat)
키보드 스위치 토글, 단축키 구현 등
10. IME 성능 최적화
입력 지연 문제 (입력 랙, 조합 느림)
리소스 점유 최소화
앱별 입력기 대응 문제 (특정 앱에서만 버그 발생 등)
✋ 원하시는 주제 있으신가요?
이 중에서 현재 관심 있으신 부분을 골라주시면,
실제 코드 예시
학습용 자료
구현 전략
주의할 점
등을 정리해서 구체적으로 설명드리겠습니다!
특히 초성-중성-종성 오토마타나 Windows/macOS 프레임워크 구조는 한 번 확실히 이해해 두면 매우 큰 도움이 됩니다.
궁금한 주제를 알려주세요 😊
4o
나의 말:
구현 전략?
ChatGPT의 말:
좋습니다! “구현 전략”은 IME(입력기) 전체를 어떤 순서와 방식으로 만들고 확장해 나갈 것인지에 대한 설계 로드맵입니다. 나빌 입력기의 개발 후기를 바탕으로 한글 IME 앱의 구현 전략을 운영체제별과 기능 단위별로 정리해드리겠습니다.
🧭 전반적인 구현 전략 개요 🎯 목표:
“한글을 자모 단위로 조합해서 초성-중성-종성으로 문자를 구성할 수 있는 입력기를 만든다.”
✅ 1단계: 핵심 개념 정리 및 준비
항목설명
| 자모 분해 및 조합 원리 | 초성(ㄱ |
| 오토마타 구조 | 상태머신(FSM) 또는 입력 시퀀스 기반 조합 로직 |
| 자판 정의 | 3-18Na, 3-90, 2벌식 등 사용 자판 명세 |
| 사용 언어 | Windows: C++ & COM, macOS: Swift or Obj-C |
| 외부 라이브러리 | libhangul (사용 or 직접 구현 결정) |
📌 이때 목표 자판이 "세벌식"이라면 오토마타 구현이 단순해지고, 두벌식이라면 종성/초성 판별 로직이 복잡해짐
✅ 2단계: 플랫폼별 아키텍처 설계 🔹 macOS: InputMethodKit 기반
구성 요소설명
| InputController | IMKit의 핵심 클래스. 키 이벤트를 받아 처리 |
| handle(input:) | 키 이벤트를 수신하고 오토마타로 전달 |
| setMarkedText | 조합 중 글자 출력 |
| commitText | 조합 완료 글자 출력 |
| 자판 설정 | 설정 파일(Keyboard.dat 등)에서 읽도록 구성 |
전략 포인트
SwiftUI나 AppKit UI 없이 IMKit 중심으로 최소 기능 구성
재로그인 또는 재부팅 필요: 설치-재시작 루틴 구축
🔹 Windows: TSF (Text Services Framework) 기반
구성 요소설명
| DLL | 입력기는 COM 객체로 구현되어 DLL로 제공됨 |
| TSF COM 클래스 | TSF 인터페이스를 구현 (ITfTextInputProcessor, ITfCompositionSink 등) |
| xxxxOnKeyDown, OnCompositionUpdate | 키 처리 및 조합 상태 갱신 |
| 시스템 등록 | 레지스트리 등록 + regsvr32 스크립트로 등록 자동화 |
전략 포인트
Visual Studio로 TSF 샘플을 기반으로 간소화된 구조 구축
COM/TSF 구성은 최소 구현부터 시작 → 후에 UI 확장
libhangul과 연결해 조합 처리 담당
✅ 3단계: 한글 오토마타 연결
🧩 방식 선택:
방식설명난이도
| libhangul 사용 | 이미 구현된 FSM 기반 한글 조합기 | 쉬움 |
| 직접 오토마타 구현 | 상태머신 or 입력 시퀀스 기반 조합 | 중~상 |
예: 직접 구현 시
swift
복사편집
enum HangulState { case empty, choseong, jungseong, jongseong } var currentState: HangulState = .empty var inputBuffer: [String] = [] func handleInput(char: String) { switch currentState { case .empty: if isChoseong(char) { currentState = .choseong } case .choseong: if isJungseong(char) { currentState = .jungseong } case .jungseong: if isJongseong(char) { currentState = .jongseong } else { commit(); reset(); handleInput(char) } ... } }
✅ 4단계: 기능 추가 전략
기능은 다음과 같이 점진적으로 추가합니다:
기능구현 전략
| 자판 전환 | 설정 파일로 선택 or IME 메뉴 UI로 토글 |
| 모아치기 | 입력 순서 무시: 종성-중성 → 글자 재조합 |
| 옛한글 입력 | 유니코드 확장 영역 반영, libhangul 지원 여부 확인 |
| 키보드 단축키 | macOS: 메뉴 아이템 or 단축키, Windows: 트레이 메뉴 |
| 트레이 UI (Windows) | TSF + 시스템 트레이 아이콘 API 사용 |
| 앱 호환성 대응 | 메모장, Word, Slack, 파이어폭스 등 개별 테스트 및 보완 |
✅ 5단계: 배포 전략
플랫폼방법
| macOS | .app 패키징 후 install.sh 배포 |
| Windows | NavilIME.dll → 레지스트리 등록 or install.bat |
| Linux | .so 파일 + ibus 등록 or fcitx 플러그인 제작 |
| Android/iOS | 키보드 Extension / IME App 형태로 별도 개발 |
✅ 6단계: 테스트 전략
테스트 대상예시
| 기본 텍스트 앱 | 메모장, 텍스트에디터, 메모 |
| 웹 기반 입력 | 브라우저 주소창, 검색창 (파이어폭스, 크롬) |
| 특수 앱 | MS Word, Excel, Slack, VSCode |
| 입력 딜레이 측정 | 키 입력 → 조합 → 출력 시간 테스트 |
🧠 핵심 요약
항목핵심 전략
| 초안 구현 | 가장 단순한 자판(세벌식), 최소 오토마타 구조로 구현 시작 |
| 구조 설계 | macOS: InputMethodKit 중심, Windows: TSF COM 기반 |
| 확장성 확보 | 자판 전환, 모아치기, 한자 입력 등은 모듈 분리로 확장 |
| 디버깅 | 로그 출력 + GIF 캡처 + 반복 테스트 루틴 확보 |
궁금하신 항목이 있다면,
Windows용 TSF 구성 코드 샘플
macOS용 InputController.swift 구조
오토마타 조합 알고리즘 전체 로직
같은 구체적인 구현 레벨의 자료도 제공드릴 수 있습니다.
어떤 항목을 더 깊이 파고들어 보고 싶으신가요?
첫댓글 저도 언젠가 제작해봐야지 하고 있는데 손도 못대고 있네요.
libhangul은 c로 제작되었고 맥에서도 사용가능한 걸로 알고 있습니다.
오리지널 libhangul 버전이 있고
https://github.com/libhangul/libhangul
2018년정도까지의 커스텀 세벌식을 담아낸 우덜님의 버전이 따로 있습니다.
https://gitlab.com/3beol/libhangul
맥에 구름입력기라는 앱이 있는데 정식 버전은 오리지널 libhangul을 쓰고 있고
https://gureum.io/
우덜님의 libhangul을 쓴 버전은 이 카페의 차차님이 별도의 빌드로 배포하고 계십니다.
https://cafe.daum.net/3bulsik/623N/314
우덜님의 libhangul을 수정하면 뭔가 새로운 한글 입력방법을 끼워넣을 수 있을거 같은데 코드 분석을 많이 해야 할 것 같습니다.
제가 IME 앱을 만들 결심을 하게 될줄은 몰랐습니다. 그런데 ARM 윈도우조차 날개셋을 사용할 수 없다는 것에 저도 직접 배우고 만들어야겠다는 생각이네요. GPT들이 요즘 많이 발달해서 몇번 피드백을 주면 스스로 교정하면서 코딩도 해주고 그러더군요. GPT의 도움을 받으면 딱딱한 프로그래밍 학습 과정이 더 쉬워지지 않을까 싶어요. 이미 오픈된 깃헙 소스들을 GPT들 보고 분석해서 저에게 설명하게끔 하는 식으로 배우려구요.
응원의 말씀밖에 못 드려서 안타깝네요. 정부에서 날개셋 인수한 뒤 각 OS마다 이식해서 배포했으면 좋겠습니다..
뜻있는 프로그래머들이 더 많이 나서주셨으면 좋겠어요.. 프로그래밍과 거리가 먼 사람이 하려니 참 막막하네요.
안녕하세요. 맥OS에서 한글 입력기를 개발한 경험이 있어서 이 글을 보고 참고하시라고 링크 남겨드리겠습니다. 에이전트 코딩 하시면 충분히 원하시는 자판 배열 만드셔서 사용하실 수 있을 거예요.
- https://cafe.daum.net/3bulsik/623N/324
- https://github.com/soomtong/patim
정말 감사합니다. 참고하여 공부하겠습니다.