QueenCards / ProjectAnalysis

플젝뿌셔
1 stars 0 forks source link

[24] React Query에 대해서 설명해주세요. #27

Closed hyeyoonS closed 1 month ago

hyeyoonS commented 2 months ago

📎 질문

React Query에 대해서 설명해주세요.

✏ 답변 키워드

✏ 서술 답변

[24] ReactQuery에 대해서 설명해주세요.

1. 리액트 쿼리가 뭐지?

2. 상태(State)

⇒ 프론트: 페이지가 로드되거나 렌더링 된 이후 사용자가 수행한 모든 결과

⇒ 백: 특정 시점에 클라이언트의 요청에 대해 데이터 베이스에서 유저 정보를 가져와 서버의 상태 값을 관리하고, 데이터 베이스에 있는 값을 그대로 전달 or 가공을 해서 메모리에 저장

image

<server / client state를 가지고 있는 어플리케이션의 아키텍쳐 구조>

image

<REST API를 사용하는 서버(stateless) 에서 사용하는 cache 툴>

image

사용자의 Action ⇒ State 변경 ⇒ View 변화! ⇒ 사용자가 또다른 Action ⇒ State 변경 ….

3. 🧐 왜 리액트쿼리?

👀 만약 리액트쿼리를 사용하지 않는다면?

useEffect(() => {
 customFetch("...").then(setState)
},[]);

🤔앗 ajax가 뭐였지…? 자바스크립트를 사용해서 비동기적으로 리퀘스트를 보내고 리스폰스를 받는데 기반이 되는 기술들의 집합



👀 앗 이제는 이해할 수 있다! Next.js의 fetch가 왜 불편한지…!!

공식적으로 Next14는 캐시된 값을 버리는(invalidate) 기술을 두 가지 지원합니다.

  1. server cache invalidate

    • fetch('path', { cache: 'no-store' } 로 (DB에서) 항상 새로운 데이터를 받아올 수 있습니다.
    • fetch('path', { tags: ['data'] }) 로 캐시를 특정할 수 있는 태그를 붙일 수 있습니다.
    • revalidatePath, revalidateTag 함수로 fetch + GET method 의 결과값을 invalidate 할 수 있습니다.
  2. client cache invalidate

    • router.refresh() : RQ에서 해당 페이지의 모든 쿼리를 invalidate하는 방식과 비슷합니다.클라이언트 렌더링 결과물만 바뀝니다. 캐시를 무효화하는 것이 아니라 페이지를 완전히 새로 로드하는 것이므로, 서버에서 새로운 HTML 페이지를 받아와서 클라이언트에게 다시 그리는 것과 유사합니다.

    ⇒따라서 서버의 캐시가 남아있다면, 서버에서 새로운 HTML을 받아오더라도 똑같은 화면이 그려질 것입니다.

이 두 가지 방식을 조합해서 써야 하는데, client cache와 server cache를 생각하면서 잘 써야 하기 때문에 휴먼 에러가 다수 발생할 수 있습니다.

예시로,

사용자가 게시글을 수정하면 → 검색 페이지의 검색 결과에서도 해당 게시글 내용이 수정되어야 하는 경우에,

/search 에서 fetch('/getPost', { tags: [search] }) 로 데이터를 받고 (서버)

/post/edit경로에서 revalidateTag('search') 로 서버의 캐시를 invalidate (서버)

하지만 클라이언트 컴포넌트에서 router.refresh() 를 사용해도 수정 사항이 반영되지 않습니다. 서버의 캐시만을 지웠을 뿐이기 때문입니다.….. 서버의 DB에서 에서 최신 데이터를 서버 상태로 다시 가져온 후 router.refresh()로 화면을 새로 그리거나 or state를 사용하여 데이터를 mutate하여야 합니다.

//state를 사용하여 데이터를 mutate하는 예시코드
import React, { useState } from 'react';

function PostComponent() {
  const [postData, setPostData] = useState(null);

  // 게시글 데이터를 업데이트하는 함수
  const updatePostData = (newData) => {
    setPostData(newData);
  };

  return (
    <div>
      <p>{postData}</p>
    </div>
  );
}

그래서 Client Component에서 데이터 Fetching 을 하는 경우 RQ가 더 간편한 것입니다. ~!!



4. 서버 상태에 대한 자세한 설명 정리

5. 서버 상태에서 생기는 필연적인 문제들!

6. 리액트 쿼리와 캐싱

Stale - while - revalidate

⇒ 캐싱된 데이터를 사용자에게 제공하면서, 비동기적으로 콘텐츠를 서버에서 revalidate

⇒ 데이터가 out of date가 되었을 경우, 백그라운드에서 refetch를 보내고 새로 업데이트 하는 전략

image image

⇒ 데이터가 없는 것보다 오래된 데이터를 보여주는 게 낫다!



😎여기부턴 추가,, 좀 더 이해하기 쉬운 설명

리액트쿼리가 해결해주는 문제들

간편한 Server State 수급 방식

앱이 간단하다면 useState와 contextAPI만 사용하더라도 대부분의 client state를 다룰 수 있습니다. 하지만 복잡도가 올라가고 성능 향상에 대한 필요성이 생기는 시점이 예상된다면, 이미 잘 만들어진 바퀴인 상태 관리 도구를 선택하는 게 가장 합리적인 선택일 것입니다.

리액트쿼리가 없었을 때에는 서버 상태 값을 받아오기 위해

하지만 높은 러닝커브로 js에 익숙하지 않은 개발자들에게는 큰 부담감이 되었습니다.

⇒ react query는 hook 기반의 로직들로 구성되어 해당 훅을 사용하는 컴포넌트에서 상태 값의 변경을 간편하게 파악하여 리렌더링을 유발하게 해줍니다.

캐시

react query를 사용하기 전까지 state라는 용어는 암묵적으로 client의 state를 가리켰습니다. react query가 server state라는 개념을 만든 것이 아니라

client state만 신경 쓰기에도 프론트엔드 개발자가 해야 할 작업들이 많았던 것인데요

리액트쿼리는 데이터의 캐시 처리를 간편하게 할 수 있는 인터페이스를 제공합니다.

💘결론!

fetch api를 사용하여 데이터를 불러올 때 에러 처리를 추가적으로 해줘야 한다는 불편함을 axios가 해결해주듯이,

클라이언트와 서버의 상태 값을 일치시켜야 하는 요구 사항에서 부가적으로 생길 수 있는 로직들을 리액트쿼리의 api와 인터페이스로 간단하게 해결할 수 있도록 도와주는 것입니다.

Nahyun-Kang commented 1 month ago

Next.js와 리액트 쿼리의 캐싱 차이

저번에 나왔던 Next.js의 fetch 함수 캐시 과정에 관련된 자료입니다. 리액트 쿼리의 개념 대신 이 부분을 한 번 조사해보았습니다

[https://velog.io/@nab5m/Next-js의-캐싱](https://velog.io/@nab5m/Next-js%EC%9D%98-%EC%BA%90%EC%8B%B1)

Next.js 캐싱 방법

React-Query 캐싱 방법

리액트 쿼리의 캐싱은 주로 클라이언트 측에서 이루어지며, 내장된 캐시 관리 기능을 통해 데이터를 캐시하고 관리합니다. ( chat-gpt 리액트 쿼리 캐싱 관련 자료는 찾지 못했습니다 ㅠ)

정리하자면 Next.js의 fetch는 브라우저 캐시(클라이언트 캐시), 서버 캐시(서버 캐시)를 따로 동기화해주는 로직이 필요한데

ReactQuery는 자체 캐싱 기능을 지원하여 클라이언트에서 관리를 하므로 동기화 작업이 별도로 필요하지 않은 것 같다는 의미로 이해했습니다.

(확실하지 않습니다 ㅠㅠ)

olseul commented 1 month ago

React Query는 서버 상태 관리를 위해 사용되는 강력한 라이브러리로, 비동기 데이터 페칭, 캐싱, 동기화, 서버와의 데이터 교환을 쉽게 할 수 있도록 도와줍니다. 주로 React 애플리케이션에서 사용되며, 서버 데이터와 관련된 여러 작업을 효율적으로 처리

리액트 쿼리를 사용하는 이유

서버 상태 관리의 단순화 자동 상태 관리: React Query는 isLoading, isError, data 등의 상태를 자동으로 관리해줍니다. 따라서, 서버 상태와 관련된 로딩, 에러 상태를 별도로 관리할 필요가 없습니다.

자동 데이터 갱신 데이터 동기화: 사용자가 애플리케이션에 접속한 후 아무런 행동을 하지 않더라도, React Query는 서버 상태를 자동으로 갱신하여 최신 데이터를 유지할 수 있습니다. 이를 통해 사용자에게 항상 최신의 정확한 데이터를 제공할 수 있습니다.

캐싱 및 성능 최적화 캐싱 기능: React Query는 서버로부터 받은 데이터를 캐시에 저장하여 동일한 요청을 반복적으로 보내는 것을 방지합니다. 이를 통해 불필요한 서버 요청을 줄이고, 성능을 최적화할 수 있습니다.

HaydenDevK commented 1 month ago

React Query란

서버 상태를 쉽게 가져오고, 캐싱하고, 동기화 및 업데이트하게 해주는 서버 상태 관리 라이브러리React Query 사용 의의

React Query 사용 의의

Jyophie commented 1 month ago

React Query란?

React Query는 서버 상태를 간편하고 효율적으로 관리하기 위해 설계된 라이브러리입니다. 클라이언트 측 상태 관리와는 달리, 서버 상태는 서버에서 데이터를 가져와야 하고, 이 데이터는 주기적으로 변경될 수 있습니다. React Query는 이러한 서버 상태를 관리하는 데 필요한 기능들을 제공하여 데이터를 fetching, caching, synchronizing, updating 등을 쉽게 할 수 있도록 돕습니다.

주요 기능 및 특징

  1. 데이터 패칭(Fetching) 및 캐싱(Caching): React Query는 데이터를 가져오고 캐싱하여 동일한 데이터 요청을 최적화합니다. 캐싱된 데이터는 일정 시간이 지나면 자동으로 만료되며, 필요한 경우 다시 패칭됩니다.

  2. 자동 리패치(Automatic Refetching): 데이터가 오래되거나 백그라운드에서 업데이트가 필요한 경우, React Query는 자동으로 데이터를 다시 패칭합니다. 이를 통해 항상 최신 데이터를 유지할 수 있습니다.

  3. 쿼리 무효화(Query Invalidation): 특정 이벤트(예: 데이터 업데이트, 사용자의 상호작용 등)가 발생할 때 쿼리를 무효화하여 데이터를 다시 가져오도록 할 수 있습니다.

  4. 데이터 동기화(Synchronization): 다양한 컴포넌트 간에 데이터 동기화를 자동으로 관리하여 데이터 일관성을 유지합니다.

  5. 배치 업데이트(Batch Updates): 여러 데이터 업데이트를 하나의 배치로 처리하여 성능을 최적화합니다.

  6. 로딩 및 오류 상태 관리: 데이터 패칭 중 발생할 수 있는 로딩 상태와 오류 상태를 간편하게 관리할 수 있습니다.

hyeyoonS commented 1 month ago

(확실하지 않습니다 ㅠㅠ)

리액트18버전에서 RSC가 나오면서 서버에서 렌더링되는 서버 컴포넌트가 등장한 것처럼, 리액트쿼리도 서버의 데이터를 캐싱하도록 로직이 바뀌엇더욤