[React] input 태그에서 keyDown ‘Enter’ 두번 실행

Updated
2024/10/27 05:48
Category
Front-end
Tags
React
2 more properties
한글 입력 시 React의 keydown 이벤트가 두 번 호출되는 문제는 주로 한글의 자음과 모음이 합성되는 과정에서 발생합니다. 이 현상은 입력 방식 편집기(IMD)의 특성으로 인해 발생하며, 이를 해결하기 위한 여러 방법이 있습니다.

문제원인

한글 입력 시, 사용자가 자음과 모음을 입력하면 브라우저는 각 입력에 대해 keydown 이벤트를 발생시키고, 최종적으로 글자가 완성되면 onCompositionEnd 이벤트가 호출됩니다. 이 과정에서 keydown 이벤트가 중복 호출되어 원치 않는 동작을 유발할 수 있습니다

해결방법

1. 커스텀 훅 사용

useKeyComposing이라는 커스텀 훅을 만들어 한글 입력 중에는 keydown 이벤트를 차단할 수 있습니다. 이 훅은 onCompositionStart와 onCompositionEnd 이벤트를 활용하여 현재 한글 입력 상태를 감지합니다.
import { useState } from 'react'; const useKeyComposing = () => { const [isComposing, setIsComposing] = useState(false); const keyComposingEvents = { onCompositionStart: () => setIsComposing(true), onCompositionEnd: () => setIsComposing(false), }; return { isComposing, keyComposingEvents }; }; export default useKeyComposing;
JavaScript
복사

2. 네이티브 이벤트 활용

이벤트 핸들러 내에서 event.nativeEvent.isComposing속성을 확인하여 한글 조합 중인지 여부를 판단할 수 있습니다. 조합 중일 경우 해당 이벤트를 무시하도록 조건을 추가합니다.
function handleKeyDown(e) { if (e.nativeEvent.isComposing) return; // 나머지 처리 로직 }
JavaScript
복사

3. onKeyPress 사용

onKeyDown 대신 onKeyPress 이벤트를 사용하는 방법도 있으나, 이는 더 이상 권장되지 않습니다. onKeyPress는 문자가 실제로 입력될 때만 반응하기 때문에 중복 호출 문제를 피할 수 있지만, 이 이벤트는 앞으로 지원되지 않을 예정입니다