๐ฅ [React] Lazy-Loading ์์๋ณด๊ธฐ
ํด๋น ํ์ด์ง๋ lazy-loading ์ ๋ํด ์์๋ณด๊ณ
๊ทธ์ ๋ฐ๋ฅธ ๊ฐ๋จํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์๋ณด๋ ํ์ด์ง์ ๋๋ค.
์?
ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ์์ ๊ธ ๋ชฉ๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ๊ธ์ด ๋๋ฌด ๋ง์
์ฌ์ฉ์๊ฐ ์ํ๋ ๋งํผ๋ง ๋ก๋ฉํ๋ ๋ฐฉ๋ฒ์ ์์๊น ์ถ์ด ์์๋ณด๊ฒ ๋์๋ค.
Lazy-Loading ์ด๋?
ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ ์์ ์ ๋น์ฅ ํ์ํ์ง ์์ ๋ฆฌ์์ค๋ค์ ์ถํ์ ๋ก๋ฉํ๊ฒ ํ๋ ๊ธฐ์
์ผ๋ฐ์ ์ผ๋ก ํ์ด์ง์ ์ ๊ทผํ๋ฉด ํ์ด์ง ๋ด์ฉ์ด ๋ชจ๋ ์์ฒญ ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ชจ๋ ํ์ด์ง ๋ด ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ค ์ด์ฉํ๋ค๋ฉด ์๊ด์์ง๋ง
์ฌ์ฉ์๋ค์ ์๊ธฐ๊ฐ ์ํ๋ ํน์ ์ ๋ณด๋ฅผ ์ป๊ธฐ๋ง ํ๊ณ ๋๊ฐ์๋ ์๋ค.
๋ฐ๋ผ์ ๊ทธ์ ๋ฐ๋ฅธ ์ธ๋ฐ์๋ ์์ฒญ๊ณผ ๋ญ๋น๊ฐ ์ด๋ฃจ์ด์ง๋ค.
๊ทธ๋ฌํ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ด lazy-loading
์ด๋ผ๊ณ ํ๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
์ฐ์ ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฏ๋ก
์คํฌ๋กค์ ๊ฐ์งํ๊ณ ์์ด์ผ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const [isLoading, setIsLoading] = useState<boolean>(false);
const sentinel = useRef<HTMLDivElement | null>(null);
// ๋งจ ํ๋จ component ์ ref
useEffect(() => {
const observer = new IntersectionObserver(
(entries) => {
if (entries[0].isIntersecting && !isLoading) {
// ๊ฐ์ง ํ์ ๋์ ๋ก์ง ์ถ๊ฐ
// setIsCounter((current) => current + 1);
}
},
{ threshold: 1.0 }
);
if (sentinel.current) {
observer.observe(sentinel.current);
}
return () => observer.disconnect();
}, []);
ํ์ฌ ๋ณด์ฌ์ฃผ๊ณ ์๋ ์ ๋ณด์ ๋ง์ง๋ง (sentinel) ์ ๋ฌํ์ ๋
์๋ก ๋ก๋ฉ (loading) ์ ํด์ผํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
useEffect(() => {
const getResponse = async () => {
setIsLoading(true);
try {
const response = await getNowPlayingList(isCounter);
if (response.status === 200 && response.data.results) {
setIsList((prev) => [...prev, ...response.data.results]);
}
} catch (error) {
// ์๋ฌ ์ฒ๋ฆฌ
} finally {
setIsLoading(false);
}
};
getResponse();
}, [isCounter]);
// counter ๊ฐ ๋ณ๊ฒฝ๋์ ๋ ์คํ
// getNowPlayingList๋ page ๋ฅผ number type ์ผ๋ก ๊ฐ์ง
์ฅ์
- ์ฌ์ฉ์๊ฐ ์ฒ์ ์น์ฌ์ดํธ์ ์ ๊ทผํ ๋ ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ๋ค์ด๋ก๋ ๋๊ธฐ ๋๋ฌธ์ ์ฝํ ์ธ ์ ์ ๊ณต ์๋๊ฐ ๋น ๋ฅด๋ค. ์ฆ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
- ์ฝํ ์ธ ๊ฐ ์ง์์ ์ผ๋ก ๊ณต๊ธ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ๋ฅผ ์ดํํ ํ๋ฅ ์ ๋ฎ์ถ ์ ์๋ค.
- ์ฌ์ฉ์๊ฐ ํ์๋ก ํ๋ ๊ฒฝ์ฐ์๋ง ์ฝํ ์ธ ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋ฐฐํฐ๋ฆฌ, ์๊ฐ, ์์คํ ๋ถ๋ด ๋ฑ์ด ๋ฎ์์ง๋ค. ์ฆ ๋น์ฉ์ด ๊ฐ์๋๋ค.
๋จ์
- ๋ก๋ฉ ์๊ฐ์ด ๊ธธ์๋ก ์ํ๋ ํ์ด๋ฐ์ ๋ก๋ฉ์ ๋ง์น์ง ๋ชปํ ์๋ ์๋ค.
ํ์ธํ๋ ๋ฒ
Dev Tools -> Network -> img
๋ก ๋ค์ด๊ฐ ํ์ธํด๋ณด๋ฉด ์ ์์ ์ผ๋ก ์๋ํ๋์ง ์ ์ ์๋ค.