); }

์ด ์˜ˆ์ œ์—์„œ๋Š” `ProductListing` ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ๋‘ ๊ฐœ์˜ ์ธ๊ธฐ ์ œํ’ˆ(`popularProduct1` ๋ฐ `popularProduct2`)์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์‚ฌ์ „ ํŽ˜์นญํ•ฉ๋‹ˆ๋‹ค. `ProductDetails` ์ปดํฌ๋„ŒํŠธ๋Š” Suspense ๊ฒฝ๊ณ„๋กœ ๋ž˜ํ•‘๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋กœ๋”ฉ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ œํ’ˆ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์บ์‹œ๋˜์–ด ์ฆ‰์‹œ ํ‘œ์‹œ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ 2: ์‚ฌ์šฉ์ž ์˜๋„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ „ ํŽ˜์นญ

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž ์˜๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „ ํŽ˜์นญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ œํ’ˆ ๋งํฌ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋งํฌ๋ฅผ ํด๋ฆญํ•  ๊ฒƒ์— ๋Œ€๋น„ํ•˜์—ฌ ์ œํ’ˆ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์‚ฌ์ „ ํŽ˜์นญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import React, { useState } from 'react'; function ProductLink({ productId }) { const [isHovered, setIsHovered] = useState(false); // ๋งํฌ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋ฐ์ดํ„ฐ ์‚ฌ์ „ ํŽ˜์นญ if (isHovered) { fetchProduct(productId); } return ( setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > ์ œํ’ˆ {productId} ); }

์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ `ProductLink` ์ปดํฌ๋„ŒํŠธ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด `fetchProduct` ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ œํ’ˆ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์‚ฌ์ „ ํŽ˜์นญ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ์ถ”์ธก์„ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

๋ฆฌ์†Œ์Šค ์ถ”์ธก์€ UX๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ์ž ์žฌ์ ์ธ ๋‹จ์ ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ๊ธฐ๋ฒ•

๊ต์ฐจ ๊ด€์ฐฐ์ž(Intersection Observers) ์‚ฌ์šฉ

๊ต์ฐจ ๊ด€์ฐฐ์ž๋Š” ์š”์†Œ๊ฐ€ ๋ทฐํฌํŠธ์— ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ค€๋น„๊ฐ€ ๋  ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „ ํŽ˜์นญํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์‚ฌ์ „ ํŽ˜์นญ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

import React, { useEffect, useRef } from 'react'; function ProductItem({ productId }) { const itemRef = useRef(null); useEffect(() => { const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { fetchProduct(productId); observer.unobserve(itemRef.current); } }); }, { threshold: 0.1 } // ์š”์†Œ์˜ 10%๊ฐ€ ๋ณด์ด๋ฉด ํŠธ๋ฆฌ๊ฑฐ ); if (itemRef.current) { observer.observe(itemRef.current); } return () => { if (itemRef.current) { observer.unobserve(itemRef.current); } }; }, [productId]); return
  • ์ œํ’ˆ {productId}
  • ; }

    ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง(SSR)

    ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง(SSR)์€ ๋ฆฌ์†Œ์Šค ์ถ”์ธก์˜ ์ด์ ์„ ๋”์šฑ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „ ํŽ˜์นญํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ์— ์™„์ „ํžˆ ๋ Œ๋”๋ง๋œ HTML์„ ์ „๋‹ฌํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์นญํ•˜๊ณ  ์ดˆ๊ธฐ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ธ์ง€๋œ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜๊ณ  SEO๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฒฐ๋ก 

    React Suspense์™€ ๋ฆฌ์†Œ์Šค ์ถ”์ธก์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „์— ํŽ˜์นญํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์„ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋ฐ˜์‘์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์‹ ์ค‘ํ•œ ๊ณ„ํš๊ณผ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ํ–ฅ์ƒ๋œ UX์™€ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์–ป๋Š” ์ด์ ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. React๊ฐ€ ๊ณ„์† ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ Suspense์™€ ๋ฆฌ์†Œ์Šค ์ถ”์ธก์€ ๊ณ ์„ฑ๋Šฅ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๋”์šฑ ์ค‘์š”ํ•œ ๋„๊ตฌ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ „๋žต์„ ์กฐ์ •ํ•˜๊ณ  ํ•ญ์ƒ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์šฐ์„ ์‹œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

    ์ด๋Ÿฌํ•œ ์ „๋žต์„ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์œ„์น˜, ์žฅ์น˜ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์— ๊ด€๊ณ„์—†์ด React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋›ฐ์–ด๋‚œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ฐธ์—ฌ ์ฆ๊ฐ€, ์ „ํ™˜์œจ ํ–ฅ์ƒ, ๊ถ๊ทน์ ์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ๊ณต์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ถ”๊ฐ€ ํƒ์ƒ‰: `swr` ๋ฐ `react-query`์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ React Suspense์™€ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜๋Š” ๊ฐ„์†Œํ™”๋œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ฐ ์บ์‹ฑ ์ „๋žต์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

    React Suspense ๋ฆฌ์†Œ์Šค ์ถ”์ธก: ํ–ฅ์ƒ๋œ UX๋ฅผ ์œ„ํ•œ ์˜ˆ์ธก์  ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ | MLOG | MLOG