React 19 (Next.js 15) 의 새로운 훅 use

반응형

 

React의 use 함수

 

  기본 개념

 

  use는 React 18에서 소개된 새로운 Hook으로, Promise나 Context와 같은 리소스를 "소비(consume)"하는 데 사용됩니다. 쉽게

  말해서 use는 "기다려야 하는 데이터"를 사용할 수 있게 해주는 도구입니다.

 

  일상적인 비유로 이해하기

 

  식당에서 음식을 주문했다고 생각해보세요:

 

  - await (일반 JavaScript): 음식이 나올 때까지 자리에 앉아 기다립니다. 다른 일은 전혀 할 수 없습니다.

  - then() (Promise 체이닝): "음식이 준비되면 저를 불러주세요"라고 말하고 다른 일을 하러 갑니다.

  - use (React): 음식이 준비될 때까지 다른 것들(UI의 다른 부분)을 먼저 보여주다가, 음식이 준비되면 테이블로 가져다 줍니다.

 

  use와 다른 Hook의 차이점

 

  - useState: 컴포넌트의 상태를 관리합니다 (예: 사용자 입력)

  - useEffect: 컴포넌트의 부수 효과를 처리합니다 (예: 데이터 가져오기)

  - useContext: 컴포넌트 트리를 통해 데이터를 전달합니다

  - use: Promise나 Context에서 데이터를 추출합니다. 특히 중요한 점은 컴포넌트 내의 조건문이나 반복문 안에서도 사용할 수

  있다는 것입니다.

 

  Next.js에서의 use

 

  Next.js 15에서는 라우트 매개변수(params)와 검색 매개변수(searchParams)가 이제 Promise를 반환합니다. 이것은 다음을

  의미합니다:

 

  1. 이 데이터가 비동기적으로 제공될 수 있음

  2. 컴포넌트가 이 데이터를 사용하기 전에 해결(resolve)되어야 함

 

  // 이전 Next.js 버전

  export default function Page({ params }) {

    const { id } = params; // 즉시 사용 가능

    // ...

  }

 

  // Next.js 15

  export default function Page({ params }) {

    const resolvedParams = use(params); // Promise를 해결(resolve)

    const { id } = resolvedParams; // 이제 안전하게 사용 가능

    // ...

  }

 

  실제 작동 방식

 

  use 함수가 호출되면 다음과 같은 일이 일어납니다:

 

  1. 전달된 리소스(Promise)가 아직 해결되지 않았다면:

    - React는 현재 컴포넌트의 렌더링을 일시 중단합니다

    - Promise가 해결될 때까지 기다립니다

    - Promise가 해결되면 렌더링을 재개합니다

  2. 전달된 리소스가 이미 해결되었다면:

    - 즉시 해결된 값을 반환합니다

 

  use의 장점

 

  1. 조건부 사용 가능: 다른 Hook(useEffect, useState 등)과 달리, use는 조건문이나 반복문 내에서 사용할 수 있습니다.

  2. 컴포넌트 리렌더링 최적화: 데이터가 준비되었을 때만 해당 부분을 렌더링합니다.

  3. 간결한 코드: .then() 체인이나 async/await 구문보다 더 간결하고 직관적인 코드를 작성할 수 있습니다.

 

  주의사항

 

  - use는 React 컴포넌트 내부 또는 다른 Hook 내부에서만 사용할 수 있습니다

  - 아직 실험적인 기능이지만, Next.js 15에서는 paramssearchParams를 처리하기 위해 권장됩니다

 

  이렇게 use는 React 애플리케이션에서 비동기 데이터를 더 쉽고 효율적으로 처리할 수 있게 해주는 강력한 도구입니다. Next.js

  15에서는 라우트 매개변수를 처리할 때 필수적으로 사용해야 합니다.

 

 

use 훅의 핵심 개념 확장

 

  1. 다양한 리소스 타입 처리:

    - Promise: 비동기 데이터 (해결되지 않은 상태)

    - Context: 이미 사용 가능한 리소스 (즉시 해결)

    - 그 외 Thenable 인터페이스를 구현한 객체

  2. 이미 해결된 값:

    - 네, Promise가 아닌 일반 값이 use에 전달되면 (예: Context) 이미 해결된 것으로 간주되어 즉시 반환됩니다

    - 이미 해결된 Promise도 즉시 값을 반환합니다

  3. 선언적 비동기 처리:

    - 기존: useEffect + useState 조합으로 명령형(imperative) 스타일 코드

  const [data, setData] = useState(null);

  useEffect(() => {

    fetchData().then(result => setData(result));

  }, []);

  // data가 null이면 로딩 UI 처리 필요

 

    - use 사용: 선언적(declarative) 스타일 코드

  const data = use(fetchData());

  // 여기서는 data가 항상 사용 가능

  4. UI 렌더링과의 관계:

    - React의 Suspense 모델과 통합됨

    - 비동기 데이터가 준비되지 않았을 때:

        i. 컴포넌트 렌더링 일시 중단

      ii. 가장 가까운 <Suspense> 바운더리까지 "버블 업"

      iii. <Suspense> 의 fallback UI 표시

      iv. 데이터 준비 시 원래 컴포넌트 렌더링 재개

  5. 선언적 코드의 이점:

    - 비동기 로직이 UI 로직과 자연스럽게 통합됨

    - 로딩 상태 관리를 위한 추가 상태 불필요

    - "데이터가 있다고 가정하고" 코드 작성 가능

    - 조건부 데이터 가져오기 패턴 가능

 

 실제 활용 시나리오 확장

 

  function UserProfile({ userId }) {

    // 조건부 데이터 요청 - 선언적으로!

    if (shouldShowDetails) {

      const userDetails = use(fetchUserDetails(userId)); // 필요할 때만 요청

      return <DetailedView user={userDetails} />;

    }

 

    // 기본 사용자 정보만 표시

    const basicUserInfo = use(fetchBasicUserInfo(userId));

    return <BasicView user={basicUserInfo} />;

  }

 

  이 예제에서는 조건에 따라 다른 데이터를 가져오지만, 각 경로에서 필요한 데이터는 선언적으로 요청됩니다.

 

 기존 방식과 use의 패러다임 차이

 

  기존 방식:

  1. 컴포넌트 렌더링 시작

  2. 비동기 작업 요청 (useEffect)

  3. 로딩 상태 표시

  4. 데이터 도착 시 상태 업데이트

  5. 상태 변경으로 인한 리렌더링

  6. 최종 UI 표시

 

  use 방식:

  1. 컴포넌트 렌더링 시작

  2. use로 비동기 작업 요청

  3. 렌더링 잠시 중단, Suspense fallback 표시

  4. 데이터 도착 시 중단된 지점부터 렌더링 재개

  5. 최종 UI 바로 표시 (중간 로딩 상태 없음)

 

  이는 React의 렌더링 모델에 대한 근본적인 변화를 의미하며, "데이터를 기다리는" 대신 "데이터가 있을 때만 렌더링"하는 접근

  방식으로 전환됩니다. 이런 패러다임 변화는 UI 코드를 더 직관적이고 데이터에 의존적인 방식으로 작성할 수 있게 해줍니다.

 

 

 

 

 

반응형

댓글

Designed by JB FACTORY