inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Next + React Query로 SNS 서비스 만들기

강의에서 진행된 React-query로 prefetchQuery와 서스펜스를 사용한 패턴에 대해서 궁금한게 있습니다!

398

kraf

작성한 질문수 14

0

안녕하세요 강사님! 이 강의 덕분에 Next를 기반으로 다양한 프로젝트들을 진행할 수 있게 됐습니다!

그러던 도중, 문득 강사님에게 배운 일부 내용에 대해 궁금한것이 추가적으로 생겨서 질문드립니다.

 

  1. prefetchQuery를 하게 될 경우 그 원리가 궁금합니다

    export default async function TabDeciderSuspense() {
      const queryClient = new QueryClient();
      await queryClient.prefetchInfiniteQuery({
        queryKey: ['posts', 'recommends'],
        queryFn: getPostRecommends,
        initialPageParam: 0, 
      });
      const dehydreatedState = dehydrate(queryClient);
    
      return (
        <HydrationBoundary state={dehydreatedState}>
          <TabDecider />
        </HydrationBoundary>
      );
    }
    

    위 코드에서 HydrationBoundary 로 dehydreatedState를 넘겨주는 원리가

    • queryFn: getPostRecommends 를 통해 반환받은 값이 캐싱된 QueryClient인스턴스 자체를 클라이언트 컴포넌트로 넘겨주고 클라이언트 컴포넌트에서는 넘겨받은 QueryClient인스턴스에서 queryKey를 통해 캐싱 데이터를 바로 사용하는 것인가요?

    • 아니면 QueryClient 인스턴스 자체를 전송하는 것이 아니라, 인스턴스에 저장된 데이터와 상태 정보만(queryFn: getPostRecommends 반환값)클라이언트 사이드에서 사용할 수 있는 형태로 만든 뒤(=직렬화) 클라이언트 사이드에서 이 정보만 QueryClient(RQProvider.tsx에서 만든)에 적용하는 것인가요?

     

 

 

 

 

  1. 다른 글을 보면 강사님께서 prefetchQuery를 사용한 이유가 해당 페이지에 왔을 때 미리 데이터를 불러와서 SEO 측면에서 유리함을 가져가기 위해서라고 하셨는데,
    prefetchQuery없이 서버 컴포넌트에서 fetch → 하위 클라이언트 컴포넌트에 props로 전달 하는 형태도 동일한 효과를 가져가는게 맞는것일까요?

 

 

 

 

 

 

  1. 이 강의에서 진행했던, 서버 컴포넌트의 Suspense + 클라이언트 컴포넌트의 useSuspenseQuery 의 패턴을 적용할 때 발생하는 문제가 있습니다.


    (이 부분은 강사님의 코드가 아니라 저 혼자 이 강의를 토대로 직접 실습을 해보면서 맞닥뜨린 문제입니다.)

    현재 클라이언트 컴포넌트에서는 CORS대비 프록시를 사용하고 있습니다

    // next.config.js
      async rewrites() {
        return [
          {
            source: '/api/:path*',
            // 외부 백엔드 api로 프록시
            destination: `${process.env.NEXT_PUBLIC_BASE_URL_DEV}/api/:path*`,
          },
        ];
      },
    

    서버 컴포넌트에 Suspense를 걸어줍니다

    // page.tsx
    const page = ({ params }: PageProps) => {
      const slug = params.id;
      return (
        <div>
          <Suspense fallback={<Spinner />}>
            <EditPresentation slug={Number(slug)} />
          </Suspense>
        </div>
      );
    };
    

    클라이언트 컴포넌트에서 useSuspenseQuery를 사용합니다

    const EditPresentation = ({ slug }: EditPresentationProps) => {
      
      const { data: value } = useSuspenseQuery({
        queryKey: ['upload', slug],
        queryFn: async (presentationId: number) => {
        
                                     // 프록시 api
          const response = await fetch(`/api/presentations/${presentationId}`, {
            method: 'GET',
          });
    
          if (response.ok) return await response.json();
        },
      });
    
      return <>...</>;
    };
    
    export default EditPresentation;
    

    원래 이론대로라면 서버 컴포넌트의 <Suspense />에

    useSuspenseQuery의 queryFn이 걸려야 하는데, 브라우저 새로고침을 하게 되면 실행은 잘 되면서 동시에 아래의 에러가 발생합니다…

(제 생각은) 클라이언트 컴포넌트도 어쨌든 처음에 서버를 거치게 되는데, 아마 서버에서는 프록시를 사용한 api를 읽어내지 못해서 발생하는 문제 같긴 한데,,, 혹시 이런 경우에는 어떻게 처리하는게 좋을까요...ㅠ

 

react next.js react-query next-auth msw

답변 2

0

제로초(조현영)

  1. 데이터만 직렬화해서 사용하는 것입니다. 클라이언트는 데이터를 받아서 씁니다.

  2. 네 맞습니다. 리액트 쿼리를 안 쓸때는 그렇게 하는게 기본이죠.

  3. 서버에서는 항상 절대경로를 써야합니다(http로 시작하는) 앞에 process.env로 시작하게 붙여주세요.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

sunrise님의 질문에 대해 강의 내용을 바탕으로 몇 가지 유용한 정보를 공유드리고자 합니다.

  1. prefetchQuery의 원리와 사용 방법에 대한 궁금증

  2. prefetchQuery 사용의 SEO 측면에서의 이점과 데이터 전달 방식의 비교

    • 질문하신 내용과 직접적으로 일치하는 기존 답변을 찾기 어려웠습니다. 하지만 일반적인 관점에서, prefetchQuery를 사용하는 경우 서버에서 미리 데이터를 불러와 클라이언트에게 전송하는 데 있어서 SEO 측면에서 유리할 수 있습니다. 이는 검색 엔진의 크롤러가 데이터가 이미 포함된 페이지를 감지할 수 있기 때문입니다. 반면, 서버 컴포넌트에서 fetch 후 props로 데이터를 하위 클라이언트 컴포넌트에 전달하는 방식 역시 서버 사이드 렌더링의 장점을 활용할 수 있지만, 상황에 따라 prefetchQuery를 사용하는 것과 동일한 효과를 가져오려면 추가적인 구현이 필요할 수 있습니다.
  3. **우편](https://www.inflearn.com/questions/1180003)질문에서 확인할 수 있듯이, useSuspenseQuery 사용 시 발생할 수 있는 문제점과 관련하여 조현영 강사님의 설명이 있습니다. 이 부분도 sunrise님의 세 번째 질문에 대한 이해를 돕는 데 참고가 될 수 있습니다.

CORS 오류와 관련된 문제는 서버와 클라이언트 간의 요청이 이루어질 때 발생하는 보안 메커니즘으로, 서버에서 올바른 CORS 헤더를 설정하지 않거나 브라우저에서 서버로의 요청이 허용 범위를 벗어날 때 발생할 수 있습니다. 서버 사이드에서 프록시 설정을 제대로 인식하지 못해 발생하는 문제일 수 있으므로, 서버 컴포넌트에서 요청을 보낼 때의 환경 설정이나 프록시 설정을 다시 검토하는 것이 좋을 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

캡처링부분 질문있습니다.

0

74

2

깃에 소스코드를 찾을 수 없습니다.

0

113

2

useInfiniteQuery promise와 react use 사용시 페이지 무한 로딩

0

98

1

import 파일 경로를 찾지 못 해서 에러가 발생합니다.

0

109

2

css 라이브러리 추천 부탁드립니다

0

140

2

팔로우 추천 목록이 빈 배열로 들어옵니다.

0

130

1

게시물 업로드 시 userId가 undefined로 들어가는 오류

0

119

1

useSuspenseQuery 사용 시 SSR 401 이슈 관련

0

171

1

리액트 쿼리 useinfinitequery 무한스크롤 구현 시 페이지가 이동할 경우 데이터가 보존되게 할 수 있나요??

0

184

3

폴링이 필요없는 이유

0

93

2

next Request Memoization과 react cache

0

108

2

seo 최적화 기준은 데이터 fetching인가요 아님 데이터 렌더링인가요?

0

84

2

next.js 서버fetch 에러 fallback ui 구현 방법

0

173

2

프레임워크 여론 파악법

0

125

2

필터옵션이 많은 페이지에서 서버 fetch를 하는게 맞는걸까요??

0

103

2

서버 fetch suspense 로 감싸고 새로고침 시 잠시 빈 화면이 노출된 후 fallback ui가 노출됩니다.

0

102

2

template.tsx 내 서버fetch 응답값과 클라이언트 컴포넌트 상태값 싱크가 맞지 않는 이슈

0

66

2

Auth.js 사용 시 authorize 함수가 호출되지 않습니다

0

131

2

next.js 에서 로그인에 관하여

0

138

1

Next의 route handler에 대한 질문이 있습니다.

0

101

2

게시판 리스트 만들때 use client를 어디서부터 집어넣어야할지 모르겠습니다

0

97

2

프라이빗 폴더를 해야 하는 이유가 모호한 것 같아요.

0

85

2

vanilla-extract 못찾는 문제

0

229

2

fetch 캐싱과 revalidate 관련

0

84

2