-
Notifications
You must be signed in to change notification settings - Fork 0
๐งช ์๋ง์ ๊ทธ๋ํ ๋ฐ์ดํฐ ์์ฒญ์ ์ด๋ป๊ฒ ์ค์ผ๊น
๋ถ์ผ | ์์ฑ์ | ์์ฑ์ผ |
---|---|---|
FE | ์กฐ๋ฐฐ๊ฒฝ | 24๋ 12์ 03์ผ |
๊ทธ๋ํ๋ฅผ ์ด์ง๋ง ์์ง์ฌ๋, ๋ฐ์ดํฐ๊ฐ ์๋ฅด๋ฅด ์์ฒญ๋๋ค.
๊ทธ๋ํ๋ฅผ ์ผ์ชฝ์ผ๋ก ์คํฌ๋กค ํ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์ ์๋์ ์กฐ๊ฑด ๋ฟ์ด๋ค.
if (logicalRange?.from < 10 && hasNextPage) {
fetchNextPage();
}
- ํ์ฌ ๋ณด์ด๋ ์์ญ์ ์์์ ์ ์์น๊ฐ 10๋ณด๋ค ์๊ณ , ๋ค์ ํ์ด์ง๊ฐ ์๋ค๋ฉด fetchNextPage๋ฅผ ์คํํ๋ค.
์ฐจํธ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ตฌ๊ฐ์ logicalRange.from
์ด ์ ๋ถ 10๋ณด๋ค ์๋ค.
๋ฐ๋ผ์ if๋ฌธ์ด ๊ณ์ true๊ฐ ๋์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ๋ค.
tanstack query์ ํน์ง์ผ๋ก๋ queryKey๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ณต ์์ฒญ์ ๋ฐฉ์งํ๋ ๊ฒ์ธ๋ฐ, ์ ์ค๋ณต ์์ฒญ์ด ๋ฐ์ํ ๊น?
๋ด ์๊ฐ์
- useInfiniteQuery๋ pageParam์ ์บ์ฑํ๊ณ ์์ง ์๊ฑฐ๋
- ์์ฒญ์ด ์๋ฃ๋์ง ์์ ์ํ์์ ์ถ๊ฐ์ ์ผ๋ก ์์ฒญ์ ํด์ ์ค๋ณต์ฒ๋ผ ๋ณด์ด๋ ๊ฒ
์ด ์๋๊น ์ถ๋ค. ์ค์ ๋ก tanstack query์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค.
-
pageParam ์บ์ฑ ์ฌ๋ถ
1๋ฒ ๊ฐ์ค์ ์ค์ ๋ก ์๊ฐ์ฐจ๋ฅผ ๋๊ณ ํด๋น ๊ตฌ๊ฐ์ ์์ฒญํด๋ ์ค๋ณต ์์ฒญ์ด ๊ฐ๋์ง ํ๋จํด๋ณด๋ฉด ์ ์ ์๊ฒ ๋ค.
lastStartTime์ ์ง์คํด์ ๋ณด๋ฉด ๋๋ค.
์ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์์ฒญํ ๋ ์ฌ์ฉ์์ ์คํฌ๋กค์ด ๋๋ฌด ๋น ๋ฅธ ๋๋จธ์ง 7์ 3์ผ์์ ์์ฒญ์ด 3๋ฒ ๊ฐ๋ค. ๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์์ ๋์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ๋๋ ์ด๋ฏธ ๋ถ๋ฌ์๋ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ 7์ 3์ผ์ ๋ค์ ๋ถ๋ฅด์ง ์๋๋ค.
์ฆ, pageParam์ ์บ์ฑํ์ง ์๋๋ค๋ผ๋ ๊ฒ์ ๋จ์ ์ง๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํด๋๋ ๊ฒ์ ๋ง๋ค.
-
์์ฒญ์ด ์๋ฃ๋์ง ์์ ์ํ์์ ์ถ๊ฐ์ ์ผ๋ก ์์ฒญ์ ํด์ ์ค๋ณต์ฒ๋ผ ๋ณด์ด๋ ๊ฒ
์ข ๋ ์์ธํ ์ดํด๋ณด๊ธฐ ์ํด network๋ฅผ slow 4G๋ก ์ค์ ํ ํ ํ์ธํด๋ดค๋ค.
ํ๋์ ์์ฒญ์ด pending ์ํ์ผ ๋ ์คํฌ๋กค์ ๊ณ์ ํ๋ค๋ฉด ๋์ผํ api๊ฐ ์ค๋ณต๋์ด ์์ฒญ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฆ, ์ฌ์ฉ์์ ์คํฌ๋กค ์๋๊ฐ ๋ฐ์ดํฐ ํจ์นญ ์๋๋ณด๋ค ์๋ฑํ ๋นจ๋ผ์ ๋ค์์ ์์ฒญ์ด ์๊ธด ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด logicalRange.from์ ๋ฒ์๋ฅผ ์ ํํด๋ณด๋ ๊ฑด ์ด๋จ๊น?
logicalRange?.from > 10 && logicalRange?.from < 11
์ด ๋ฐฉ๋ฒ์ ์ํํ๋ค. ์ฌ์ฉ์๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ๊ทธ๋ํ๋ฅผ ์คํฌ๋กค ํ๋๋์ ๋ฐ๋ผ from ๊ฐ์ด 10~11 ๋ฒ์์ ์์์๋ ์๊ณ , ์์ ์๋ ์๋ค!
์ด์ด ์ข๋ค๋ฉด ์ ๋ฒ์ ์์ ๋ค์ด๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํจ์นญํ๊ฒ ์ง๋ง, ๊ทธ๋ ์ง ์์ ์๋์ ๊ฒฝ์ฐ๋ ์๋ค. ๐
์ด๋ ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ค.
๊ทธ๋ ๋ค๊ณ ๋ฒ์๋ฅผ ๋๊ฒ ์ง์ ํ๋ค๋ฉด.. ๋ ๋ค์ ์์ฒญ์ด ๋ง์ด ๋ณด๋ด์ง ๊ฒ์ด๋ค.
์งง์ ์๊ฐ๋์ ์ด๋ฒคํธ๋ค์ด ์ฐ์ํด์ ๋ฐ์ํ๋ฏ๋ก, delay ๋จ์๋ก ๊ทธ๋ฃนํํ์ฌ ํ๋ฒ๋ง ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ก ํด๋ณด์.
์คํฌ๋กค์ ํตํด ๊ณ์ํด์ ์์ฒญ์ ํ๋ค๋ฉด, isFetching
์ํ๋ ๊ณ์ํด์ ๋ณํํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ 700ms ๊ฐ๊ฒฉ์ผ๋ก ์ ๋ฐ์ดํธ๋๊ฒ ํ์ฌ, ํด๋น ๊ฐ์ด false์ผ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ค.
๋น์ ํ์๋ฉด โ์์ฒญ ์คโ ์ํ๋ฅผ ์ค๊ฐ์ค๊ฐ ๋ธ๋กํน ํ๋ ๋๋์ด๋ค.
// isFetching์ ๋ณํ๋ฅผ ์ฐ๋กํ๋ง
// 700ms ๊ฐ๊ฒฉ์ผ๋ก๋ง throttledIsFetcing ๊ฐ์ ์
๋ฐ์ดํธ
const throttledIsFetching = useThrottle(isFetching, 700);
const fetchGraphData = useCallback((logicalRange) => {
// throttledIsFetching์ด false์ผ ๋์ ์กฐ๊ฑด ์ถ๊ฐ
if (logicalRange?.from < 10 && hasNextPage && !throttledIsFetching) {
fetchNextPage();
}
}, [hasNextPage, throttledIsFetching, fetchNextPage]);
useEffect(() => {
const chartInstance = chart.current;
if (!chartInstance) return;
const timeScale = chartInstance.timeScale();
timeScale.subscribeVisibleLogicalRangeChange(fetchGraphData);
return () => {
timeScale.unsubscribeVisibleLogicalRangeChange(fetchGraphData);
};
}, [chart, fetchGrahData]);
๊ทธ ๊ฒฐ๊ณผ, ์์ฒญ์ ์ค์๋ค. ํ์ง๋ง ์ฌ์ ํ ์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ฒ ์คํฌ๋กคํ๋ค๋ฉด, ๋์ผํ lastStartTime ์ผ๋ก ์ค๋ณต ์์ฒญ์ด ๋ฐ์ํ๋ค.
๊ทธ ์ด์ ๋ ๋ฌด์์ผ๊น?
๋ง์ฝ throttledIsFetching
์ด false๋ก ์
๋ฐ์ดํธ ๋๊ธฐ ์ ์ if๋ฌธ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
- ๋ฐ์ดํฐ๋ฅผ ํ์ฌ ์์ฒญ ์ค์ด๋ผ์
throttledIsFetching
์ด true ๋ผ๊ณ ๊ฐ์ ํ์. - ์ด ์ํฉ์์ ์คํฌ๋กค์ ๊ณ์ํด์ 700ms ์์ ๋ ์์ฒญ์ ํ๋ค๋ฉด, if๋ฌธ์ ์์ง ์ฐธ์ธ ์ํ์ด๊ธฐ ๋๋ฌธ์
fetchNextPage
๊ฐ ์คํ๋๊ณ ๋ง๋ค. ์ฆ, ์ค๋กํ๋ง์ ์ ์ฉํ ์ํ๊ฐfetchNextPage
๋ฅผ ์์ ํ ์ ์ดํ์ง ๋ชปํ๋ค.
๋ํ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธํ ๋ฟ, fetchNextPage
์ ์๋ฃ์ฌ๋ถ์๋ ๋ฌด๊ดํ๋ค. ๋คํธ์ํฌ ์ํฉ์ ๋ฐ๋ผ์ ์์ง ์์ฒญ์ด ์๋ฃ๋์ง ์์์์๋ throttledIsFetching
์ด false๊ฐ ๋ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ์๋, ์์น ์์ ์ง์ฐ์ด ๋ฐ์ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ ์ ํํ ์ค๋ณต ํธ์ถ์ ๋ง์ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
useInfiniteQuery์ isFetching์ ๊ฒฝ์ฐ์, ์์ฒญ์ด ํ ๊ฐ๋ง ์งํ๋๋ ๊ฒ์ ๋ณด์ฅํ์ง ์๋๋ค. ๊ณ์ ์คํฌ๋กค๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค๋ฉด, ์ด์ ์์ฒญ์ด ๋๋๊ธฐ๋ ์ ์ isFetching์ ์ํ๊ฐ ๊ณ์ํด์ ๋ณํํ๋ค.
๋ฐ๋ผ์ ๋ ๋ช ํํ ๋ฐ์ดํฐ ํจ์นญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด์, ๋ณ๋์ ์ํ๋ฅผ ๋์ ํ๊ธฐ๋ก ํ๋ค.
useRef๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๋ค๋ฉด ํด๋น ์ํ์ ๋ํ ๋ฆฌ๋ ๋๋ง์ ๋ง์ผ๋ฉฐ API์ ๋ํ ์ค๋ณตํธ์ถ๋ ๋ง์ ์ ์์ ๊ฒ์ด๋ค.
isPending ์ํ๊ฐ ๋ณ๊ฒฝ๋์๋ค๊ณ ํด์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ useRef๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌํ๋ค.
// pending ์ํ ์ ์ฅ
const isPending = useRef(false);
// ๊ทธ๋ํ์ ๊ฐ์ ๋ฒ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์คํ๋๋ ํจ์. ์ฆ ์คํฌ๋กคํ๋ฉด ์คํ๋จ
const fetchGraphData = useCallback(
async (logicalRange: LogicalRange | null) => {
// ์์ฒญ์ด ์งํ ์ค์ด๋ผ๋ฉด ํจ์ ์ข
๋ฃ
if (isPending.current) return;
// ๊ทธ๋ ์ง ์๋ค๋ฉด ์์ฒญ์ด ์งํ์ค
isPending.current = true;
if (logicalRange && logicalRange.from < 10 && hasNextPage) {
await fetchNextPage();
}
// ์์ฒญ์ด ๋๋๋ฉด false๋ก ์ค์
isPending.current = false;
},
[hasNextPage, isFetching, fetchNextPage],
);
// ์ด์ ๊ณผ ๋์ผ
useEffect(() => {
const chartInstance = chart.current;
if (!chartInstance) return;
const timeScale = chartInstance.timeScale();
timeScale.subscribeVisibleLogicalRangeChange(fetchGraphData);
return () => {
timeScale.unsubscribeVisibleLogicalRangeChange(fetchGraphData);
};
}, [chart, fetchGraphData]);
- fetchGraphData๋ ๊ทธ๋ํ์ ๊ฐ์ ๋ฒ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋๋๋ฐ, ์ด๋ isPending ํ๋๊ทธ๋ฅผ ํตํด ์ค๋ณต ์์ฒญ์ ๋ฐฉ์งํ๋ค.
- async/await๋ก fetchNextPage ํธ์ถ ์ ํด๋น ์์
์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. api ์๋ต ์๋ฃ ์ ์
isPending.current
๊ฐ false๋ก ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๋ ํผ๋ฐ์ค
Debounce(๋๋ฐ์ด์ค) - JavaScript์์ ํจ์๋ฅผ ์ง์ฐ์ํค๋ ๋ฐฉ๋ฒ (JS ES6 ์์ )
๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ API ์ค๋ณต ํธ์ถ์ ์ ํํ ๋ง๋ ๋ฐฉ๋ฒ
- ๐ฉ FE ๊ธฐ์ ์ ํ์ด์
- โจ ์ฐจํธ์ ๋ฐ์ํ ๊ตฌํ๊ณผ useRef ํ์ ๋ฌธ์
- ๐ฃ ๋ถ๋ชจ ์์์ ์ํ์ ๋ฐ๋ผ ์์ ์์๋ ์คํ์ผ ๋ณํ ๋ถ์ฌํ๊ธฐ
- ๐ zod ๋์ ํ๊ธฐ
- ๐ useInfiniteQuery๋ฅผ ์ฌ์ฉํ ๊ทธ๋ํ ๋ฌดํ์คํฌ๋กค ๊ตฌํ
- ๐ซ ์ฌ์ฉ์์ ์์ ๋ณํ ์๋ ๊ทธ๋ํ ์คํฌ๋กค ๊ตฌํํ๊ธฐ
- ๐งช ์๋ง์ ๊ทธ๋ํ ๋ฐ์ดํฐ ์์ฒญ์ ์ด๋ป๊ฒ ์ค์ผ๊น
- ๐ ๋คํฌ๋ชจ๋์์ ์๋ก๊ณ ์นจ ์ ๋ผ์ดํธ๋ชจ๋๊ฐ ์ ๊น ๋ณด์ด๋ ๋ฌธ์
- ๐ ์น์์ผ์ ์ฑํ ๋ฐ์ดํฐ์ REST API์ ์ฑํ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๊ด๋ฆฌํ๊ธฐ
- ๐ก BE ๊ธฐ์ ์ ํ ์ด์
- โ๏ธ Node WebSocket ํ๊ณ ๋ค๊ธฐ
- โ๏ธ TypeORM Datasource mock ๋ง๋ค๊ธฐ
- โ๏ธ oauth ID range ๋ฌธ์
- ๐ custom pipe์์ Nan์ด ๋ฐ์์ง๋ ๋ฌธ์
- ๐ช nest Websocket์ ์ธ์ ์ด ์๋๋ค๊ณ ?
- ๐ด nginx websocket ์ฐ๊ฒฐ ์ ๋ฌธ์ ๋ฐ์
- ๐ WebPush ๊ตฌํ
- ๐ง ์ฐ์ ์์ ํ๋ก ์์ฒญ ์ ์ดํ๊ธฐ
- ๐ websocket์ด ๋ฆ๊ฒ ํ ๋น๋์ด ๋ฐ์๋๋ ๋ฌธ์
- ๐ฅณ typeorm์ ์ด์ฉํ FCM ์๋ฆผ ์๋น์ค
- ๐ฆ ๋ค์ค ์ ์ ๋์์ฑ ์ ์ด โ ์ฑ๊ธํค, ๋ฎคํ ์ค
- ๐ ๏ธ ์ธํ๋ผ ๊ธฐ์ ์คํ ์ ํ ์ด์
- ๐ Ncloud ์ค์ ๊ณผ์
- ๐ ORM ๊ธฐ์ ์คํ ๋น๊ต
- ๐ค RabbitMQ๋ก ๋ถ์ฐ ์๋ฒ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ถ๋ฐฐํ๊ธฐ
- ๐ข private DB ์๋ฒ์ ์ ์ํ์ง ๋ชปํ๋ ํ์
- ๐ 1์ฃผ์ฐจ ๋ฐํ
- ๐ 2์ฃผ์ฐจ ๋ฐํ
- ๐ 3์ฃผ์ฐจ ๋ฐํ
- ๐ 4์ฃผ์ฐจ ๋ฐํ
- ๐ 5์ฃผ์ฐจ ๋ฐํ
- ๐ ์ต์ข ๋ฐํ