๐Ÿ“Œ ์ž‘์„ฑ์ž ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
OS: Mac OS
Tool: Visual Studio Code

1 ๋ถ„ ์†Œ์š”

til

ModalPortal

ModalPortal์ด๋ž€?

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

ModalPortal์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋… `ModalPortal`์€ ๋ชจ๋‹ฌ ์ปจํ…์ธ ๋ฅผ ๋ณ„๋„์˜ DOM ๋ ˆ์ด์–ด์— ๋ Œ๋”๋งํ•˜๋„๋ก ๋„์™€์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋‹ฌ์ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ๋ถ„๋ฆฌ๋˜์–ด ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ReactDOM.createPortal() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‹ฌ ์ปจํ…์ธ ๋ฅผ ๋ณ„๋„์˜ DOM ๋…ธ๋“œ์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ ModalPortal์„ ์‚ฌ์šฉํ•œ ์ด์œ 

til

์œ„ ํ™”๋ฉด์—์„œ ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ ์ œํ’ˆ์„ ํด๋ฆญํ•˜๋ฉด ์ œํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€ ๋ชจ๋‹ฌ์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ ๋ชจ๋‹ฌ ์ฐฝ์˜ ์œ„์น˜๊ฐ€ ์›ํ•˜๋Š” ์œ„์น˜์— ๊ณ ์ •๋˜๊ฒŒ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„ ModalPortal์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

import ReactDOM from 'react-dom';

function ModalPortal({ children }: { children: React.ReactNode }) {
  const modalRoot = document.getElementById('modal-root')!;
  return ReactDOM.createPortal(children, modalRoot);
}

export default ModalPortal;

ReactDOM ์ž„ํฌํŠธ:

  • ReactDOM์€ React์˜ Portal ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž„ํฌํŠธ

ModalPortal ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ:

  • ModalPortal ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋‹ฌ ์ปจํ…์ธ ๋ฅผ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์— ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• 

  • children์€ ModalPortal ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋œ ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ

modalRoot ์š”์†Œ ์„ ํƒ:

  • modalRoot๋Š” HTML ๋ฌธ์„œ ๋‚ด์—์„œ ๋ชจ๋‹ฌ ์ปจํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•  ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • modal-root๋ผ๋Š” id๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๊ฐ€ HTML ๋ฌธ์„œ ๋‚ด์— ์žˆ๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ์ด ์š”์†Œ๊ฐ€ ๋ชจ๋‹ฌ ์ปจํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•  ์œ„์น˜์ž…๋‹ˆ๋‹ค.

ReactDOM.createPortal()ํ˜ธ์ถœ:

  • ReactDOM.createPortal() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋‹ฌ ์ปจํ…์ธ ๋ฅผ ๋ Œ๋”๋ง
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ๋ Œ๋”๋งํ•  ์ปจํ…์ธ (์ž์‹ ์ปดํฌ๋„ŒํŠธ)๋ฅผ ์ „๋‹ฌ
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ๋ Œ๋”๋ง ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” DOM ๋…ธ๋“œ๋ฅผ ์ „๋‹ฌ

๐Ÿ“ƒ ์ •๋ฆฌ


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

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ