#suspense, ย #react

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„  1ํŽธ - react suspense

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„  1ํŽธ - react suspense

๐Ÿ“œ ์ฝ๊ธฐ ์ „์—โ€ฆ

  • ๐ŸŽˆ ๋ณธ๋ฌธ์— ๋“ฑ์žฅํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š” suspense๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ฑ์ด ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ๊ฐ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ ์–ธ์ ์œผ๋กœ ์†์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š๋ƒ์— ๋Œ€ํ•œ ๊ด€์ ์œผ๋กœ ๋ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • ๐ŸŽˆ 2021.07.11 ๊ธฐ์ค€ ์‹œํ—˜์ ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ •์‹ ๋ฒ„์ „์—์„œ suspense๋Š” code splitting์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์˜ํ•ด์ฃผ์„ธ์š”.

  • ๐ŸŽˆ ๋ณธ๋ฌธ์€ ๋ฆฌ์•กํŠธ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ suspense๊ฐ€ ๋ญ์ฃ ?

ํ˜น์‹œ ์›นํŽ˜์ด์ง€์— ๋กœ๋”ฉ ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด ๋ณธ ์ ์ด ์žˆ๋‚˜์š”?

๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์–ธ๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Œ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ๋กœ๋”ฉ ํ™”๋ฉด์„ ๋„์›Œ๋ณธ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. react suspense๋Š” ์ด๋Ÿฌํ•œ ๋กœ๋”ฉ ํ™”๋ฉด๊ณผ ์—ฐ๊ด€์ด ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ค€๋น„๊ฐ€ ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜์Œ์„ react์— ์•Œ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ.

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

์—ฌ๊ธฐ์„œ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์˜์•„ํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ suspense ์—†์ด๋„ ๋กœ๋”ฉ ํ™”๋ฉด์„ ์ž˜ ๋งŒ๋“ค์–ด ์™”๋Š”๋ฐ? ๋ผ๊ณ  ํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“ค์–ด์™”๋˜ ๋ฐฉ์‹๋ณด๋‹ค suspense๊ฐ€ ์™œ ์ข‹์€์ง€ ๊ฐ™์ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

๐Ÿ‘€ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด๊ฐ€์š”?

์•ž์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ suspense๋Š” data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์ธ ๊ตฌ์กฐ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ์ข‹์€ ์ด์œ ๋Š” ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์šฐ์„ ์œผ๋กœ ์•Œ์•„๋ณด์ž.

data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—ญํ• 

fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์›Œํ„ฐํด(waterfall) ํ˜„์ƒ์„ ๋ง‰์•„์ค€๋‹ค. ์›Œํ„ฐํด์ด๋ผ๊ณ  ํ•˜๋ฉด ์ด์ „ ๊ฐœ๋ฐœ ๊ณผ์ •์ด ๋๋‚˜์•ผ ๋‹ค์Œ ๊ณผ์ •์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋ฐฉ๋ฒ•๋ก ์„ ๋– ์˜ฌ๋ฆฌ๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์˜ ์›Œํ„ฐํด ํ˜„์ƒ์€ ์ด์ „ fetch ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋„์ฐฉํ•ด์•ผ ๋‹ค์Œ fetch ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

  • ์ปดํฌ๋„ŒํŠธ 1์—์„œ ๋ฐ์ดํ„ฐ 1์„ ์š”์ฒญโ€ฆ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ™”๋ฉด๋งŒ์„ ๋ Œ๋”๋ง(3์ดˆ ์†Œ์š”)
  • ์ปดํฌ๋„ŒํŠธ 1์—์„œ ๋ฐ์ดํ„ฐ 1์˜ ์‘๋‹ต์„ ๋ฐ›๊ณ  ์ปดํฌ๋„ŒํŠธ 2๋ฅผ ๋ Œ๋”๋ง
  • ์ปดํฌ๋„ŒํŠธ 2์—์„œ ๋ฐ์ดํ„ฐ 2๋ฅผ ์š”์ฒญโ€ฆ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๋กœ๋”ฉ ํ™”๋ฉด๋งŒ์„ ๋ Œ๋”๋ง(2์ดˆ ์†Œ์š”)
  • ์ปดํฌ๋„ŒํŠธ 2์—์„œ ๋ฐ์ดํ„ฐ 2์˜ ์‘๋‹ต์„ ๋ฐ›๊ณ  ์ปดํฌ๋„ŒํŠธ 3์„ ๋ Œ๋”๋ง

์ด ์ƒํ™ฉ์—์„œ ๋ฌด์กฐ๊ฑด ๋ฐ์ดํ„ฐ 1์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ›๊ณ  ๋‚˜์„œ์•ผ ๋ฐ์ดํ„ฐ 2์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์‹คํ–‰๋œ๋‹ค. ๋ฐ์ดํ„ฐ 2์— ๋Œ€ํ•œ ์š”์ฒญ ์ž์ฒด๋Š” 2์ดˆ๋งŒ ์†Œ์š”๋จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ 1์— ๋Œ€ํ•œ ์š”์ฒญ ๋•Œ๋ฌธ์— 3์ดˆ๋ฅผ ๋ฌด์กฐ๊ฑด ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฐธ๊ณ  ์ฝ”๋“œ

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง -> data fetching ์š”์ฒญ -> data ์‘๋‹ต๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ ๋•Œ๋ฌธ์— ์ผ์–ด๋‚œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๊ตฌ์กฐ์— ํ•„์š”ํ•œ ๋ชจ๋“  data fetching ์š”์ฒญ์„ ๋ Œ๋”๋ง ์ด์ „์— ์‹คํ–‰ํ•˜๋„๋ก ์ค‘์•™ํ™”ํ•˜์—ฌ ํ•ด๊ฒฐํ•œ๋‹ค. ์ฆ‰ data fetching ์š”์ฒญ -> data ์‘๋‹ต -> ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์˜ ๊ตฌ์กฐ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด data fetching ์š”์ฒญ์ด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์— ์˜์กด๋˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ํ•œ ๋ฒˆ์— ์‹คํ–‰๋˜๋ฏ€๋กœ ์›Œํ„ฐํด ํ˜„์ƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ์œผ๋กœ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ ๊นŒ? ๊ทธ๊ฑด ์•„๋‹ˆ์—ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์— ํ•„์š”ํ•œ ๋ชจ๋“  data ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฌผ๋ก ์ด๊ณ  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค๋„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด ๋ฌธ์ œ์˜€๋‹ค. ๋˜ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๋กœ๋”ฉ๋„ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ ธ ๋ฒ„๋ ธ๋‹ค. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋œ ์‹œ์ ์—์„œ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ์ด๋ฏธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต๋ฐ›์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๋”ฉ์€ ์ ˆ๋Œ€ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ ์ฝ”๋“œ

์‚ฌ์‹ค ์œ„ ์ฐธ๊ณ  ์ฝ”๋“œ์—์„œ๋Š” Promise.all()์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๊ตณ์ด Promise.all()์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋”ฐ๋กœ fetching ์š”์ฒญ์„ ๋‚˜๋ˆ„์–ด๋„ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋”ฐ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ์™€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ์ ์  ์–ด๋ ค์›Œ์ง„๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์ข€ ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์„ ์›ํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ suspense๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค.

suspense์˜ ์—ญํ• 

suspense์˜ ์—ญํ• ์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž.

โœจ 1. ๋ชจ๋“  ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ ๋„ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์•ž์„œ fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๋ณด์ž.

data fetching ์š”์ฒญ -> data ์‘๋‹ต -> ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง

์ด ๊ณผ์ •์„ ์ข€ ๋” ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

data fetching ์š”์ฒญ -> ๋กœ๋”ฉ์ค‘ UI ๋ Œ๋”๋ง -> data ์‘๋‹ต -> ์ปดํฌ๋„ŒํŠธ์— ์‘๋‹ต ๋ฐ˜์˜

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์—์„œ suspense๋Š” ์š”์ฒญ ์งํ›„ ์š”์ฒญ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

data fetching ์š”์ฒญ -> suspense ํ•˜์œ„์˜ ์ปดํฌ๋„ŒํŠธ์— ์š”์ฒญ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜์˜ -> suspense์— ์˜ํ•ด ๋กœ๋”ฉ UI ๋ Œ๋” -> ์š”์ฒญ ๋ฆฌ์†Œ์Šค๋กœ data ์‘๋‹ต์ด ๋“ค์–ด์˜ด -> ์ปดํฌ๋„ŒํŠธ์— ์‘๋‹ต ๋ฐ˜์˜

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์š”์ฒญ ๋ฆฌ์†Œ์Šค๋Š” Promise์˜ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค. data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์ธ๋ฐ fetch API๋กœ ๋ชจ๋ฐฉํ•œ ํ˜•ํƒœ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

์ด๋Ÿฐ ๊ตฌ์กฐ๋กœ ๋ฐ”๋€Œ๋ฉด fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ชจ๋“  data ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ ค์•ผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. fetching ์š”์ฒญ ์งํ›„ ์‘๋‹ต ๋„์ฐฉ ์—ฌ๋ถ€์™€๋Š” ์ƒ๊ด€์—†์ด ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœจ 2. ๊ฒฝ์Ÿ ์ƒํƒœ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

suspense๋Š” data fetching์— ์˜ํ•œ ๊ฒฝ์Ÿ ์ƒํƒœ(Race Condition) ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

์šฐ์„  ๊ฒฝ์Ÿ ์ƒํƒœ๋ผ๋Š” ์šฉ์–ด๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž. ์œ„ํ‚ค๋ฐฑ๊ณผ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

๊ณต์œ  ์ž์›์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ๋•Œ ์ ‘๊ทผ์˜ ํƒ€์ด๋ฐ์ด๋‚˜ ์ˆœ์„œ ๋“ฑ์ด ๊ฒฐ๊ณผ๊ฐ’์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ

๊ทธ๋ ‡๋‹ค๋ฉด javascript ํ™˜๊ฒฝ์—์„œ ๊ฒฝ์Ÿ ์ƒํƒœ๋ž€ ๋ฌด์—‡์ผ๊นŒ? ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…(fetching response)์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์˜ DOM ๊ฐ์ฒด์— ๋ฐ˜์˜๋˜๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

  • ๋ฏธํ‚ค, ์ฃผ๋ชจ, ์‹ฌ๋ฐ”, ํŒŒ๋…ธ, ์นด์ผ 5๊ฐœ์˜ ๋ฒ„ํŠผ์ด ์žˆ๊ณ  ๊ฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฐ ํฌ๋ฃจ์— ๋Œ€ํ•œ ํ”„๋กœํ•„์„ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•œ๋‹ค.
  • ํ”„๋กœํ•„ ์š”์ฒญ ์‘๋‹ต์„ ์•ฑ์ด ๋ฐ›์œผ๋ฉด ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ปดํฌ๋„ŒํŠธ์— ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ๋น ๋ฅธ ์†๋„๋กœ ๋ˆ„๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ณผ์—ฐ ๋งˆ์ง€๋ง‰์— ๋ˆ„๋ฅธ ๋ฒ„ํŠผ๊ณผ ์ปดํฌ๋„ŒํŠธ์˜ ์ •๋ณด๋Š” ์ผ์น˜ํ• ๊นŒ? ์•„๋งˆ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ˆ„๋ฅธ ๋ฒ„ํŠผ์ด ๋ฏธํ‚ค ๋ฒ„ํŠผ์ด๋ผ๊ณ  ํ•ด๋„ ์ฃผ๋ชจ์˜ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์™œ ๋ฐœ์ƒํ• ๊นŒ? ๊ทธ ์ด์œ ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ํ”„๋กœํ•„ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋„์ฐฉํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์— ๋ฐ˜์˜๋  ๊ฒƒ์ด๋ผ๋Š” ์ž˜๋ชป๋œ ๊ฐ€์ •์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. A ์š”์ฒญ์ด B ์š”์ฒญ๋ณด๋‹ค ๋จผ์ € ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด A ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋จผ์ € ๋„์ฐฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ€์ •์€ ์ž˜๋ชป๋˜์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ suspense๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ. suspense๋Š” state ์„ค์ • ์‹œ๊ธฐ๋ฅผ ๋ฐ”๊พธ์–ด ์ด๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

์ด์ „์˜ ์ฝ”๋“œ๋Š” A ํ”„๋กœํ•„ ์š”์ฒญ -> ๋กœ๋”ฉ UI ๋ Œ๋” -> A ํ”„๋กœํ•„ ์‘๋‹ต -> <Profile />์— ์‘๋‹ต ๋ฐ˜์˜์˜ ์ˆœ์„œ์˜€๋‹ค๋ฉด suspense๋Š” ์ด ๊ณผ์ •์„ A ํ”„๋กœํ•„ ์š”์ฒญ -> <Profile />์— A ํ”„๋กœํ•„ ์š”์ฒญ ๋ฆฌ์†Œ์Šค ๋ฐ˜์˜ -> suspense์— ์˜ํ•ด A ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๋”ฉ UI ๋ Œ๋” -> ์š”์ฒญ ๋ฆฌ์†Œ์Šค๋กœ A ํ”„๋กœํ•„ ์‘๋‹ต์ด ๋“ค์–ด์˜ด -> <Profile />์— ์‘๋‹ต ๋ฐ˜์˜์œผ๋กœ ๋ฐ”๊พผ๋‹ค.

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

suspense๋Š” ์ด๋ฅผ ํ†ตํ•ด ๊ฒฝ์Ÿ ์ƒํƒœ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ” suspense์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๊ฑฐ์˜ ๋ฌด์กฐ๊ฑด data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ suspense๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ช‡ ๊ฐ€์ง€ ๋ณด๋„๋ก ํ•˜์ž.

Relay

graphQL์— ์˜์กด์ ์ธ data fetching ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

ํŽ˜์ด์Šค๋ถ์—์„œ๋Š” suspense๋ฅผ Relay์™€ ํ•จ๊ป˜ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Relay ์™ธ์˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ suspense๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์›ํ™œํžˆ ๋™์ž‘ํ• ์ง€ ์žฅ๋‹ดํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋งŒ์•ฝ suspense๋ฅผ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŽ˜์ด์Šค๋ถ์€ Relay์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.

๋งŒ์•ฝ graphQL์— ์ต์ˆ™ํ•˜๊ณ  suspense ๊ธฐ๋Šฅ์„ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด Relay๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•  ๊ฒƒ์ด๋‹ค.

SWR

Data Fetching์„ ์œ„ํ•œ react ํ›… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ SWR๋„ ์‹œํ—˜์ ์œผ๋กœ suspense๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ„๋žตํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

import { Suspense } from 'react'
import useSWR from 'swr'

function Profile () {
  const { data } = useSWR('/api/user', fetcher, { suspense: true })
  return <div>hello, {data.name}</div>
}

function App () {
  return (
    <Suspense fallback={<div>loading...</div>}>
      <Profile/>
    </Suspense>
  )
}

useSWR์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ž๋กœ suspense: true๋ฅผ ์ „๋‹ฌํ•จ์œผ๋กœ์จ suspense ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์„ค์ •์œผ๋กœ suspense ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ ์™ธ suspense๋ฅผ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค

๐Ÿ’• ๋งˆ๋ฌด๋ฆฌ

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ์— ๋Œ€ํ•œ ์ฃผ์ œ๋กœ ์•„์ง ์‹œํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด์ง€๋งŒ React 18์—์„œ ์ถ”๊ฐ€๋  ๊ธฐ๋Šฅ์ธ suspense์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค. ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค ๋ณด๋‹ˆ ๋น„๋™๊ธฐ ๋™์ž‘์ด ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š”๊ฐ€์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์€ data fetching๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค. suspense๋ฅผ ํ†ตํ•ด ์ด ๊ณผ์ •์„ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข€ ๋” ์พŒ์ ํ•œ ๊ฒฝํ—˜์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ 2ํŽธ์—์„œ๋Š” ์ด๋ฅผ ์ข€ ๋” ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” concurrent mode์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด๋‹ค.

์ฐธ๊ณ