api호출 3초뒤로 하고, loading.tsx 파일이 있을 때 없을때 /home/page.tsx
251
작성한 질문수 40
안녕하세요 제로초님
제목처럼
api호출 3초뒤로 하고, loading.tsx 파일이 있을 때 없을때 /home/page.tsx
이런식으로 테스트를 해봤습니다.
/home/page.tsx에서는 react-query로 ssr을 적용했고
import style from './home.module.scss'
import Tab from "@/app/(afterLogin)/home/_component/Tab";
import TabProvider from "@/app/(afterLogin)/home/_component/TabProvider";
import PostForm from "@/app/(afterLogin)/home/_component/PostForm";
import { HydrationBoundary, QueryClient, dehydrate } from '@tanstack/react-query';
import TabDecider from "@/app/(afterLogin)/home/_component/TabDecider";
import { getPostRecommends } from '@/app/(afterLogin)/_lib/getPostRecommends';
export default async function Home() {
const queryClient = new QueryClient();
await queryClient.prefetchInfiniteQuery({
queryKey: ['posts', 'recommends'],
queryFn: getPostRecommends,
initialPageParam: 0,
});
const dehydratedState = dehydrate(queryClient);
return (
<main className={style.main}>
<HydrationBoundary state={dehydratedState}>
<TabProvider>
<Tab />
<PostForm />
<TabDecider />
</TabProvider>
</HydrationBoundary>
</main>
);
}
/mocks/handlers.tsx에서는 postRecommends를 가져오되 3초 delay를 줬습니다.
http.get('/api/postRecommends', async ({ request }) => {
console.log('----------------------------------handlers /api/postRecommends');
await delay(3000);
const url = new URL(request.url);
const cursor = parseInt(url.searchParams.get('cursor') as string) || 0;
return HttpResponse.json(
[
{
postId: cursor + 1,
User: User[0],
content: `${cursor + 1} ${faker.lorem.paragraph()}`,
Images: [{ imageId: 1, link: faker.image.urlLoremFlickr({ category: 'animals' }) }],
createdAt: generateDate(),
},
{
postId: cursor + 2,
User: User[0],
content: `${cursor + 2} ${faker.lorem.paragraph()}`,
Images: [
{ imageId: 1, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
{ imageId: 2, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
],
createdAt: generateDate(),
},
{
postId: cursor + 3,
User: User[0],
content: `${cursor + 3} ${faker.lorem.paragraph()}`,
Images: [],
createdAt: generateDate(),
},
{
postId: cursor + 4,
User: User[0],
content: `${cursor + 4} ${faker.lorem.paragraph()}`,
Images: [
{ imageId: 1, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
{ imageId: 2, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
{ imageId: 3, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
{ imageId: 4, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
],
createdAt: generateDate(),
},
{
postId: cursor + 5,
User: User[0],
content: `${cursor + 5} ${faker.lorem.paragraph()}`,
Images: [
{ imageId: 1, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
{ imageId: 2, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
{ imageId: 3, link: faker.image.urlLoremFlickr({ category: 'animals' }) },
],
createdAt: generateDate(),
},
]
);
}),
이 후에 ssr화면 테스트를 위해서
브라우저의 자바스크립트 사용중지 했습니다.

서버도 각각 재시작하고 테스트했습니다.
그리고 나서 테스트한 화면입니다.
아래 화면은 loading.tsx가 업을때,

아래 화면은 loading.tsx가 있을때 입니다.

선생님 강의에서
ssr을 적용했을때 loading화면을 포기해야한다고 이해했었습니다.
prefetchInfiniteQuqery를 쓰고 loading을 포기하거나,
prefetchInfiniteQuqery을 포기하고 loading을 사용하거나.
그런데 제가 테스트했을때는 ssr이라도 로딩 화면이 보이는걸로 봐서 제가 테스트를 잘못한건지,
loading.tsx가 있는것 자체가 suspense를 사용한것과 동일한 효과를 주어서 보여지게 되는건지
여쭙고 싶습니다.
제가 잘못테스트했다면 어떻게 테스트를 해야 좀 더 정확히 구분지을 수있을지도 궁금합니다.
답변 1
0
지금 궁금한 게 혹시 tabDecider 안에 useSuspenseQuery를 사용하신 상태인가요? Suspense가 적용되어 있으면 react-query는 ssr을 하지 않습니다.
0
선생님 위 질문은 useSuspenseQuery를 사용하지 않은 상태에서 한 테스트입니다.
그래서
page.tsx 옆에 loading.tsx파일을 놓는것만으로 suspense가 적용되어있는 걸로 인식해서 그런건지 궁금했습니다.
혹은 제가 테스트를 잘못한건지 알고 싶었습니다.
0
https://github.com/vercel/next.js/issues/50150
이거 이 이슈인 것 같은데요. loading.tsx가 js 끈 상태에서 있으면 렌더링 문제가있어보입니다. 혹시 js를 켜면 초기 렌더링이 어떤가요?
0
선생님 답변이 늦어서 죄송합니다.
loading.tsx파일이 있을때 js를 켰을때 미리보기
loading.tsx파일이 없을때 js를 켰을때 미리보기 입니다.
이걸로 미루어보아
loading.tsx파일이 존재하는것만으로 suspense적용하는걸로 인식해서 ssr을 못하는게 아닌가 추측해봤습니다.
suspense를 사용하면 특정 부분에 적용해주고, 그렇지 않고 loading.tsx만 있으면 전체를 suspense해주는게 아닌가 하는...
선생님이 답변해준 다른 질문들을 봤을때도 ssr작업을 했더라도 suspens를 사용하면 ssr 포기해야한다는 글을 봤어서 그렇게 생각했습니다.
그리고 문서를 봤을때 ssr을 다 포기하는건 아니고 정적인 부분(suspense를 감싸지 않은)부분은 ssr로 되고 데이터 호출해야 하는 부분은 안되는것 같습니다. 제가 이해한 부분이 맞는지 궁금합니다.
캡처링부분 질문있습니다.
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
98
2
프라이빗 폴더를 해야 하는 이유가 모호한 것 같아요.
0
85
2
vanilla-extract 못찾는 문제
0
230
2
fetch 캐싱과 revalidate 관련
0
84
2





