본문 바로가기
이론/Frontend

useEffect 내부에서는 기명함수를 사용하자

by 유세지 2024. 3. 17.

 

 

 

 

 

useEffect

 

useEffect는 외부 시스템과 컴포넌트를 동기화 시켜주는 리액트 훅으로,

공식 문서에 나와있는 useEffect의 예시 코드는 이러한 모양입니다.

 

useEffect의 사용 예시

 

 

코드를 보면, useEffect의 첫 번째 인자로 트리거 시 실행될 동작을 익명함수로 넣어주고 있습니다.

이때 훅 내부의 함수가 길어지면 특별한 주석 없이는 코드의 동작을 알기 어려워 질 때가 종종 발생합니다.

따라서 함수를 적절한 이름을 붙인 기명함수로 바꿔주면 팀원들의 이해를 도와줄 수 있습니다.

 

이 상태에서, 임의로 오류를 발생시켜 보겠습니다.

 

 

익명함수에서 오류가 발생한 상황

 

 

Uncaught Error: Error occurred!
    at (/src/App.jsx?t=1710664770335:24:11)

 

 

에러가 발생한 위치의 stack trace에 at 뒤로 파일의 위치만 알려주고 있습니다.

마찬가지로 함수가 익명함수이기 때문에 발생하는 현상인데,

이를 기명함수로 변경시켜 준 뒤 모습을 살펴보겠습니다.

 

 

기명함수에서 오류가 발생한 상황

 

 

Uncaught Error: Error occurred!
    at errorTrigger (/src/App.jsx?t=1710664810199:24:11)

 

 

익명함수와는 다르게, 기명함수에서는 어떤 함수에서 에러가 발생했는지 확실하게 표시해주는 모습입니다.

디버깅을 할 때에도 에러가 발생한 부분을 정확히 파악하면 문제를 빠르게 해결할 수 있기에

앞으로도 익명함수보다는 기명함수를 사용하는 습관을 들인다면 좋겠습니다.

 

 

 

함수의 위치

useEffect를 컴포넌트의 어디에 선언해 둘 것인가에 대해서도 여러가지 의견이 있습니다.

보통 컴포넌트의 최상단 혹은 JSX return의 바로 위 정도로 나뉘는데,

이 부분은 취향이나 팀 컨벤션의 영역이라고 생각합니다.

 

1) 컴포넌트의 최상단

function App() {
  const [state, setState] = useState(0);
  const [state2, setState2] = useState(1);

  useEffect(function errorTrigger() {
    console.log("is Mount");
    throw new Error("Error occurred!");
  }, []);

  /**
   * other function...
   */

  return (
    <div className="App">
      <h1>useEffect test</h1>
    </div>
  );
}

 

 

2) JSX return의 위

function App() {
  const [state, setState] = useState(0);
  const [state2, setState2] = useState(1);
  
  /**
   * other function...
   */

  useEffect(function errorTrigger() {
    console.log("is Mount");
    throw new Error("Error occurred!");
  }, []);

  return (
    <div className="App">
      <h1>useEffect test</h1>
    </div>
  );
}

 

 

개인적으로는 jsx return의 바로 위를 선호합니다.

 

useEffect의 특성상 렌더링에 영향을 미치는 부분도 많고,

컴포넌트의 다른 함수들이 먼저 선언 된 뒤 side effect에 관련된 코드가 나오는 흐름이 자연스럽게 느껴지더라구요.

 

 

 

마치며

어찌보면 사소할 수도 있는 내용들이지만, 알아두면 분명 좋은 내용이라 정리해보았습니다.

짧은 글 읽어주셔서 감사합니다.

반응형

댓글