IME란
IME(Input Method Editor) 정의와 에디터에서 중요한 이유
**IME(Input Method Editor)**는 키보드 입력을 최종 문자로 바꾸는 계층이다. 사용자가 키를 누르면 OS·플랫폼의 IME가 그 입력을 받아 조합하고, 조합 중인 문자열(preedit)과 확정된 문자열(commit)을 앱에 넘긴다.
알파벳처럼 키 하나가 문자 하나로 바로 대응되면 IME가 개입할 필요가 거의 없다. 한글, 일본어, 중국어처럼 한 글자를 여러 키 입력으로 조합하는 경우에는 IME가 “지금 조합 중인 글자”와 “사용자가 확정한 글자”를 구분해 앱에 전달한다.
에디터에서 IME가 중요한 이유
Section titled “에디터에서 IME가 중요한 이유”에디터(텍스트 필드, contenteditable, 코드 에디터 등)가 IME를 제대로 다루지 않으면 다음 현상이 난다.
- 조합 중 글자가 깨지거나 사라짐 — 조합 중인 문자열을 일반 입력처럼 취급해 덮어쓰거나, DOM을 직접 수정해 composition 상태가 꼬인다.
- 커서 위치가 틀어짐 — 조합 구간과 커서를 하나의 단위로 다루지 않아, 조합 중에 커서가 조합 문자열 밖으로 나가거나 선택 영역이 어긋난다.
- 한 번에 한 글자만 들어가는 것처럼 보임 — composition 이벤트를 무시하고
keydown/keypress만 처리하면, IME가 보내는 “조합 완료된 한 글자”를 놓치거나 중복 처리한다. - undo/redo가 꼬임 — 조합 중인 입력을 undo 스택에 넣거나, commit 시점과 undo 단위가 맞지 않아 실행 취소 결과가 어색해진다.
그래서 에디터는 composition 이벤트(compositionstart, compositionupdate, compositionend)를 구독하고, “조합 중인 구간”과 “확정된 텍스트”를 구분해 처리해야 한다.
composition과 commit
Section titled “composition과 commit”-
composition(조합)
아직 확정되지 않은, 입력기 내부에서만 보이는 문자열이다. 사용자가 계속 키를 누르면 바뀌고, Esc나 포커스 이동으로 취소될 수 있다. 웹에서는CompositionEvent의data로 전달된다. -
commit(확정)
사용자가 스페이스·엔터를 누르거나, 다음 글자 입력으로 이전 글자가 확정되는 등, “이제 문서에 넣어야 할 문자열”이 결정되는 시점이다.compositionend가 발생하고, 그 시점의data가 문서에 반영되어야 할 최종 문자열이다.
에디터는 “조합 중”에는 해당 구간을 임시로 표시만 하고, “commit” 시점에만 문서 모델에 반영하고 undo 스택에 넣는 식으로 동작하면 IME와 충돌을 줄일 수 있다.