ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react dom

createPortal

dev_been94 2024. 12. 16. 17:02
728x90
๋ฐ˜์‘ํ˜•

createPortal

 

๐ŸŽฏ createPortal์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

**createPortal**์€ React์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅธ DOM ๋…ธ๋“œ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ React ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ DOM ์•ˆ์— ๋ Œ๋”๋ง๋˜์ž–์•„์š”?
  • ํ•˜์ง€๋งŒ ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€๋ชจ DOM ๋ฐ–์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ๋ Œ๋”๋งํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”.
    ์ด๋Ÿด ๋•Œ createPortal์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ• ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: ์ฐฝ๋ฌธ ๋„˜์–ด ๋ฐฐ๋‹ฌ ์Œ์‹ ๊ฑด๋„ค์ฃผ๊ธฐ

์—ฌ๋Ÿฌ๋ถ„์ด ํ”ผ์ž ๊ฐ€๊ฒŒ์—์„œ ์ผํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ๐Ÿ•

  1. ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ฐฉ์‹
    • ์ฃผ๋ฐฉ์—์„œ ๋งŒ๋“  ํ”ผ์ž๋ฅผ ์ฃผ๋ฐฉ ๋ฌธ์„ ํ†ตํ•ด ํ™€(๋ถ€๋ชจ DOM)๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ์ด๊ฒŒ React์˜ ์ผ๋ฐ˜์ ์ธ ๋ Œ๋”๋ง ๋ฐฉ์‹์ด์—์š”.
  2. createPortal์„ ์‚ฌ์šฉํ•˜๋ฉด?
    • ์ฃผ๋ฐฉ์—์„œ ๋งŒ๋“  ํ”ผ์ž๋ฅผ ์ฃผ๋ฐฉ ์ฐฝ๋ฌธ์„ ํ†ตํ•ด ๋ฐ”๊นฅ(๋‹ค๋ฅธ DOM ๋…ธ๋“œ)์— ๋ฐ”๋กœ ์ „๋‹ฌํ•ด์š”!
    • ํ”ผ์ž๋Š” ์ฃผ๋ฐฉ์—์„œ ๋งŒ๋“ค์–ด์ง€์ง€๋งŒ, ์ตœ์ข… ๋ชฉ์ ์ง€๋Š” ๋‹ค๋ฅธ ๊ณต๊ฐ„์ด ๋˜๋Š” ๊ฑฐ์ฃ .

React์˜ createPortal์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ **๋‹ค๋ฅธ DOM ๋…ธ๋“œ(์ฐฝ๋ฌธ ๋ฐ–)**์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”.

 

 

๐Ÿ› ๏ธ createPortal ์‚ฌ์šฉ๋ฒ•

createPortal์€ React์˜ ReactDOM.createPortal() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด์š”.
๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด createPortal์„ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

 

1. ๋ชจ๋‹ฌ ์ฐฝ์„ ์˜ˆ์ œ๋กœ ์•Œ์•„๋ณด๊ธฐ

๋ชจ๋‹ฌ ์ฐฝ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™”๋ฉด์˜ ์ตœ์ƒ๋‹จ์— ๋– ์•ผ ํ•˜์ž–์•„์š”?
๊ทธ๋ž˜์„œ createPortal์„ ์‚ฌ์šฉํ•ด ๋ชจ๋‹ฌ์„ ๋ถ€๋ชจ DOM ๋ฐ–์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

HTML ๊ตฌ์กฐ (index.html)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>React Portal</title>
  </head>
  <body>
    <div id="root"></div> <!-- ๋ฉ”์ธ React ์•ฑ์ด ๋ Œ๋”๋ง๋  ๊ณณ -->
    <div id="modal-root"></div> <!-- ๋ชจ๋‹ฌ์ด ๋ Œ๋”๋ง๋  DOM ๋…ธ๋“œ -->
  </body>
</html>

 

React ์ฝ”๋“œ

import React, { useState } from 'react';
import ReactDOM from 'react-dom';

// ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ
function Modal({ children, onClose }) {
  return ReactDOM.createPortal(
    <div style={modalStyles}>
      <div>
        {children}
        <button onClick={onClose}>๋‹ซ๊ธฐ</button>
      </div>
    </div>,
    document.getElementById('modal-root') // ๋ชจ๋‹ฌ์„ ๋ Œ๋”๋งํ•  DOM ๋…ธ๋“œ
  );
}

// ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ
export default function App() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div>
      <h1>React Portal ์˜ˆ์ œ</h1>
      <button onClick={() => setIsOpen(true)}>๋ชจ๋‹ฌ ์—ด๊ธฐ</button>

      {isOpen && (
        <Modal onClose={() => setIsOpen(false)}>
          <h2>๋ชจ๋‹ฌ ๋‚ด์šฉ</h2>
          <p>์ด ๋ชจ๋‹ฌ์€ createPortal๋กœ ๋ Œ๋”๋ง๋˜์—ˆ์–ด์š”!</p>
        </Modal>
      )}
    </div>
  );
}

// ๋ชจ๋‹ฌ ์Šคํƒ€์ผ
const modalStyles = {
  position: 'fixed',
  top: 0,
  left: 0,
  width: '100%',
  height: '100%',
  backgroundColor: 'rgba(0, 0, 0, 0.5)',
  display: 'flex',
  justifyContent: 'center',
  alignItems: 'center',
  color: 'white',
};

 

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. HTML์— ๋ชจ๋‹ฌ์„ ์œ„ํ•œ ๋ณ„๋„ DOM ๋…ธ๋“œ
    • index.html์— **<div id="modal-root"></div>**๋ผ๋Š” ๋ณ„๋„์˜ DOM ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”.
  2. createPortal์„ ์‚ฌ์šฉํ•œ ๋ชจ๋‹ฌ ๋ Œ๋”๋ง
    • **ReactDOM.createPortal**์€ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ Œ๋”๋งํ•  ์š”์†Œ, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ Œ๋”๋ง๋  DOM ๋…ธ๋“œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
    • ์ด ์ฝ”๋“œ์—์„œ๋Š” ๋ชจ๋‹ฌ์„ **modal-root**๋ผ๋Š” DOM์— ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ์–ด์š”.
  3. ๋ฉ”์ธ DOM๊ณผ ๋ถ„๋ฆฌ๋œ ๋ Œ๋”๋ง
    • ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ์ „ํžˆ **root**์— ๋ Œ๋”๋ง๋˜์ง€๋งŒ, ๋ชจ๋‹ฌ์€ **modal-root**์— ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ DOM ๊ตฌ์กฐ์™€ ์ƒ๊ด€์—†์ด ์ตœ์ƒ์œ„ ๋ ˆ์ด์–ด์— ๋ชจ๋‹ฌ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์ฃ .
  4. ๊ฒฐ๊ณผ
    • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ชจ๋‹ฌ ์ฐฝ์ด ํ™”๋ฉด์˜ ์ตœ์ƒ๋‹จ์— ํ‘œ์‹œ๋˜๊ณ ,
    • ๋ชจ๋‹ฌ์ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ๋ฐ–์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰

 

๐Ÿš€ createPortal์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ƒํ™ฉ

  1. ๋ชจ๋‹ฌ, ํŒ์—… ์ฐฝ
    • ๋ชจ๋‹ฌ์ด๋‚˜ ํŒ์—… ์ฐฝ์€ ํ™”๋ฉด ์ตœ์ƒ๋‹จ์— ๋– ์•ผ ํ•˜๊ณ , ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ CSS์— ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์•„์š”.
  2. ํˆดํŒ์ด๋‚˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด
    • ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋‚˜ ํˆดํŒ์ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ DOM ๋ฐ–์—์„œ ํ‘œ์‹œ๋  ๋•Œ ์‚ฌ์šฉํ•ด์š”.
  3. ์˜ค๋ฒ„๋ ˆ์ด(UI ์œ„์— ๋ฎ์–ด์”Œ์šฐ๋Š” ํ™”๋ฉด)
    • ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋ฎ๋Š” ์˜ค๋ฒ„๋ ˆ์ด๋„ ๋ถ€๋ชจ DOM ๋ฐ–์—์„œ ๋ Œ๋”๋งํ•˜๋ฉด ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.

 

๐ŸŒŸ ํ•œ ์ค„ ์š”์•ฝ

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

 

 

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

React์˜ **createPortal**์€ ํ‰์†Œ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋ชจ๋‹ฌ์ด๋‚˜ ํŒ์—…์ฒ˜๋Ÿผ ํ™”๋ฉด์˜ ๊ตฌ์กฐ๋ฅผ ๋ฒ—์–ด๋‚˜ ๋ Œ๋”๋งํ•ด์•ผ ํ•  ๋•Œ ์•„์ฃผ ์œ ์šฉํ•ด์š”.
์ด์ œ **"React๋กœ ๋ชจ๋‹ฌ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์ง€?"**๋ผ๋Š” ๊ณ ๋ฏผ์ด ์ƒ๊ธฐ๋ฉด createPortal์„ ๋– ์˜ฌ๋ ค ๋ณด์„ธ์š”!

728x90
๋ฐ˜์‘ํ˜•

'web > react dom' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

prefetchDNS  (1) 2024.12.16
preconnect  (2) 2024.12.16
hydrate  (0) 2024.12.16
findDOMNode  (0) 2024.12.16
flushSync  (0) 2024.12.16
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/01   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250