Skip to content

IME란

IME(Input Method Editor) 정의와 에디터에서 중요한 이유

**IME(Input Method Editor)**는 키보드 입력을 최종 문자로 바꾸는 계층이다. 사용자가 키를 누르면 OS·플랫폼의 IME가 그 입력을 받아 조합하고, 조합 중인 문자열(preedit)과 확정된 문자열(commit)을 앱에 넘긴다.

알파벳처럼 키 하나가 문자 하나로 바로 대응되면 IME가 개입할 필요가 거의 없다. 한글, 일본어, 중국어처럼 한 글자를 여러 키 입력으로 조합하는 경우에는 IME가 “지금 조합 중인 글자”와 “사용자가 확정한 글자”를 구분해 앱에 전달한다.

에디터(텍스트 필드, contenteditable, 코드 에디터 등)가 IME를 제대로 다루지 않으면 다음 현상이 난다.

  • 조합 중 글자가 깨지거나 사라짐 — 조합 중인 문자열을 일반 입력처럼 취급해 덮어쓰거나, DOM을 직접 수정해 composition 상태가 꼬인다.
  • 커서 위치가 틀어짐 — 조합 구간과 커서를 하나의 단위로 다루지 않아, 조합 중에 커서가 조합 문자열 밖으로 나가거나 선택 영역이 어긋난다.
  • 한 번에 한 글자만 들어가는 것처럼 보임 — composition 이벤트를 무시하고 keydown/keypress만 처리하면, IME가 보내는 “조합 완료된 한 글자”를 놓치거나 중복 처리한다.
  • undo/redo가 꼬임 — 조합 중인 입력을 undo 스택에 넣거나, commit 시점과 undo 단위가 맞지 않아 실행 취소 결과가 어색해진다.

그래서 에디터는 composition 이벤트(compositionstart, compositionupdate, compositionend)를 구독하고, “조합 중인 구간”과 “확정된 텍스트”를 구분해 처리해야 한다.

  • composition(조합)
    아직 확정되지 않은, 입력기 내부에서만 보이는 문자열이다. 사용자가 계속 키를 누르면 바뀌고, Esc나 포커스 이동으로 취소될 수 있다. 웹에서는 CompositionEventdata로 전달된다.

  • commit(확정)
    사용자가 스페이스·엔터를 누르거나, 다음 글자 입력으로 이전 글자가 확정되는 등, “이제 문서에 넣어야 할 문자열”이 결정되는 시점이다. compositionend가 발생하고, 그 시점의 data가 문서에 반영되어야 할 최종 문자열이다.

에디터는 “조합 중”에는 해당 구간을 임시로 표시만 하고, “commit” 시점에만 문서 모델에 반영하고 undo 스택에 넣는 식으로 동작하면 IME와 충돌을 줄일 수 있다.