프로그래밍/ReactJS

React 이벤트 핸들링: 인수를 전달하여 상호작용의 깊이를 더하다

shimdh 2025. 9. 20. 17:46
728x90

React 애플리케이션에서 사용자와의 상호작용은 매우 중요합니다. 버튼 클릭, 양식 제출, 입력 필드 텍스트 입력 등 사용자의 모든 동작에 응답하는 것은 동적인 웹 경험을 제공하는 데 필수적입니다. 이때 '이벤트 핸들러'가 핵심적인 역할을 합니다. 이벤트 핸들러는 사용자가 특정 이벤트를 발생시켰을 때 실행되는 함수입니다. React는 웹 표준 HTML 이벤트와 유사하게 onClick, onChange와 같은 camelCase 구문을 사용하여 요소에 직접 이벤트 핸들러를 연결할 수 있도록 지원하며, 이는 React의 가상 DOM과 함께 작동하여 효율성을 극대화합니다.


728x90

왜 이벤트 핸들러에 인수를 전달해야 할까요?

단순한 경우, 이벤트 핸들러는 아무런 인수 없이도 잘 작동합니다. 예를 들어, 단순히 카운터를 증가시키는 버튼의 경우 아래와 같은 코드로 충분합니다.

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

export default Counter;

하지만 애플리케이션의 복잡성이 증가함에 따라, 이벤트 핸들러가 호출되는 컨텍스트에 대한 더 많은 정보가 필요해지는 경우가 많습니다. 예를 들어, 여러 개의 항목이 있는 목록에서 각 항목을 삭제하는 버튼이 있다고 가정해 봅시다. 이때 이벤트 핸들러는 "어떤 항목이 클릭되었는지" 에 대한 정보를 알아야 올바른 항목을 삭제할 수 있습니다.

바로 이런 경우, 이벤트 핸들러에 인수를 전달하는 것이 필수적입니다. 인수를 전달함으로써 우리는 이벤트 핸들러의 유연성과 재사용성을 크게 향상시킬 수 있습니다.


인수를 전달하는 방법: 유연하고 강력한 상호작용

React에서 이벤트 핸들러에 인수를 전달하는 가장 일반적이고 효과적인 방법은 "화살표 함수" 를 사용하는 것입니다. 다음 예시를 통해 카운터 증가 값을 인수로 전달하는 방법을 살펴보겠습니다.

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  // Function accepts an argument for increment value
  const handleIncrement = (incrementValue) => {
    setCount(count + incrementValue);
  };

  return (
    <div>
      <p>Count: {count}</p>
      {/* Using arrow functions allows us to pass arguments */}
      <button onClick={() => handleIncrement(1)}>Increase by 1</button>
      <button onClick={() => handleIncrement(5)}>Increase by 5</button>
    </div>
  );
}

export default Counter;

위 코드에서 handleIncrement 함수는 incrementValue라는 매개변수를 받습니다. 각 버튼은 화살표 함수 () => handleIncrement(값)를 사용하여 handleIncrement를 호출하고, 원하는 증가 값을 인수로 전달합니다. 이러한 접근 방식을 통해 사용자의 상호작용에 따라 카운터를 얼마나 증가시킬지 유연하게 지정할 수 있게 됩니다.


인수를 전달할 때의 중요 고려사항

인수를 전달하는 것은 강력하지만, 몇 가지 중요한 고려사항을 염두에 두어야 합니다.

1. 성능 최적화

JSX 내에서 화살표 함수를 사용하여 인수를 전달할 때, 렌더링될 때마다 새로운 함수 인스턴스가 생성될 수 있습니다. 이는 특히 대규모 애플리케이션에서 잠재적인 성능 영향으로 이어질 수 있습니다. 만약 애플리케이션의 성능이 중요해진다면, 다음과 같은 다른 접근 방식을 고려해 볼 수 있습니다:

  • 메서드 바인딩 (클래스 컴포넌트): 클래스 컴포넌트에서는 생성자에서 이벤트 핸들러를 바인딩하거나, 클래스 속성 구문을 사용하여 함수를 정의하여 매번 새로운 함수 인스턴스가 생성되는 것을 방지할 수 있습니다.
  • 콜백 함수 메모이제이션 (함수 컴포넌트): useCallback React 훅을 사용하여 콜백 함수를 메모이제이션함으로써 불필요한 리렌더링을 방지하고 성능을 최적화할 수 있습니다.

2. 이벤트 객체에 대한 접근

React 컴포넌트에서 이벤트를 처리할 때(예: 클릭), 핸들러 함수 내에서 자동으로 "합성 이벤트 객체" 라는 암시적인 첫 번째 인수가 전달된다는 점을 기억해야 합니다. 필요한 경우 사용자 정의 매개변수와 함께 이 이벤트 객체에 계속 액세스할 수 있습니다.

const handleButtonClick = (event, id) => {
   console.log('Button clicked!', id);
   console.log('Event target:', event.target);
};

그리고 다음과 같이 호출합니다.

<button onClick={(event) => handleButtonClick(event, someId)}>My Button</button>

이렇게 하면 이벤트에 대한 정보(예: 클릭된 요소)와 함께 사용자 정의 데이터를 모두 활용할 수 있습니다.

3. 컨텍스트 (Context API) 또는 상태 관리 라이브러리 활용

여러 컴포넌트에서 비슷한 기능이 필요하지만, props를 여러 단계를 거쳐 전달하는 것이 비효율적일 때는 React의 Context API 또는 Redux와 같은 상태 관리 라이브러리를 사용하는 것을 고려해 볼 수 있습니다. 이는 전역적인 상태 관리를 통해 복잡성을 줄이고 코드의 재사용성을 높일 수 있습니다. 특정 데이터를 여러 컴포넌트에 "주입"해야 할 때 인수를 직접 전달하는 것보다 더 효율적인 방법이 될 수 있습니다.


결론: 더 스마트한 React 상호작용을 위한 발걸음

React 애플리케이션에서 이벤트 핸들러에 인수를 전달하는 방법과 그 이유를 이해하는 것은 개발자로서의 역량을 효과적으로 확장하는 중요한 단계입니다. 단순히 이벤트를 처리하는 것을 넘어, 동적인 상호작용을 통해 사용자 경험을 향상시키고 더욱 복잡하고 기능적인 애플리케이션을 구축할 수 있게 됩니다. 오늘 배운 내용을 바탕으로 사용자에게 더 풍부하고 반응적인 경험을 제공하는 React 애플리케이션을 만들어보세요!

728x90