React ν¬νΈμ λν μ’ ν© κ°μ΄λλ‘, μλ λ°©μ, μ¬μ© μ¬λ‘, νμ€ μ»΄ν¬λνΈ κ³μΈ΅ ꡬ쑰 μΈλΆμμ μ½ν μΈ λ₯Ό λ λλ§νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό μ€λͺ ν©λλ€.
React ν¬νΈ: μ»΄ν¬λνΈ νΈλ¦¬ μΈλΆ λ λλ§ λ§μ€ν°νκΈ°
Reactλ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνκΈ° μν κ°λ ₯ν JavaScript λΌμ΄λΈλ¬λ¦¬μ λλ€. μ»΄ν¬λνΈ κΈ°λ° μν€ν μ²λ₯Ό ν΅ν΄ κ°λ°μλ λ μκ³ μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈλ₯Ό ꡬμ±νμ¬ λ³΅μ‘ν UIλ₯Ό λ§λ€ μ μμ΅λλ€. κ·Έλ¬λ λλ‘λ μΌλ°μ μΈ μ»΄ν¬λνΈ κ³μΈ΅ ꡬ쑰 μΈλΆμμ μμλ₯Ό λ λλ§ν΄μΌ νλλ°, React ν¬νΈμ΄ μ΄λ¬ν νμμ±μ κΉλνκ² ν΄κ²°ν©λλ€.
React ν¬νΈμ΄λ 무μμ λκΉ?
React ν¬νΈμ μμμ λΆλͺ¨ μ»΄ν¬λνΈμ DOM κ³μΈ΅ ꡬ쑰 μΈλΆμ μ‘΄μ¬νλ DOM λ Έλλ‘ λ λλ§νλ λ°©λ²μ μ 곡ν©λλ€. μ ν리μΌμ΄μ μ½ν μΈ μ λλ¨Έμ§ λΆλΆ μμ μκ°μ μΌλ‘ λνλμΌ νλ λͺ¨λ¬μ΄λ ν΄νμ λ λλ§ν΄μΌ νλ€κ³ μμν΄ λ³΄μΈμ. μ»΄ν¬λνΈ νΈλ¦¬ λ΄μ μ§μ λ°°μΉνλ©΄ CSS μΆ©λ λλ λΆλͺ¨ μμμ μν΄ μ μ©λλ μμΉ μ μ½ μ‘°κ±΄μΌλ‘ μΈν΄ μ€νμΌ λ¬Έμ κ° λ°μν μ μμ΅λλ€. ν¬νΈμ μ»΄ν¬λνΈμ μΆλ ₯μ DOMμ λ€λ₯Έ μμΉλ‘ "ν λ ν¬νΈ"ν μ μλλ‘ νμ¬ μ루μ μ μ 곡ν©λλ€.
λ€μκ³Ό κ°μ΄ μκ°ν΄ 보μΈμ. React μ»΄ν¬λνΈκ° μμ§λ§ λ λλ§λ μΆλ ₯μ΄ μ¦κ°μ μΈ λΆλͺ¨μ DOMμ μ½μ λμ§ μμ΅λλ€. λμ , (bodyμ μΆκ°λ λͺ¨λ¬ 컨ν μ΄λμ κ°μ΄) ν΄λΉ λͺ©μ μΌλ‘ νΉλ³ν μμ±ν λ€λ₯Έ DOM λ Έλλ‘ λ λλ§λ©λλ€.
React ν¬νΈμ μ¬μ©νλ μ΄μ λ 무μμ λκΉ?
λ€μμ React ν¬νΈμ μ¬μ©ν΄μΌ ν μ μλ λͺ κ°μ§ μ£Όμ μ΄μ μ λλ€.
- CSS μΆ©λ λ° ν΄λ¦¬ν λ°©μ§: μμμ μΈκΈνλ―μ΄ μμλ₯Ό κΉμ΄ μ€μ²©λ μ»΄ν¬λνΈ κ΅¬μ‘° λ΄μ μ§μ λ°°μΉνλ©΄ CSS μΆ©λμ΄ λ°μν μ μμ΅λλ€. λΆλͺ¨ μμλ λͺ¨λ¬, ν΄ν λλ κΈ°ν μ€λ²λ μ΄μ λͺ¨μμ λΆμ£Όμνκ² μν₯μ λ―ΈμΉλ μ€νμΌμ κ°μ§ μ μμ΅λλ€. ν¬νΈμ μ¬μ©νλ©΄ μ΄λ¬ν μμλ₯Ό μ μ¬μ μΈ μ€νμΌ κ°μμ μ°ννμ¬ `body` νκ·Έ(λλ λ€λ₯Έ μ΅μμ μμ) μλμ μ§μ λ λλ§ν μ μμ΅λλ€. λΆλͺ¨ μμμ `overflow: hidden`μ μ€μ νλ μ μ CSS κ·μΉμ μμν΄ λ³΄μΈμ. ν΄λΉ λΆλͺ¨ λ΄λΆμ λ°°μΉλ λͺ¨λ¬λ μ립λλ€. ν¬νΈμ μ΄ λ¬Έμ λ₯Ό νΌν μ μμ΅λλ€.
- Z-μΈλ±μ€μ λν λ λμ μ μ΄: 볡μ‘ν μ»΄ν¬λνΈ νΈλ¦¬μμ z-μΈλ±μ€λ₯Ό κ΄λ¦¬νλ κ²μ μ λͺ½μ΄ λ μ μμ΅λλ€. λͺ¨λ¬μ΄ νμ λ€λ₯Έ λͺ¨λ κ² μμ λνλλλ‘ νλ κ²μ `body` νκ·Έ μλμ μ§μ λ λλ§ν μ μμ λ ν¨μ¬ κ°λ¨ν΄μ§λλ€. ν¬νΈμ μ€ν 컨ν μ€νΈμμ μμμ μμΉλ₯Ό μ§μ μ μ΄ν μ μλλ‘ ν©λλ€.
- μ κ·Όμ± κ°μ : λͺ¨λ¬μ΄ μ΄λ¦΄ λ λͺ¨λ¬μ ν€λ³΄λ ν¬μ»€μ€κ° μλμ§ νμΈνλ κ²κ³Ό κ°μ νΉμ μ κ·Όμ± μꡬ μ¬νμ λͺ¨λ¬μ΄ `body` νκ·Έ μλμ μ§μ λ λλ§λ λ λ μ½κ² λ¬μ±ν μ μμ΅λλ€. λͺ¨λ¬ λ΄μμ ν¬μ»€μ€λ₯Ό νΈλννκ³ μ¬μ©μκ° μ€μλ‘ λ€μ μλ μμμ μνΈ μμ©νλ κ²μ λ°©μ§νλ κ²μ΄ λ μ¬μμ§λλ€.
- `overflow: hidden` λΆλͺ¨ μ²λ¦¬: μμμ κ°λ΅νκ² μΈκΈνλ―μ΄ ν¬νΈμ `overflow: hidden` 컨ν μ΄λμμ λ²μ΄λμΌ νλ μ½ν μΈ λ₯Ό λ λλ§νλ λ° λ§€μ° μ μ©ν©λλ€. ν¬νΈμ΄ μμΌλ©΄ μ½ν μΈ κ° μ립λλ€.
React ν¬νΈ μλ λ°©μ: μ€μ μμ
React ν¬νΈ μλ λ°©μμ μ€λͺ νκΈ° μν΄ κ°λ¨ν μμ λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€. ν¬νΈμ μ¬μ©νμ¬ μ½ν μΈ λ₯Ό `body` νκ·Έ μλμ μ§μ λ λλ§νλ κΈ°λ³Έ λͺ¨λ¬ μ»΄ν¬λνΈλ₯Ό λΉλν©λλ€.
1λ¨κ³: ν¬νΈ λμ λ§λ€κΈ°
λ¨Όμ ν¬νΈ μ½ν μΈ λ₯Ό λ λλ§ν DOM μμλ₯Ό λ§λ€μ΄μΌ ν©λλ€. μΌλ°μ μΈ λ°©λ²μ νΉμ IDκ° μλ `div` μμλ₯Ό λ§λ€κ³ `body` νκ·Έμ μΆκ°νλ κ²μ λλ€. `index.html` νμΌμμ μ΄ μμ μ μνν μ μμ΅λλ€.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>React Portal Example</title>
</head>
<body>
<div id="root"></div>
<div id="modal-root"></div> <-- Our portal target -->
</body>
</html>
λλ React μ ν리μΌμ΄μ λ΄μμ λμ μΌλ‘ μμλ₯Ό λ§λ€κ³ μΆκ°ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λ£¨νΈ μ»΄ν¬λνΈμ `useEffect` ν λ΄μμ μ΄ μμ μ μνν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ λ λ§μ μ μ΄ κΈ°λ₯μ μ 곡νκ³ λμ μμκ° μ΄κΈ° λ λλ§ μ μ¦μ μ‘΄μ¬νμ§ μμ μ μλ μν©μ μ²λ¦¬ν μ μμ΅λλ€.
2λ¨κ³: λͺ¨λ¬ μ»΄ν¬λνΈ λ§λ€κΈ°
μ΄μ `Modal` μ»΄ν¬λνΈλ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€. μ΄ μ»΄ν¬λνΈλ κ°μμ±μ μ μ΄νλ `isOpen` propκ³Ό λͺ¨λ¬μ μ½ν μΈ λ₯Ό λ λλ§νλ `children` propμ λ°μ΅λλ€.
import React, { useEffect, useRef } from 'react';
import ReactDOM from 'react-dom';
const Modal = ({ isOpen, children, onClose }) => {
const modalRoot = document.getElementById('modal-root');
const elRef = useRef(document.createElement('div')); // Use useRef to create the element only once
useEffect(() => {
if (isOpen && modalRoot && !elRef.current.parentNode) {
modalRoot.appendChild(elRef.current);
}
return () => {
if (modalRoot && elRef.current.parentNode) {
modalRoot.removeChild(elRef.current);
}
};
}, [isOpen, modalRoot]);
if (!isOpen) {
return null;
}
return ReactDOM.createPortal(
<div className="modal-overlay" onClick={onClose}>
<div className="modal-content" onClick={(e) => e.stopPropagation()}>
{children}
</div>
</div>,
elRef.current
);
};
export default Modal;
μ€λͺ :
- `createPortal` λ©μλλ₯Ό ν¬ν¨νλ `ReactDOM`μ κ°μ Έμ΅λλ€.
- `modal-root` μμμ λν μ°Έμ‘°λ₯Ό κ°μ Έμ΅λλ€.
- `useRef`λ₯Ό μ¬μ©νμ¬ λͺ¨λ¬ μ½ν μΈ λ₯Ό λ΄μ `div`λ₯Ό λ§λ€κ³ μ»΄ν¬λνΈκ° μ²μ λ λλ§λ λλ§ ν λ² λ§λλλ€. μ΄λ κ² νλ©΄ λΆνμν μ¬λ λλ§μ λ°©μ§ν μ μμ΅λλ€.
- `useEffect` ν μμ λͺ¨λ¬μ΄ μ΄λ € μλμ§(`isOpen`) κ·Έλ¦¬κ³ `modalRoot`κ° μ‘΄μ¬νλμ§ νμΈν©λλ€. λ λ€ μ°Έμ΄λ©΄ `elRef.current`λ₯Ό `modalRoot`μ μΆκ°ν©λλ€. μ΄ μμ μ ν λ²λ§ μνλ©λλ€.
- `useEffect` λ΄μ λ°ν ν¨μλ μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλκ±°λ(`isOpen`κ° falseκ° λ¨) `modalRoot`μμ `elRef.current`κ° μ¬μ ν μλ κ²½μ° μ κ±°νμ¬ μ 리νλλ‘ ν©λλ€. μ΄λ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ λ° μ€μν©λλ€.
- `ReactDOM.createPortal`μ μ¬μ©νμ¬ λͺ¨λ¬μ μ½ν μΈ λ₯Ό `elRef.current` μμ(νμ¬ `modal-root` λ΄λΆμ μμ)λ‘ λ λλ§ν©λλ€.
- `modal-overlay`μ `onClick` νΈλ€λ¬λ₯Ό ν΅ν΄ μ¬μ©μλ μ½ν μΈ μμ μΈλΆλ₯Ό ν΄λ¦νμ¬ λͺ¨λ¬μ λ«μ μ μμ΅λλ€. `e.stopPropagation()`μ μ½ν μΈ μμ λ΄λΆλ₯Ό ν΄λ¦ν λ ν΄λ¦μΌλ‘ μΈν΄ λͺ¨λ¬μ΄ λ«νλ κ²μ λ°©μ§ν©λλ€.
3λ¨κ³: λͺ¨λ¬ μ»΄ν¬λνΈ μ¬μ©
μ΄μ λ€λ₯Έ μ»΄ν¬λνΈμμ `Modal` μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ μΌλΆ μ½ν μΈ λ₯Ό νμν΄ λ³΄κ² μ΅λλ€.
import React, { useState } from 'react';
import Modal from './Modal';
const App = () => {
const [isModalOpen, setIsModalOpen] = useState(false);
const openModal = () => {
setIsModalOpen(true);
};
const closeModal = () => {
setIsModalOpen(false);
};
return (
<div>
<button onClick={openModal}>Open Modal</button>
<Modal isOpen={isModalOpen} onClose={closeModal}>
<h2>Modal Content</h2>
<p>This content is rendered inside a portal!</p>
<button onClick={closeModal}>Close Modal</button>
</Modal>
</div>
);
};
export default App;
μ΄ μμ μμ `App` μ»΄ν¬λνΈλ λͺ¨λ¬μ μν(`isModalOpen`)λ₯Ό κ΄λ¦¬ν©λλ€. μ¬μ©μκ° "Open Modal" λ²νΌμ ν΄λ¦νλ©΄ `openModal` ν¨μλ `isModalOpen`μ `true`λ‘ μ€μ νμ¬ `Modal` μ»΄ν¬λνΈκ° ν¬νΈμ μ¬μ©νμ¬ μ½ν μΈ λ₯Ό `modal-root` μμλ‘ λ λλ§νλλ‘ νΈλ¦¬κ±°ν©λλ€.
4λ¨κ³: κΈ°λ³Έ μ€νμΌ μΆκ°(μ ν μ¬ν)
κΈ°λ³Έ CSSλ₯Ό μΆκ°νμ¬ λͺ¨λ¬μ μ€νμΌμ μ§μ ν©λλ€. μ΄λ μ΅μνμ μμΌ λΏμ΄λ©° μ ν리μΌμ΄μ μ μꡬ μ¬νμ λ§κ² μ€νμΌμ μ¬μ©μ μ§μ ν μ μμ΅λλ€.
/* App.css */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000; /* Ensure it's on top of everything */
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}
μ½λμ λν μμΈν μ΄ν΄
- `ReactDOM.createPortal(child, container)`: μ΄λ ν¬νΈμ λ§λ€κΈ° μν ν΅μ¬ ν¨μμ λλ€. `child`λ λ λλ§ν React μμμ΄κ³ `container`λ λ λλ§ν DOM μμμ λλ€.
- μ΄λ²€νΈ λ²λΈλ§: ν¬νΈ μ½ν μΈ κ° μ»΄ν¬λνΈμ DOM κ³μΈ΅ ꡬ쑰 μΈλΆμμ λ λλ§λλλΌλ Reactμ μ΄λ²€νΈ μμ€ν μ μμλλ‘ μλν©λλ€. ν¬νΈ μ½ν μΈ λ΄μμ λ°μνλ μ΄λ²€νΈλ λΆλͺ¨ μ»΄ν¬λνΈλ‘ λ²λΈλ§λ©λλ€. μ΄κ²μ΄ `Modal` μ»΄ν¬λνΈμ `modal-overlay`μ μλ `onClick` νΈλ€λ¬κ° `App` μ»΄ν¬λνΈμμ `closeModal` ν¨μλ₯Ό κ³μ νΈλ¦¬κ±°ν μ μλ μ΄μ μ λλ€. μμ μμ μ€λͺ ν λλ‘ `e.stopPropagation()`μ μ¬μ©νμ¬ ν΄λ¦ μ΄λ²€νΈκ° λΆλͺ¨ modal-overlay μμλ‘ μ νλλ κ²μ λ°©μ§ν μ μμ΅λλ€.
- μ κ·Όμ± κ³ λ € μ¬ν: ν¬νΈμ μ¬μ©ν λλ μ κ·Όμ±μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. ν¬νΈ μ½ν μΈ κ° μ₯μ κ° μλ μ¬μ©μκ° μ‘μΈμ€ν μ μλμ§ νμΈν©λλ€. μ¬κΈ°μλ ν¬μ»€μ€ κ΄λ¦¬, μ μ ν ARIA μμ± μ 곡, μ½ν μΈ κ° ν€λ³΄λλ‘ νμν μ μλμ§ νμΈμ΄ ν¬ν¨λ©λλ€. λͺ¨λ¬μ κ²½μ° λͺ¨λ¬μ΄ μ΄λ € μμ λ λͺ¨λ¬ λ΄μμ ν¬μ»€μ€λ₯Ό νΈλννκ³ λͺ¨λ¬μ νΈλ¦¬κ±°ν μμλ‘ ν¬μ»€μ€λ₯Ό 볡μνλ €κ³ ν©λλ€.
React ν¬νΈ μ¬μ©μ μν λͺ¨λ² μ¬λ‘
λ€μμ React ν¬νΈλ‘ μμ ν λ μΌλμ λμ΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ λλ€.
- μ μ© ν¬νΈ λμ λ§λ€κΈ°: ν¬νΈ μ½ν μΈ λ₯Ό λ λλ§νκΈ° μν νΉμ DOM μμλ₯Ό λ§λλλ€. μ΄λ κ² νλ©΄ ν¬νΈ μ½ν μΈ λ₯Ό μ ν리μΌμ΄μ μ λλ¨Έμ§ λΆλΆμμ 격리νκ³ μ€νμΌκ³Ό μμΉ μ§μ μ λ μ½κ² κ΄λ¦¬ν μ μμ΅λλ€. μΌλ°μ μΈ μ κ·Ό λ°©μμ νΉμ ID(μ: `modal-root`)κ° μλ `div`λ₯Ό `body` νκ·Έμ μΆκ°νλ κ²μ λλ€.
- μμ μ μ 리νμμμ€: ν¬νΈμ μ¬μ©νλ μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλλ©΄ DOMμμ ν¬νΈ μ½ν μΈ λ₯Ό μ κ±°ν΄μΌ ν©λλ€. μ΄λ κ² νλ©΄ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ DOMμ΄ μ 리λ μνλ‘ μ μ§λ©λλ€. μ 리 κΈ°λ₯μ΄ μλ `useEffect` ν μ μ΄λ₯Ό μν μ΄μμ μΈ λ°©λ²μ λλ€.
- μ΄λ²€νΈ λ²λΈλ§μ μ μ€νκ² μ²λ¦¬νμμμ€: μ΄λ²€νΈκ° ν¬νΈ μ½ν μΈ μμ λΆλͺ¨ μ»΄ν¬λνΈλ‘ λ²λΈλ§λλ λ°©μμ μ μνμμμ€. μλνμ§ μμ λΆμμ©μ λ°©μ§νκΈ° μν΄ νμν κ²½μ° `e.stopPropagation()`μ μ¬μ©νμμμ€.
- μ κ·Όμ±μ κ³ λ €νμμμ€: ν¬νΈμ μ¬μ©ν λλ μ κ·Όμ±μ μ£Όμνμμμ€. ν¬μ»€μ€ κ΄λ¦¬, μ μ ν ARIA μμ± μ 곡, ν€λ³΄λ νμ κ°λ₯μ±μ 보μ₯νμ¬ ν¬νΈ μ½ν μΈ κ° μ₯μ κ° μλ μ¬μ©μκ° μ‘μΈμ€ν μ μλλ‘ ν©λλ€. `react-focus-lock`κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ ν¬νΈ λ΄μμ ν¬μ»€μ€λ₯Ό κ΄λ¦¬νλ λ° μ μ©ν μ μμ΅λλ€.
- CSS λͺ¨λ λλ μ€νμΌ μ§μ λ μ»΄ν¬λνΈ μ¬μ©: CSS μΆ©λμ λ°©μ§νλ €λ©΄ CSS λͺ¨λ λλ μ€νμΌ μ§μ λ μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ μ€νμΌμ νΉμ μ»΄ν¬λνΈλ‘ λ²μ μ§μ νλ κ²μ κ³ λ €νμμμ€. μ΄λ κ² νλ©΄ μ€νμΌμ΄ ν¬νΈ μ½ν μΈ λ‘ λμΆλλ κ²μ λ°©μ§ν μ μμ΅λλ€.
React ν¬νΈμ κ³ κΈ μ¬μ© μ¬λ‘
λͺ¨λ¬κ³Ό ν΄νμ React ν¬νΈμ κ°μ₯ μΌλ°μ μΈ μ¬μ© μ¬λ‘μ΄μ§λ§ λ€λ₯Έ μλ리μ€μμλ μ¬μ©ν μ μμ΅λλ€.
- ν΄ν: λͺ¨λ¬κ³Ό λ§μ°¬κ°μ§λ‘ ν΄νμ μ’ μ’ λ€λ₯Έ μ½ν μΈ μμ λνλκ³ ν΄λ¦¬ν λ¬Έμ λ₯Ό νΌν΄μΌ ν©λλ€. ν¬νΈμ ν΄νμ λ λλ§νλ λ° μ ν©ν©λλ€.
- 컨ν μ€νΈ λ©λ΄: μ¬μ©μκ° μμλ₯Ό λ§μ°μ€ μ€λ₯Έμͺ½ λ²νΌμΌλ‘ ν΄λ¦νλ©΄ 컨ν μ€νΈ λ©λ΄λ₯Ό νμν μ μμ΅λλ€. ν¬νΈμ μ¬μ©νμ¬ μ»¨ν μ€νΈ λ©λ΄λ₯Ό `body` νκ·Έ μλμ μ§μ λ λλ§νμ¬ νμ νμλκ³ λΆλͺ¨ μμμ μν΄ μλ¦¬μ§ μλλ‘ ν μ μμ΅λλ€.
- μλ¦Ό: μλ¦Ό λ°°λ λλ νμ μ ν¬νΈμ μ¬μ©νμ¬ λ λλ§νμ¬ μ ν리μΌμ΄μ μ½ν μΈ μμ λνλλλ‘ ν μ μμ΅λλ€.
- IFramesμμ μ½ν μΈ λ λλ§: ν¬νΈμ μ¬μ©νμ¬ React μ»΄ν¬λνΈλ₯Ό IFrames λ΄λΆμ λ λλ§ν μ μμ΅λλ€. μ΄λ μ½ν μΈ λ₯Ό μλλ°μ±νκ±°λ νμ¬ μ ν리μΌμ΄μ κ³Ό ν΅ν©νλ λ° μ μ©ν μ μμ΅λλ€.
- λμ λ μ΄μμ μ‘°μ : κ²½μ°μ λ°λΌ μ¬μ© κ°λ₯ν νλ©΄ 곡κ°μ λ°λΌ μ ν리μΌμ΄μ μ λ μ΄μμμ λμ μΌλ‘ μ‘°μ ν΄μΌ ν μ μμ΅λλ€. ν¬νΈμ μ¬μ©νμ¬ νλ©΄ ν¬κΈ° λλ λ°©ν₯μ λ°λΌ DOMμ λ€λ₯Έ λΆλΆμΌλ‘ μ½ν μΈ λ₯Ό λ λλ§ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λͺ¨λ°μΌ μ₯μΉμμ ν¬νΈμ μ¬μ©νμ¬ νμ λ©λ΄λ₯Ό νλ¨ μνΈλ‘ λ λλ§ν μ μμ΅λλ€.
React ν¬νΈμ λμ
React ν¬νΈμ κ°λ ₯ν λꡬμ΄μ§λ§ νΉμ μν©μμ μ¬μ©ν μ μλ λ체 μ κ·Ό λ°©μμ΄ μμ΅λλ€.
- CSS `z-index` λ° μ λ μμΉ μ§μ : CSS `z-index` λ° μ λ μμΉ μ§μ μ μ¬μ©νμ¬ μμλ₯Ό λ€λ₯Έ μ½ν μΈ μμ λ°°μΉν μ μμ΅λλ€. κ·Έλ¬λ μ΄ μ κ·Ό λ°©μμ νΉν μ€μ²©λ μμμ μ¬λ¬ μ€ν 컨ν μ€νΈλ₯Ό μ²λ¦¬ν λ 볡μ‘ν μ ν리μΌμ΄μ μμ κ΄λ¦¬νκΈ° μ΄λ €μΈ μ μμ΅λλ€. λν CSS μΆ©λμ΄ λ°μνκΈ° μ½μ΅λλ€.
- κ³ μ°¨ μ»΄ν¬λνΈ(HOC) μ¬μ©: μ»΄ν¬λνΈλ₯Ό λννκ³ DOMμ μ΅μμ μμ€μμ λ λλ§νλ HOCλ₯Ό λ§λ€ μ μμ΅λλ€. κ·Έλ¬λ μ΄ μ κ·Ό λ°©μμ prop λ릴λ§μΌλ‘ μ΄μ΄μ§κ³ μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό λ 볡μ‘νκ² λ§λ€ μ μμ΅λλ€. λν ν¬νΈμ΄ ν΄κ²°νλ μ΄λ²€νΈ λ²λΈλ§ λ¬Έμ λ₯Ό ν΄κ²°νμ§ λͺ»ν©λλ€.
- μ μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬(μ: Redux, Zustand): μ μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ λͺ¨λ¬κ³Ό ν΄νμ κ°μμ±κ³Ό μ½ν μΈ λ₯Ό κ΄λ¦¬ν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ ν¨κ³Όμ μΌ μ μμ§λ§ κ°λ¨ν μ¬μ© μ¬λ‘μ κ²½μ° κ³Όλν μλ μμ΅λλ€. λν DOM μ‘°μμ μλμΌλ‘ κ΄λ¦¬ν΄μΌ ν©λλ€.
λλΆλΆμ κ²½μ° React ν¬νΈμ μ»΄ν¬λνΈ νΈλ¦¬ μΈλΆμμ μ½ν μΈ λ₯Ό λ λλ§νλ κ°μ₯ κΉλνκ³ ν¨μ¨μ μΈ μ루μ μ λλ€. DOMμ κ΄λ¦¬νκ³ λ€λ₯Έ μ κ·Ό λ°©μμ ν¨μ μ νΌνλ κΉλνκ³ μμΈ‘ κ°λ₯ν λ°©λ²μ μ 곡ν©λλ€.
κ΅μ ν(i18n) κ³ λ € μ¬ν
μ μΈκ³ μ¬μ©μλ₯Ό μν μ ν리μΌμ΄μ μ ꡬμΆν λλ κ΅μ ν(i18n) λ° νμ§ν(l10n)λ₯Ό κ³ λ €νλ κ²μ΄ νμμ μ λλ€. React ν¬νΈμ μ¬μ©ν λλ ν¬νΈ μ½ν μΈ κ° λ€μν λ‘μΌμΌμ λν΄ μ μ νκ² λ²μλκ³ νμμ΄ μ§μ λμλμ§ νμΈν΄μΌ ν©λλ€.
- i18n λΌμ΄λΈλ¬λ¦¬ μ¬μ©: λ²μμ κ΄λ¦¬νλ €λ©΄ `react-i18next` λλ `formatjs`μ κ°μ μ μ© i18n λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμμμ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ λ²μ λ‘λ, λ μ§, μ«μ λ° ν΅ν νμ μ§μ , 볡μν μ²λ¦¬ λꡬλ₯Ό μ 곡ν©λλ€.
- ν¬νΈ μ½ν μΈ λ²μ: ν¬νΈ μ½ν μΈ λ΄μ λͺ¨λ ν μ€νΈλ₯Ό λ²μν΄μΌ ν©λλ€. i18n λΌμ΄λΈλ¬λ¦¬μ λ²μ ν¨μλ₯Ό μ¬μ©νμ¬ νμ¬ λ‘μΌμΌμ λν μ μ ν λ²μμ κ²μν©λλ€.
- μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘(RTL) λ μ΄μμ μ²λ¦¬: μ ν리μΌμ΄μ μ΄ μλμ΄ λλ νλΈλ¦¬μ΄μ κ°μ RTL μΈμ΄λ₯Ό μ§μνλ κ²½μ° ν¬νΈ μ½ν μΈ κ° RTL μ½κΈ° λ°©ν₯μ λ§κ² μ μ νκ² λ°°μΉλμλμ§ νμΈν΄μΌ ν©λλ€. CSS `direction` μμ±μ μ¬μ©νμ¬ λ μ΄μμ λ°©ν₯μ μ νν μ μμ΅λλ€.
- λ¬Ένμ μ°¨μ΄ κ³ λ €: ν¬νΈ μ½ν μΈ λ₯Ό λμμΈν λ λ¬Ένμ μ°¨μ΄λ₯Ό μΌλμ λμμμ€. μλ₯Ό λ€μ΄ μμ, μμ΄μ½ λ° κΈ°νΈλ λ¬Ένλ§λ€ λ€λ₯Έ μλ―Έλ₯Ό κ°μ§ μ μμ΅λλ€. λμ μ²μ€μκ² μ ν©νλλ‘ λμμΈμ μ‘°μ ν΄μΌ ν©λλ€.
νΌν΄μΌ ν μΌλ°μ μΈ μ€μ
- μ 리νλ κ²μ μμ§ λ§μμμ€: μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλ λ ν¬νΈ 컨ν μ΄λλ₯Ό μ κ±°νμ§ λͺ»νλ©΄ λ©λͺ¨λ¦¬ λμ λ° μ μ¬μ μΈ DOM μ€μΌμ΄ λ°μν©λλ€. νμ `useEffect`μμ μ 리 ν¨μλ₯Ό μ¬μ©νμ¬ μΈλ§μ΄νΈ μ²λ¦¬λ₯Ό μ²λ¦¬νμμμ€.
- μ΄λ²€νΈ λ²λΈλ§μ μλͺ» μ²λ¦¬: ν¬νΈμμ μ΄λ²€νΈκ° λ²λΈλ§λλ λ°©μμ μ΄ν΄νμ§ λͺ»νλ©΄ μκΈ°μΉ μμ λμμ΄ λ°μν μ μμ΅λλ€. νμν κ²½μ°μλ§ `e.stopPropagation()`μ μ μ€νκ² μ¬μ©νμμμ€.
- μ κ·Όμ±μ 무μ: μ κ·Όμ±μ λ§€μ° μ€μν©λλ€. ν¬μ»€μ€ κ΄λ¦¬, ARIA μμ± λ° ν€λ³΄λ νμ κ°λ₯μ±μ μνν νλ©΄ λ§μ μ¬μ©μκ° μ ν리μΌμ΄μ μ μ¬μ©ν μ μκ² λ©λλ€.
- ν¬νΈμ κ³Όλνκ² μ¬μ©: ν¬νΈμ κ°λ ₯ν λꡬμ΄μ§λ§ λͺ¨λ μν©μμ νμν κ²μ μλλλ€. κ³Όλνκ² μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ λΆνμν 볡μ‘μ±μ΄ μΆκ°λ μ μμ΅λλ€. z-μΈλ±μ€ λ¬Έμ , CSS μΆ©λ λλ μ€λ²νλ‘ λ¬Έμ μ κ°μ νμν κ²½μ°μλ§ μ¬μ©νμμμ€.
- λμ μ λ°μ΄νΈ μ²λ¦¬νμ§ μμ: ν¬νΈμ μ½ν μΈ λ₯Ό μμ£Ό μ λ°μ΄νΈν΄μΌ νλ κ²½μ° ν¬νΈμ μ½ν μΈ λ₯Ό ν¨μ¨μ μΌλ‘ μ λ°μ΄νΈνκ³ μλμ§ νμΈνμμμ€. `useMemo` λ° `useCallback`μ μ μ ν μ¬μ©νμ¬ λΆνμν μ¬λ λλ§μ νΌνμμμ€.
κ²°λ‘
React ν¬νΈμ νμ€ μ»΄ν¬λνΈ νΈλ¦¬ μΈλΆμμ μ½ν μΈ λ₯Ό λ λλ§νλ λ° μ μ©ν λꡬμ λλ€. μ€νμΌ μ§μ , z-μΈλ±μ€ κ΄λ¦¬ λ° μ κ·Όμ±κ³Ό κ΄λ ¨λ μΌλ°μ μΈ UI λ¬Έμ λ₯Ό ν΄κ²°νλ κΉλνκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€. ν¬νΈμ΄ μλνλ λ°©μμ μ΄ν΄νκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ λμ± κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν React μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€. λͺ¨λ¬, ν΄ν, 컨ν μ€νΈ λ©λ΄ λλ κΈ°ν μ€λ²λ μ΄ μ»΄ν¬λνΈλ₯Ό λΉλνλ React ν¬νΈμ λ λμ μ¬μ©μ κ²½νκ³Ό λ 체κ³μ μΈ μ½λλ² μ΄μ€λ₯Ό λ¬μ±νλ λ° λμμ΄ λ μ μμ΅λλ€.