์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ค ๋ณด๋ฉด ๋ชจ๋ฌ, ํดํ, ๋๋กญ๋ค์ด ๋ฑ UI ์์๋ค์ด ํญ์ ์ต์๋จ์ ๋ ์์ด์ผ ํ ๋๊ฐ ๋ง์ต๋๋ค. ๊ฐํน ๊ณต๋ค์ฌ ์คํ์ผ๋งํ ์ปดํฌ๋ํธ๊ฐ ๋ง์ ์ฌ์ฉํ๋ ์คํ์ผ ๊ณ์ธต ๋๋ฌธ์ ๋ชจ์์ด ์๋์ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ๊ฒ์ ๋ค๋ค ๊ฒฝํ ํด๋ณด์ จ์ํ ๋ฐ์. ์ด๋ฌํ ์์๋ค์ ์ค๊ณํ ๋ ๋ถ๋ชจ ์์์ ์คํ์ผ์ด๋ ์์น๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ๊ณจ์น ์ํ์ง๋ ์๊ฐ์ด ์ข ์ข ์๊ธฐ์ฃ ๐คฆ ์ด๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์๋ ๊ธฐ๋ฅ์ด ๋ฐ๋ก React Portal์ ๋๋ค. Portal์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ React ํธ๋ฆฌ์์ ๋ฒ์ด๋ ํน์ DOM ์์น์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ React Portal์ด๋ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค ๐งโ๐ป
React Portal์ React ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ณ๋์ DOM ์์น์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก React์์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ DOM ํธ๋ฆฌ ์์์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ฐ๋ผ์ ๋ถ๋ชจ์ ์์ ์ปดํฌ๋ํธ๋ ํ๋ฉด ์์์ ๊ณ์ธต์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋๋๋ฐ์๐จโ๐ฉโ๐งโ๐ฆ ํ์ง๋ง Portal์ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ ผ๋ฆฌ์ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉด์๋, ์ค์ DOM ํธ๋ฆฌ์์๋ ์์ ํ ๋ณ๋์ ์์น์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ฌ, ๋๋กญ๋ค์ด, ํดํ ๊ฐ์ UI ์์๊ฐ ํ๋ฉด์์ ๋ ๋ฆฝ๋ ์์น์ ๋ํ๋ ์ ์์ต๋๋ค.
React์์ Portal์ ์ฌ์ฉํ๋ ค๋ฉด ReactDOM.createPortal
๋ฉ์๋๋ฅผ ํธ์ถํด์ผํฉ๋๋ค. ์ด ๋ฉ์๋๋ ๋ ๋๋งํ ์ปดํฌ๋ํธ์ ๋ ๋๋ง๋ DOM ๋
ธ๋๋ฅผ props
๋ก ๋ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ฌ์ portal-root
๋ผ๋ DOM ๋
ธ๋์ ๋ ๋๋งํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
import ReactDOM from 'react-dom';
function Modal({ children }) {
return ReactDOM.createPortal(
<div className="modal">{children}</div>,
document.getElementById('portal-root')
);
}
์ด๋ ๊ฒ ํ๋ฉด Modal ์ปดํฌ๋ํธ๋ React ํธ๋ฆฌ์์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํด ์์ง๋ง, ์ค์ DOM ๊ตฌ์กฐ์์๋ portal-root
์ ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ์ ์คํ์ผ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ชจ๋ฌ์ ๋
๋ฆฝ์ ์ผ๋ก ํ๋ฉด์ ํ์ํ ์ ์์ต๋๋ค.
์์ ์ค๋ช
๋๋ฆฐ ๋ฐ์ ๊ฐ์ด, Portal์ ReactDOM.createPortal
์ ํตํด React ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋
ผ๋ฆฌ์ ๊ตฌ์กฐ์ ์ค์ DOM ์์น๋ฅผ ๋ถ๋ฆฌํ์ฌ, ์ง์ ํ DOM ๋
ธ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ก ์ธํด ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ-์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์๋ ์ค์ DOM ํธ๋ฆฌ์์๋ ๋
๋ฆฝ๋ ์์น์ ๋ ๋๋ง๋ ์ ์์ต๋๋ค.
Portal๋ก ๋ ๋๋ง๋ ์ปดํฌ๋ํธ๋ ์ฌ์ ํ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ props
์ context
์ ์ ๊ทผํ ์ ์์ด, React์ ๋
ผ๋ฆฌ์ ๊ณ์ธต ๊ตฌ์กฐ ๋ด์์ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค. ๋ํ, Portal๋ก ๋ ๋๋ง๋ ์์๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋ฐ์ํ๋ฏ๋ก, portal-root์ ๋ ๋๋ง๋ ๋ชจ๋ฌ์ ํด๋ฆญ ์ด๋ฒคํธ๋ ๋ฌผ๋ฆฌ์ ์ธ DOM ๊ตฌ์กฐ์ ๊ด๊ณ์์ด ์์ ์ปดํฌ๋ํธ๋ก ์ ํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Portal์ ๋ฌผ๋ฆฌ์ DOM ํธ๋ฆฌ์์๋ ๋
๋ฆฝ์ ์ธ ์์น์ ์กด์ฌํ๋๋ผ๋, React์ ๋
ผ๋ฆฌ์ ํธ๋ฆฌ ์์์ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
์ด๋ฌํ Portal์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋ ์ด์์ ๋
๋ฆฝ์ฑ์
๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด๋ overflow
์ค์ ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ , ๋ชจ๋ฌ, ๋๋กญ๋ค์ด, ํดํ ๊ฐ์ UI ์์๋ฅผ ํ๋ฉด ์ต์๋จ์ ๋
๋ฆฝ์ ์ผ๋ก ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ถ๋ชจ ์์์ overflow: hidden
์ด ์ค์ ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ DOM ํธ๋ฆฌ ๊ตฌ์กฐ์์๋ ์์ ์์๊ฐ ํ๋ฉด ๋ฐ์ผ๋ก ๋ณด์ด์ง ์์ง๋ง, Portal์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ ์ฝ์ ๋ฐ์ด๋์ด ํญ์ ์ํ๋ ์์น์ UI ์์๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๋ํ, Portal์ ๋ณต์กํ UI์์๋ ๊ตฌ์กฐ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋๋กญ๋ค์ด ๋ฉ๋ด๋ ๋ชจ๋ฌ์ฒ๋ผ DOM ํธ๋ฆฌ ์ต์๋จ ๋ ์ด์ด์ ์์นํด์ผ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ์ DOM ๊ตฌ์กฐ์ ๋ฌด๊ดํ๊ฒ ์ฝ๊ฒ ๋ฐฐ์นํ ์ ์์ด, ๋ ์ด์์์ ์ผ๊ด์ฑ์ ํด์น์ง ์์ผ๋ฉด์๋ ์์ ๋ ์ด์ด์์ ์์ ๋กญ๊ฒ ๋์ํ๋๋ก ํ ์ ์์ต๋๋ค.
React Portal์ ๋ชจ๋ฌ, ๋๋กญ๋ค์ด, ํดํ ๋ฑ ํน์ UI ์์๊ฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด๋ ๋ ์ด์์์ ์ ์ฝ๋ฐ์ง ์๊ณ ํ๋ฉด์ ๋ ๋ฆฝ์ ์ผ๋ก ํ์๋ ์ ์๋๋ก ๋์์ค๋๋ค. Portal์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ UI์์๋ ๊ตฌ์กฐ์ ์ธ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์, ์์ ๋ ์ด์ด์ ์์ ๋กญ๊ฒ ๋ฐฐ์นํ ์ ์๋ ์ ์ฐ์ฑ์ ํ๋ณดํ ์ ์์ฃ . ๋ํ, React์ ๋ ผ๋ฆฌ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ฏ๋ก props์ context๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ฐ๊ฒฐ์ฑ์ ์์ง ์์ต๋๋ค. ์ด๋ฌํ ํน์ง์ ๋ฐํ์ผ๋ก, Portal์ ๋ณต์กํ UI๋ฅผ ๋ณด๋ค ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์๋๋ก ํด์ฃผ๋ ์ค์ํ ๋๊ตฌ์ ๋๋ค. Portal์ผ๋ก ์ฌ๋ฌ๋ถ์ ๋ชจ๋ฌ์ ์์ ๋ฅผ ์ ๋ฌผํด๋ณด์ธ์ ! ๐งโโ๏ธ