Suspense

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

์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ๋Š” Suspense๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

<Suspense fallback={<Loading/>}>
    <p>๋กœ๋”ฉ ๋!</p>
</Suspense>

ํ†ต์ƒ์ ์œผ๋กœ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋˜๊ณค ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Suspense๊ฐ€ ๊ณผ์—ฐ ๋ฌด์—‡์ผ๊นŒ?

Suspense๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด "๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜์œผ๋‹ˆ๊นŒ fallback์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋Œ€์‹  ๋ณด์—ฌ์ค˜" ๋ผ๊ณ  ๋ฆฌ์•กํŠธ์—๊ฒŒ ๋งํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ ๋ณด์—ฌ์ค„ ui๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ ์žฅ์ ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Suspense๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ์˜ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž.

export default function NoSuspense(){
    const [state, setState] = useState<string>('')
    
    useEffect(() => {
        fetchFn().then(res => setState(res))
    },[])
    return state !== '' ? <p>{state}</p> : <Loading />;
}

Suspense๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ ํ”ํžˆ ์ž‘์„ฑ๋˜๋Š” ํ˜•์‹์˜ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ์ด๋‹ค.

state์˜ ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ๋ณด์—ฌ์ค˜์•ผํ•  ์ปดํฌ๋„ŒํŠธ์™€ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ์‹ค์‹œํ•œ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ๋Š” ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋ฐ์ดํ„ฐ๊ฐ€ 1๊ฐœ์ด์ง€๋งŒ, ์‹ค์ œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ฒŒ๋˜๋ฉด ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ํ•˜๋‚˜ํ•˜๋‚˜์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์žˆ์–ด ๋งค์šฐ ๋น„ํšจ์œจ ์ ์ด๊ณ  ๊ฐ€๋…์„ฑ๋„ ๋‚ฎ์•„์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๊ฒฐ์ •์ ์œผ๋กœ, ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ• ๊ฒƒ์€ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ๊ทธ ์ž์ฒด ์ด์ง€ ์–ด๋–ป๊ฒŒ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ์ง€๊ฐ€ ์•„๋‹ˆ๋‹ค.

export default function DoSuspense(){
    const [state, setState] = useState<string>('')
    
     useEffect(() => {
        fetchFn().then(res => setState(res))
    },[])
    return (
        <Suspense fallback={<Loading/>}>
            <p>{state}</p>
        </Suspense>
    )
}

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ์ € Suspense๋กœ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌํ›„ ์‚ฌ์šฉ๋  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์‹ธ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์˜จ์ „ํžˆ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์— ์ง‘์ค‘ํ•˜์—ฌ ๋กœ์ง์„ ์ž‘์„ฑํ• ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ๊ฐ€๋…์„ฑ ๋˜ํ•œ ํ˜„์ €ํžˆ ์ƒ์Šน๋œ๋‹ค.

Last updated