React 공식문서 스터디

useEffect (3)

려낭 2024. 6. 10. 21:42

커스텀 훅으로 Effect 감싸기

 

Effect는 탈출구이다. 리액트를 벗어나야 할 때, 또는 더 나은 빌트인 솔루션이 없을 때 사용한다. Effect를 수동으로 작성해야 하는 경우가 자주 발생한다면 이는 컴포넌트가 의존하는 일반적인 동작에 대한 커스텀 훅을 추출해야 한다는 신호일 수 있다.

 

예를 들어 이 useChatRoom에 커스텀 훅은 Effect의 로직을 보다 선언적인 API 뒤에 숨긴다.

 

function useChatRoom({ serverUrl, roomId }) {
  useEffect(() => {
    const options = {
      serverUrl: serverUrl,
      roomId: roomId
    };
    const connection = createConnection(options);
    connection.connect();
    return () => connection.disconnect();
  }, [roomId, serverUrl]);
}

 

그러면 모든 컴포넌트에서 이와 같이 사용할 수 있다.

 

function ChatRoom({ roomId }) {
  const [serverUrl, setServerUrl] = useState('https://localhost:1234');

  useChatRoom({
    roomId: roomId,
    serverUrl: serverUrl
  });

 

 

Effect를 이용한 데이터 페칭

 

컴포넌트에 데이터를 페칭하기 위해 Effect를 사용할 수 있다. 만약 프레임워크를 사용하고 있다면 프레임워크의 데이터 페칭 메커니즘을 이용하는 것이 Effect를 직접 작성하는 것보다 더 효율적이다.

 

만약 직접 Effect를 작성하여 데이터를 페칭하고 싶다면 코드참조

 

import { useState, useEffect } from 'react';
import { fetchBio } from './api.js';

export default function Page() {
  const [person, setPerson] = useState('Alice');
  const [bio, setBio] = useState(null);

  useEffect(() => {
    let ignore = false;
    setBio(null);
    fetchBio(person).then(result => {
      if (!ignore) {
        setBio(result);
      }
    });
    return () => {
      ignore = true;
    };
  }, [person]);

 

ignore변수의 초기값이 false로 설정되고 정리 함수 동작 중에 true로 설정되는 것에 주목하라. 이 로직은 코드가 경쟁상태 (race conditions)에 빠지지 않도록 보장해준다. 네트워크 요청을 보낸 순서와 응답을 받는 순서가 다르게 동작할 수 있기 때문에 이러한 처리가 필요하다.

 

경쟁상태: 비동기 작업을 수행할 때 흔히 발생하는 문제 중 하나이다. 네트워크 요청과 같은 비동기 작업의 순서가 예측되지 않기 때문에 발생할 수 있다. 이를 방지하기 위해 ignore 변수를 사용한다.

'React 공식문서 스터디' 카테고리의 다른 글

useEffect, useLayoutEffect 발표자료  (0) 2024.06.14
useLayoutEffect  (2) 2024.06.11
useEffect (2)  (1) 2024.06.05
useEffect  (0) 2024.06.04
useReducer/useContext/useRef 발표자료  (0) 2024.06.03