์•ฑ์ฒ˜๋Ÿผ ์šฐ์•„ํ•œ ํ™”๋ฉด์ „ํ™˜์„ ์œ„ํ•œ ์›น ๊ฐœ๋ฐœ์ž์˜ ๋ฐœ๋ฒ„๋‘ฅ

NaHCoH
  • #react
  • #modal
  • #stackview
  • #portal

์•ˆ๋…•ํ•˜์„ธ์š”. ๋…ธ๋จธ์Šค ํ”„๋ก ํŠธ์—”๋“œ ํŒ€ ํ™ฉํ˜ธ์ฐฌ์ž…๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ €ํฌ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ๋ชจ๋‹ฌ ์ฒ˜๋ฆฌ์™€ UI ์ „ํ™˜ ๋ฐฉ์‹์„ ์‹คํ—˜ํ•˜๊ณ  ์ ์šฉํ•ด ์™”์œผ๋ฉฐ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ”„๋กฌ ์ฑ„๋„์ด ์•ฑ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ฐœ๋ฐœ์  ๊ณ ๋ฏผ๊ณผ ์‹œ๋„๋ฅผ ๊ฑฐ์ณค๋Š”์ง€ ๊ทธ ๊ณผ์ •์„ ๊ณต์œ ๋“œ๋ฆฌ๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ๊ณผ ์›น์˜ ์ฐจ์ด?

๋ชจ๋‹ฌ ๋ฐฉ์‹์„ ์ด์•ผ๊ธฐํ•˜๊ธฐ ์ „์—, ๋จผ์ € ์™œ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์•ฑ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๋ฏผํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฐ˜๋ฉด ์›น์€ ๋ณธ์งˆ์ ์œผ๋กœ history๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ ์ด๋™์ด ์ฃผ๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ํ™”๋ฉด ์ „ํ™˜ ์‹œ ์ˆœ๊ฐ„์ ์œผ๋กœ ์ „์ฒด๊ฐ€ ๊ฐฑ์‹ ๋˜๊ฑฐ๋‚˜, ์ „ํ™˜ ํšจ๊ณผ๊ฐ€ ์—†์–ด์„œ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์•ฑ์— ๋น„ํ•ด ๋‹ค์†Œ ๋š ๋Š๊ธฐ๋Š” ๋“ฏํ•œ ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. SPA ๊ตฌ์กฐ๋กœ๋„ ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์•ฑ๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ ๊ฒฝํ—˜์„ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ UI/UX ์„ค๊ณ„์™€ ๊ธฐ์ˆ ์  ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€?

ํŽ˜์ด์ง€ ์ด๋™

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

์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €

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

๋ชจ๋‹ฌ

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

์‚ฌ์‹ค ์ €ํฌ๊ฐ€ ๋ชจ๋‹ฌ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ณ ๋‚œ์ด ์žˆ์—ˆ๋Š”๋ฐ์š”, ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์—์„œ ์ œ๊ณตํ•˜๋Š”๊ฒƒ ๊ฐ™์€ ๋ฐ”ํ…€์‹œํŠธ

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

๋ชจ๋‹ฌ์ด ์‚ฌ๋ผ์ง€๋Š” ์‹œ์ ์—์„œ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ

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

๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” ๋ชจ๋‹ฌ์˜ ํƒ€์ž…(Dialog, Vaul ๋“ฑ)๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, ๋ชจ๋‹ฌ์˜ ์ƒํƒœ ์ž์ฒด๋ฅผ mount, open, closing์˜ 3๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

โœ… mount
- open() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์šฐ์„  ๋ชจ๋‹ฌ์€ mount ์ƒํƒœ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
- ์ด๋•Œ ๋ชจ๋‹ฌ์€ DOM์— ๋ Œ๋”๋ง๋˜๊ธด ํ•˜์ง€๋งŒ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋„๋ก ์ˆจ๊ฒจ์ง„ ์œ„์น˜์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

{  
        id: modalId,  
        ...newModal,  
        state: 'mount'  
    }  
]);

โœ… open
- requestAnimationFrame์„ ํ™œ์šฉํ•ด ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ open ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
- ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์ง€์…˜ ์‹œ์ž‘์ ์ด ๋ณด์žฅ๋˜๋ฉฐ, ๋ชจ๋‹ฌ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

requestAnimationFrame(() => {  
    // ๋ชจ๋‹ฌ์„ ์—ฐ๋‹ค  
    setModalStack((old) => old.map((modal) => (modal.id === modalId ? { ...modal, state: 'open' } : modal)));  
});

โœ… closing
- close()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋ฐ”๋กœ DOM์—์„œ ์ œ๊ฑฐ(unmount)ํ•˜์ง€ ์•Š๊ณ , ๋จผ์ € ์ƒํƒœ๋ฅผ closing์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
- ๋ชจ๋‹ฌ์€ ๋‹ซํžˆ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ , ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚˜๋Š” ์‹œ์ ์— ๋งž์ถฐ ์‹ค์ œ๋กœ unmount ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
- ์ด ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ „ํ™˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋ฉด์„œ, ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ฆฌ๋ Œ๋”๋ง ๋ถ€๋‹ด๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

setModalStack((old) => old.map((modal) => (modal.id === targetId ? { ...modal, state: 'closing' } : modal)));

setTimeout(() => {  
    setModalStack((old) => old.filter((modal) => modal.id !== targetId));  
}, modal.duration);

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

ํฌํƒˆ๋กœ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ

์•ž์„œ ์˜ˆ์‹œ๋กœ ๋ณด์—ฌ๋“œ๋ฆฐ ์˜์ƒ ์† ๋ชจ๋‹ฌ ๋ฐฉ์‹์€ ์ €ํฌ ๋‚ด๋ถ€์—์„œ๋Š” โ€œ์Šคํƒ๋ทฐ(StackView)โ€œ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” portal์„ ํ™œ์šฉํ•ด ๋ชจ๋‹ฌ์ด ์‹ค์ œ DOM ํŠธ๋ฆฌ์ƒ์—์„œ๋Š” <body>์˜ ์ž์‹ ์š”์†Œ๋กœ ๋ Œ๋”๋ง๋˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์—์„œ๋Š” ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ํ•จ๊ป˜ ํฌํ•จ๋˜๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ์ดˆ๊ธฐ์—๋Š” ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋˜๋ฉด์„œ ์น˜๋ช…์ ์ธ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ: ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง โ†’ ๋ชจ๋‹ฌ ๊ฐ•์ œ ์ข…๋ฃŒ
์–ด๋А ๋‚ , ๋ชจ๋‹ฌ ๋‚ด์—์„œ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์šฐ์—ฐํžˆ ๋ชจ๋‹ฌ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด
- ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋จ โ†’ ์ž์‹ ์ปดํฌ๋„ŒํŠธ(๋ชจ๋‹ฌ ํฌํ•จ)๋„ ๋ฆฌ๋ Œ๋”๋ง
- React์˜ ์ƒํƒœ ์ดˆ๊ธฐํ™” ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์žฌ์ƒ์„ฑ์œผ๋กœ ์ธํ•ด
- ํ™”๋ฉด์— ์žˆ๋˜ ๋ชจ๋‹ฌ์ด ๊ฐ‘์ž๊ธฐ ์‚ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค
์ฆ‰, portal๋กœ๋Š” ๋ถ„๋ฆฌ๋˜์–ด ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ์—์„œ๋Š” ๋ถ€๋ชจ์˜ ์˜ํ–ฅ์—์„œ ์ž์œ ๋กญ์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด์ฃ .

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ชจ๋‹ฌ์˜ ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์Šคํƒ๋ทฐ ๋ชจ๋‹ฌ์„ ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์—์„œ โ†’ ์•ฑ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ค‘์•™ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
- ์‹ค์ œ ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ๋Š” ์ตœ์ƒ์œ„์—์„œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋ Œ๋”๋ง๋˜๊ณ , ๊ฐ์ข… props๋‚˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ฃผ์ž…
- ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋ชจ๋‹ฌ์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์—ˆ๊ณ , ์ด์Šˆ๋„ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

 const StackViewRenderer = () => {
     const [stackviewModal] = useAtom(stackviewModalAtom);
 
     const modals = stackviewModal.map((modal) => (
         <ModalBase key={modal.id} state={modal.state}>
             {modal.props.children}
         </ModalBase>
     ));
 
     const portalRoot = document.body;
     return portalRoot ? createPortal(modals, portalRoot) : null;
 };

์ด๋Ÿฐ ์ž‘์—…๋“ค์˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ๊ฒŒ ํ”„๋กฌ ์‚ฌ์šฉ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ ํ”„๋กฌ ์ฑ„๋„์˜ ํ™”๋ฉด ์ด๋™ ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

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

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ