Skip to content

IME별 composition 이벤트 변화

한글·일본어·중국어 등 IME에 따른 compositionstart/update/end 타이밍과 data 예제

IME에 따라 compositionstart, compositionupdate, compositionend발생 시점CompositionEvent.data 값이 다르다. 아래는 각 IME에서의 대표적인 이벤트 순서와 data 예시다. 실제 동작은 OS·브라우저·IME 버전에 따라 달라질 수 있으므로, 에디터 구현 시에는 이벤트로 넘어온 문자열만 신뢰하고, 필요하면 타겟 환경에서 로그로 확인하는 것이 좋다.


이벤트의미CompositionEvent.data
compositionstart조합 세션 시작. IME가 “조합 중” 모드로 들어감.조합으로 대체될 기존 선택 영역의 문자열. 없으면 빈 문자열.
compositionupdate조합 중 문자열이 바뀜.현재 조합 중인 문자열(preedit).
compositionend조합 종료(commit 또는 취소).commit이면 확정된 최종 문자열; 취소면 빈 문자열.

사용자가 순서로 눌러 “가”를 만든 뒤, 스페이스로 확정한다.

2.2 이벤트 순서 예시(한 가지 패턴)

Section titled “2.2 이벤트 순서 예시(한 가지 패턴)”

IME·브라우저에 따라 compositionupdate 호출 횟수data에 오는 문자열이 다를 수 있다.

패턴 A: 자모마다 compositionupdate

순서이벤트data비고
1compositionstart""조합 시작
2compositionupdate”ㄱ”ㄱ 입력 직후. 일부 IME는 “ㄱ”을 preedit으로 보냄.
3compositionupdate”가”ㅏ 입력 직후. (L,V,T)=(0,0,0) → 완성형 “가”.
4compositionend”가”스페이스로 commit.

패턴 B: 완성형만 compositionupdate

순서이벤트data비고
1compositionstart""조합 시작
2compositionupdate”가”ㅏ 입력 직후. “ㄱ” 단계는 data에 안 보내고 “가”만 보내는 IME도 있음.
3compositionend”가”스페이스로 commit.

패턴 C: compositionupdate가 한 번만

순서이벤트data비고
1compositionstart""조합 시작
2compositionupdate”가”ㅏ 입력 시. “ㄱ” 입력 시에는 compositionupdate가 발생하지 않을 수도 있음.
3compositionend”가”스페이스로 commit.

2.3 “각” 입력 예시(ㄱ → ㅏ → ㄱ)

Section titled “2.3 “각” 입력 예시(ㄱ → ㅏ → ㄱ)”
순서이벤트data (예시)비고
1compositionstart""
2compositionupdate”ㄱ” 또는 “가”ㄱ, ㅏ 입력에 따라 다름.
3compositionupdate”가”ㅏ 입력 후.
4compositionupdate”각”ㄱ(종성) 입력 후.
5compositionend”각”스페이스 또는 다음 자모로 commit.
순서이벤트data비고
1compositionstart""
2compositionupdate”가” (또는 중간 상태)
3compositionend""취소 시 data는 빈 문자열.

3. 일본어 IME (로마자 → 히라가나): “か” 입력

Section titled “3. 일본어 IME (로마자 → 히라가나): “か” 입력”

사용자가 ka 순서로 눌러 “か”(히라가나)를 만든 뒤, Enter 또는 다음 키로 확정한다.

순서이벤트data (예시)비고
1compositionstart""로마자 “k” 입력 시 조합 시작.
2compositionupdate”k” 또는 “か”IME에 따라 “반각 로마자” 또는 “히라가나”가 올 수 있음.
3compositionupdate”か”“a” 입력 후 “か”로 변환.
4compositionend”か”Enter 또는 다음 문자 입력으로 commit.

일본어 IME는 변환(変換) 전에는 “조합 중”이고, Enter로 변환 확정 시 commit된다. 변환 후 再変換 시에는 별도 composition 세션이 시작될 수 있다.

3.3 “変換中” (변환 후보 선택 중)

Section titled “3.3 “変換中” (변환 후보 선택 중)”
순서이벤트data (예시)비고
1compositionstart""Space로 변환 시작.
2compositionupdate”漢字” (선택 중인 후보)후보가 바뀔 때마다 compositionupdate.
3compositionend”漢字”Enter로 후보 확정 = commit.

4. 중국어 IME (병음): “中” 입력

Section titled “4. 중국어 IME (병음): “中” 입력”

사용자가 z h o n g 순서로 눌러 병음 “zhong”을 입력한 뒤, 숫자 키 또는 클릭으로 후보 “中”을 선택해 확정한다.

순서이벤트data (예시)비고
1compositionstart""첫 글자(예: z) 입력 시.
2compositionupdate”z”
3compositionupdate”zh”
4compositionupdate”zho”
5compositionupdate”zhon”
6compositionupdate”zhong”
7compositionupdate”中” (또는 후보 목록의 첫 항목)후보가 뜨면 data에 한자 또는 병음이 올 수 있음.
8compositionend”中”후보 선택 확정 = commit.

중국어 IME는 조합 중에는 병음 문자열, 후보 선택 후에는 한자가 data로 올 수 있다. IME에 따라 compositionupdate 호출 횟수와 data 내용(병음 vs 한자)이 다르다.


5. 유럽권(데드 키·악센트): “é” 입력

Section titled “5. 유럽권(데드 키·악센트): “é” 입력”

사용자가 acute accent(´) 데드 키를 누른 뒤 e를 눌러 “é”를 만든다.

일부 환경에서는 composition 이벤트 없이 바로 “é”(U+00E9)가 insertText로 들어올 수 있다. composition을 쓰는 경우 예시는 다음과 같다.

순서이벤트data (예시)비고
1compositionstart""데드 키 입력 시.
2compositionupdate”´” 또는 ""데드 키만 눌렀을 때.
3compositionend”锓e” 입력 시 조합 완료·commit.

브라우저·OS에 따라 composition 없이 beforeinput/input만 오고, inputTypeinsertText, data가 “é”인 경우도 있다. 에디터는 composition 이벤트가 오면 조합 구간으로 처리하고, 오지 않으면 일반 insertText로 처리하면 된다.


IMEcompositionupdate 호출data에 오는 내용commit 시점
한글(2벌식)자모마다 1회 ~ 완성형만 1회“ㄱ”, “가” 또는 “가”만스페이스·엔터·다음 자모
일본어(로마자)로마자/히라가나 변환 시“k”, “か” 등Enter·다음 문자
일본어(변환)후보 변경 시선택 중인 한자 등Enter로 후보 확정
중국어(병음)글자마다 또는 후보 표시 시“z”, “zh”, … “中”후보 선택 확정
유럽권(데드 키)없을 수 있음“é” 등 완성 문자다음 키 입력 시

  • IME 중립 처리: “조합 중인지”는 compositionstart 이후 compositionend 이전으로만 판단하고, compositionupdate의 data를 preedit으로만 표시한다.
  • commit: compositionend 시점의 data가 비어 있지 않으면 commit 문자열로 문서에 반영한다.
  • 취소: compositionend의 data가 빈 문자열이면 preedit만 제거하고 commit하지 않는다.
  • 실제 타이밍 확인: 타겟 OS·브라우저·IME 조합에서 addEventListener(“compositionupdate”, e => console.log(e.data)) 등으로 로그를 남겨, 위 예시와 비교해 보면 된다.