Published on

5단계: DOM 이벤트 처리

5-1. React의 이벤트 시스템 이해하기

React는 브라우저의 이벤트를 직접 처리하지 않고 자체적으로 구성된 SyntheticEvent 시스템을 통해 관리합니다.

  • 모든 이벤트는 문서 최상단(document)에서 처리됨 (이벤트 위임 방식)
  • 이벤트 핸들러는 컴포넌트에 등록되지만 실제로는 document에 위임됨

5-2. 기본적인 DOM 이벤트 처리 방식

JSX에서는 이벤트 이름을 camelCase로 작성하고 함수 참조를 중괄호로 전달합니다.

<button onClick={handleClick}>클릭</button>
<input onChange={handleChange} />

5-3. 이벤트 객체(SyntheticEvent)의 특징

React는 브라우저 이벤트를 래핑하여 호환성을 보장하는 SyntheticEvent를 제공합니다.

function handleClick(e) {
  e.preventDefault();
  console.log(e.target);
}
  • e.persist() 없이 비동기 처리 시 객체가 풀리므로 주의

5-4. 입력 이벤트 처리

입력 필드와 상태를 연결하는 Controlled Component 방식이 권장됩니다.

const [text, setText] = useState("");
<input value={text} onChange={(e) => setText(e.target.value)} />

5-5. 커스텀 이벤트 구현

React는 DOM의 CustomEvent 대신 props를 통해 상위 → 하위 이벤트 핸들링을 수행합니다.

function Child({ onNotify }) {
  return <button onClick={onNotify}>클릭</button>;
}

function Parent() {
  const handleNotify = () => alert("클릭됨");
  return <Child onNotify={handleNotify} />;
}

5-6. 이벤트 위임 구조

React는 이벤트를 루트(document)에 바인딩하고 내부적으로 이벤트를 분배합니다. 이는 성능상 유리하며 메모리 사용도 절감됩니다.


5-7. 성능 최적화를 위한 핸들러 작성 팁

  • useCallback으로 함수 재생성 방지
  • 무분별한 onScroll, onMouseMove 사용 자제
  • 핸들러 외부 선언으로 참조 유지

5-8. 고급 이벤트 처리

React는 다음과 같은 다양한 DOM 이벤트도 지원합니다:

  • 키보드: onKeyDown, onKeyUp
  • 포커스: onFocus, onBlur
  • 마우스: onMouseEnter, onMouseLeave

요약

  • React의 이벤트는 SyntheticEvent로 추상화되어 있고 document에 위임됨
  • JSX에서는 이벤트 이름을 camelCase로 작성하고 중괄호로 전달
  • 커스텀 이벤트는 props를 통해 구성
  • 성능 최적화를 위해 핸들러 선언과 useCallback 사용이 중요

심화학습

Q1. React의 SyntheticEvent가 자동으로 풀리는 이유는?
A1. 메모리 최적화를 위해 이벤트가 끝난 후 이벤트 객체를 재사용하거나 삭제합니다. 비동기에서 사용할 경우 참조가 끊기므로 복사하거나 persist를 호출해야 합니다.


Q2. 이벤트 핸들러가 컴포넌트 내부에 정의될 경우 발생할 수 있는 문제는?
A2. 컴포넌트가 렌더링될 때마다 함수가 재생성되어 하위 컴포넌트에 불필요한 리렌더링을 유도할 수 있습니다.


Q3. 커스텀 이벤트를 props로 처리하는 구조의 장점은?
A3. 하위 컴포넌트는 UI에 집중하고 실제 동작은 부모가 제어함으로써 관심사의 분리가 가능해지고, 재사용성과 테스트 용이성이 높아집니다.