๐Ÿง  React Portal๋กœ ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ์ด์œ : ๊ฒ‰๋งŒ ๋ชจ๋‹ฌ์ด๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ 

์†ก์—ฐ์ง€ยท2025๋…„ 4์›” 23์ผ
0

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋ชฉ๋ก ๋ณด๊ธฐ
21/32
post-thumbnail

React ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ๋ชจ๋‹ฌ์€ ์ •๋ง ์ž์ฃผ ์“ฐ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ๋‹จ์ˆœํžˆ "๋ชจ๋‹ฌ UI"๋งŒ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์ง„์งœ '๋ชจ๋‹ฌ๋‹ต๊ฒŒ' ๋™์ž‘ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋”๋ผ๊ณ ์š”.

์ตœ๊ทผ ์ œ๊ฐ€ ๊ฒช์—ˆ๋˜ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ๋“œ๋ฆฌ๋ฉฐ,

React Portal์ด ์™œ ํ•„์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด ๋ฐฉ์‹์—์„œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽฏ ๋ฌธ์ œ ์ƒํ™ฉ: ๋ชจ๋‹ฌ์ด ์ƒ๋‹จ์„ ๋ชป ๋ฎ์–ด์š”?


๋Œ€ํ‘œ์ž ์„ ํƒ ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ฉด์„œ,

๊ฐ™์€ Modal ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ๋„, ์–ด๋–ค ๋ชจ๋‹ฌ์€ ์ •์ƒ์ ์œผ๋กœ ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋ฎ๊ณ , ์–ด๋–ค ๋ชจ๋‹ฌ์€ ์ƒ๋‹จ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋šซ๋ฆฌ๋Š” ํ˜„์ƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‹ฌ ์ข…๋ฅ˜๋™์ž‘ ์—ฌ๋ถ€
โœ… ๋ถ€์„œ ์„ ํƒ ๋ชจ๋‹ฌ์ •์ƒ ์ž‘๋™ (์ „์ฒด ์˜ค๋ฒ„๋ ˆ์ด)
โŒ ์‚ฌ์šฉ์ž ์„ ํƒ ๋ชจ๋‹ฌ์ƒ๋‹จ ๋ฉ”๋‰ด ๋šซ๋ฆผ ํ˜„์ƒ ๋ฐœ์ƒ

๋ถ„๋ช…ํžˆ ๊ฐ™์€ ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์™œ ๊ทธ๋Ÿด๊นŒ?


๐Ÿ” ์›์ธ ๋ถ„์„: DOM ๊ณ„์ธต๊ณผ z-index์˜ ๋ฐฐ์‹ 

๋ฌธ์ œ๋Š” ๋ชจ๋‹ฌ์ด ๋ Œ๋”๋ง๋˜๋Š” ์œ„์น˜์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์„ ํƒ ๋ชจ๋‹ฌ์€ form ๋‚ด๋ถ€ ๊นŠ์€ ์œ„์น˜์—์„œ ๋ Œ๋”๋ง๋˜์—ˆ๊ณ ,

์ด ๊ฒฝ์šฐ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ position: relative, overflow: hidden, z-index ์„ค์ •์ด ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์‹œ๊ฐ์ ์œผ๋กœ๋Š” '๋ชจ๋‹ฌ์ฒ˜๋Ÿผ' ๋ณด์—ฌ๋„,
์‹ค์ œ๋กœ๋Š” ์ƒ์œ„ DOM ๊ตฌ์กฐ์— ๊ฐ‡ํžŒ, ์ œ์•ฝ์ด ๋งŽ์€ ๋ชจ๋‹ฌ์ด์—ˆ๋˜ ๊ฑฐ์ฃ .


๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: React Portal ๋„์ž…

React์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์‹์ ์ธ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

React Portal: ๋ถ€๋ชจ DOM ๋ฐ”๊นฅ์— ์ž์‹์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

โœจ React Portal์ด ์ข‹์€ ์ด์œ 

์žฅ์ ์„ค๋ช…
โœ… DOM ๊ตฌ์กฐ์™€ ์ƒ๊ด€์—†์ด ์ตœ์ƒ๋‹จ ๋ Œ๋”๋งdocument.body ์•„๋ž˜์— ์ง์ ‘ ์‚ฝ์ž…๋˜๋ฏ€๋กœ ๋ถ€๋ชจ ๊ตฌ์กฐ ๋ฌด๊ด€
โœ… ์™„์ „ํ•œ ์˜ค๋ฒ„๋ ˆ์ด ๊ตฌํ˜„ ๊ฐ€๋Šฅposition: fixed๋กœ ํ™”๋ฉด ์ „์ฒด ๋ฎ๊ธฐ ์™„๋ฒฝ ๋ณด์žฅ
โœ… z-index ์ถฉ๋Œ ์ตœ์†Œํ™”ํŠน์ • ํŠธ๋ฆฌ ๋‚ด z-index ์ˆœ์„œ ๋ฌธ์ œ ํšŒํ”ผ ๊ฐ€๋Šฅ
โœ… ๋ชจ๋‹ฌ, ํ† ์ŠคํŠธ, ๋“œ๋กญ๋‹ค์šด ๋“ฑ์— ์ ํ•ฉ์‹œ๊ฐ์  ๋…๋ฆฝ์„ฑ์ด ์ค‘์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์ตœ์ 

๐Ÿ”ง ์ ์šฉ ์˜ˆ์‹œ ์ฝ”๋“œ

tsx
๋ณต์‚ฌํŽธ์ง‘
return ReactDOM.createPortal(modalContent, document.body);

์œ„ ํ•œ ์ค„๋งŒ์œผ๋กœ ๋ชจ๋‹ฌ์€ ์ด์ œ ์–ด๋–ค ๋ถ€๋ชจ ๊ตฌ์กฐ์™€๋„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.


๐Ÿ›  ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์š”์•ฝ

ํ˜„์ƒ์›์ธํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
๋ชจ๋‹ฌ์ด ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฅผ ๊ฐ€๋ฆฌ์ง€ ๋ชปํ•จ๋‚ด๋ถ€ DOM์— ๋ Œ๋”๋ง โ†’ ๋ถ€๋ชจ์˜ CSS ์˜ํ–ฅReact Portal๋กœ DOM ๋ถ„๋ฆฌ
์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ์ „์ฒด ํ™”๋ฉด์„ ๋ฎ์ง€ ์•Š์Œ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ ๊ธฐ์ค€์ด ๋˜๋Š” absolute ๊ตฌ์กฐ ๋•Œ๋ฌธfixed + Portal ๊ตฌ์กฐ๋กœ ๊ต์ฒด
์–ด๋–ค ๋ชจ๋‹ฌ์€ ๋˜๊ณ  ์–ด๋–ค ๋ชจ๋‹ฌ์€ ์•ˆ ๋˜๋Š” ํ˜„์ƒ ๋ฐœ์ƒDOM ์œ„์น˜์— ๋”ฐ๋ผ ๋ชจ๋‹ฌ์ด ๋ Œ๋”๋ง๋˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ฌ๋ž๊ธฐ ๋•Œ๋ฌธ๋ชจ๋“  ๋ชจ๋‹ฌ์„ Portal ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์ผ

๐Ÿงพ ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

React์—์„œ ๋ชจ๋‹ฌ, ํ† ์ŠคํŠธ, ๋“œ๋กญ๋‹ค์šด ๋“ฑ์€ ๋‹จ์ˆœํ•œ UI ์š”์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ์œ„์น˜์™€ ๋ ˆ์ด์–ด ๊ตฌ์กฐ๊นŒ์ง€ ๊ณ ๋ คํ•œ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ด๋ฅผ ๊ฐ€์žฅ ์•ˆ์ •์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ React Portal์ž…๋‹ˆ๋‹ค.

์ €์ฒ˜๋Ÿผ "๋ชจ๋‹ฌ์ด ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋ฎ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ"๋ฅผ ๊ฒช์œผ์…จ๋‹ค๋ฉด,

๋ชจ๋‹ฌ ๊ตฌ์กฐ๋ฅผ ์ ๊ฒ€ํ•˜์‹œ๊ณ , Portal ๋„์ž…์„ ๊ณ ๋ คํ•ด๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


๐Ÿ“Œ ๋ค์œผ๋กœ: Portal ์—†์ด ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ๊ณ ์ƒํ•˜๋Š” ๋ถ„๋“ค์—๊ฒŒ

โ€œ์™œ ๊ฐ™์€ ๋ชจ๋‹ฌ์ธ๋ฐ ํ•˜๋‚˜๋Š” ๋˜๊ณ  ํ•˜๋‚˜๋Š” ์•ˆ ๋ผ?โ€

์ด ์งˆ๋ฌธ์— ๋‹ต์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ˆœ๊ฐ„,

React๋ฅผ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๊ฒŒ ๋˜์‹  ๊ฒ๋‹ˆ๋‹ค. ๐Ÿ˜‰

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์Ÿˆ!!

0๊ฐœ์˜ ๋Œ“๊ธ€