À¥ Ŭ¶óÀÌ¾ðÆ® ÇÁ·¹ÀÓ¿öÅ©ÀÇ ÁÖµÈ ±â´ÉÀº ½ÇÇàÁß¿¡ µ¿ÀûÀÎ ÆäÀÌÁö¸¦ »ý¼ºÇÏ¿© ±×¸®´Â(Render) °ÍÀÌ´Ù. ³»ºÎÀûÀÎ ¼Ó¼º°ú »óŸ¦ Àû¿ëÇÏ¿© °¡»ó DOMÀ» µ¿ÀûÀ¸·Î »ý¼ºÇϰí À¥ ÆäÀÌÁö¿¡ ±×·Á¾ß ÇÑ´Ù. ÀÌ·± µ¿ÀÛÀ»
ÇÏ´Â ºÎǰÀ» ¸®¾×Æ® ÄÄÆ÷³ÍÆ®¶ó°í ÇÑ´Ù.
ÄÄÆ÷³ÍÆ®´Â µ¶¸³ÀûÀÎ »óŸ¦ À¯ÁöÇÏ°í »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ ½º½º·Î µ¿ÀÛÇÑ´Ù. ÀÌ·±
¸ñÀû¿¡ µü ¾î¿ï¸®´Â ¹®¹ýÀû ÀåÄ¡°¡ Ŭ·¡½ºÀÌ´Ù. Ŭ·¡½º´Â Çʵ忡 Á¤º¸¸¦ ÀúÀåÇÏ°í ¸Þ¼µå·Î µ¿ÀÛÀ» ó¸®Çϸç
¶óÀÌÇÁ »çÀÌŬ¿¡ µû¸¥ ƯÁ¤ ½ÃÁ¡À» Àâ¾Æ³¾ ¼öµµ ÀÖ´Ù. ±×·¡¼ ¸®¾×Æ® Ãʱ⿡´Â ÄÄÆ÷³ÍÆ®¸¦ Ŭ·¡½º·Î ±¸ÇöÇß´Ù. ¼ºÀûÇ¥ ÄÄÆ÷³ÍÆ®¸¦ Ŭ·¡½º·Î ±¸ÇöÇØ º¸ÀÚ.
class
ScoreClass extends React.Component {
render() {
let score = 123
return (
<div>
<h2>¼ºÀûÇ¥</h2>
<p>Á¡¼ö´Â {score}ÀÔ´Ï´Ù.</p>
</div>
)
}
}
function
App() {
return (
<>
<ScoreClass
/>
</>
)
}
React.Component·ÎºÎÅÍ »ó¼Ó¹Þ´Â Ŭ·¡½º¸¦ Á¤ÀÇÇϰí render ¸Þ¼µå¿¡¼ JSX Çü½ÄÀ¸·Î °¡»ó DOMÀ» ¸¸µé¾î ¸®ÅÏÇÑ´Ù. Çü½Ä¸¸ Á¶±Ý ´Ù¸¦ »Ó ¾Õ¿¡¼ ¸¸µé¾ú´ø ÇÔ¼ö
ÄÄÆ÷³ÍÆ®¿Í º°¹Ý ´Ù¸¦ °Íµµ ¾ø´Ù. render ¸Þ¼µåÀÇ ¾ÈÂÊÀ» ÇÔ¼ö·Î °¨½Î¸é µÈ´Ù.

±×·¯³ª ¿©±â¿¡ ¼Ó¼ºÀ̳ª »óŰ¡ µé¾î°¡¸é º¹ÀâÇØÁø´Ù. À̹ø¿¡´Â »óŰªÀ»
°¡Áö´Â Ä«¿îÆ® ÄÄÆ÷³ÍÆ®¸¦ Ŭ·¡½º·Î ¸¸µé¾î º¸ÀÚ. ¿¹Àü¿¡´Â ÀÌ·¨´Ù´Â °É ¼³¸íÇÏ´Â ÁßÀÌ´Ï ¾Æ·¡ ¿¹Á¦ÀÇ ¸ðµç
¹®¹ýÀ» ±»ÀÌ ´Ù ÀÌÇØÇÒ ÇÊ¿ä´Â ¾ø°í °¡º¿î ¸¶À½À¸·Î ±¸°æ¸¸ ÇÏÀÚ.
class
CounterClass extends React.Component {
state = {
count: 10
};
increment = () => {
this.setState((prevState)
=> ({
count:
prevState.count + 1
}));
};
decrement = () => {
this.setState((prevState)
=> ({
count:
prevState.count - 1
}));
};
render() {
return (
<>
<h2>{this.state.count}</h2>
<button onClick={this.decrement}>°¨¼Ò</button>
<button onClick={this.increment}>Áõ°¡</button>
</>
)
}
}
function
App() {
return (
<>
<CounterClass
/>
</>
)
}
»óŸ¦ state °´Ã¼ Çʵ忡 Á¤ÀÇÇϰí count¸¦ 10À¸·Î ÃʱâÈÇß´Ù. Áõ°¡
ÇÔ¼öÀÎ increase´Â this.SetState ¸Þ¼µå·Î
ÀÌÀü »óŰª¿¡ 1À» ´õÇÑ´Ù. ºñµ¿±â 󸮸¦ À§ÇØ Á÷Á¢ »óŰªÀ»
Áõ°¡ÇÏÁö ¾Ê°í ÇÔ¼ö¸¦ Àü´ÞÇÑ´Ù. °¨¼Ò ÇÔ¼öÀÎ decreaseµµ
ºñ½ÁÇÏ´Ù.
render ÇÔ¼ö¿¡¼´Â this.state.count·Î
ÇöÀç Ä«¿îÆ®¸¦ Ãâ·ÂÇÏ°í ¹öư µÎ °³¸¦ ¹èÄ¡ÇÑ ÈÄ onClick¿¡ Áõ°¨ ÇÔ¼ö¸¦ ÁöÁ¤ÇÑ´Ù. ¹öưÀ» Ŭ¸¯Çϸé Çڵ鷯°¡ È£ÃâµÇ°í setState¸¦ ½ÇÇàÇÒ ¶§¸¶´Ù
·£´õ¸µÀ» ´Ù½Ã ÇÏ¿© Áõ°¨ÇÑ Ä«¿îÆ®¸¦ ´Ù½Ã ±×¸°´Ù. µ¿ÀÛÀº ´ç¿¬È÷ °°´Ù.
ÀÌ Á¤µµ¸é Ŭ·¡½º·Îµµ ¸¸µé¸¸ÇÑ °Íó·³ º¸ÀδÙ. ±×·¯³ª À§ ¿¹Á¦´Â ES13¿¡¼ Ãß°¡µÈ Ŭ·¡½º ÇÊµå ¼±¾ð ¹®¹ýÀ» »ç¿ëÇϰí ÀÖ¾î ±¸Çü ºê¶ó¿ìÀú³ª ¿À·¡µÈ Node.js ȯ°æ¿¡¼´Â ½ÇÇàµÇÁö ¾Ê´Â´Ù. ±× ÀÌÀüÀÇ È¯°æ¿¡¼´Â Ŭ·¡½º
¸Þ¼µå¸¦ ¼±¾ðÇϰí this ¹ÙÀεùÀ» ÇØ¾ß ÇÏ¸ç ±×·¯±â À§ÇØ »ý¼ºÀÚ°¡ ÇÊ¿äÇÏ´Ù.
class CounterClass extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 10
};
this.increment = this.increment.bind(this);
this.decrement = this.decrement.bind(this);
}
increment() {
this.setState((prevState) => ({
count:
prevState.count + 1
}));
};
decrement() {
this.setState((prevState) => ({
count:
prevState.count - 1
}));
};
¿ÀÇ ¼Ò½º°¡ ´Ù ±×·¸Áö¸¸ Á¶±Ý Á¶±Ý¾¿ ÀÚÀßÇÏ°Ô ±â´ÉÀ» ´Ã¸®´Ù º¸´Ï ±×¿¡ ¸ÂÃç Äڵ带 Á¦´ë·Î Â¥±â ¾î·Æ´Ù. ¼³»ç °¡´ÉÇÏ´Ù ÇÏ´õ¶óµµ º¸´Ù½ÃÇÇ ±¸ÇöÇϰíÀÚ ÇÏ´Â ±â´Éº¸´Ù Çü½ÄÀ» ¸ÂÃß±â À§ÇÑ ±º´õ´õ±â Äڵ尡 ´õ ¸¹´Ù. ±×·¡¼ ¸®¾×Æ® °³¹ßÆÀÀº Ŭ·¡½ºº¸´Ù °£ÆíÇϰí ÁÁÀº ¹æ¹ýÀ» ã¾Ò´Ù. ±×°Ô
¹Ù·Î ÈÅÀÌ´Ù.
ÄÄÆ÷³ÍÆ®´Â »óÅ °ü¸®³ª »ý¸í Áֱ⠸޼µå°¡ ÇʼöÀûÀ̾ú°í ÀÌ Á¤µµ ±â´ÉÀ» ±¸ÇöÇÏ·Á¸é Ŭ·¡½º°¡ ÇÊ¿äÇÏ´Ù. ±×·¯³ª Ŭ·¡½º´Â µ¢Ä¡°¡ Å©°í ¸Þ¼µå¿¡ Äڵ尡 ºÐ»êµÇ¾î °¡µ¶¼º°ú À¯Áö º¸¼ö¼ºÀÌ ³·´Ù. »ç½Ç Ŭ·¡½º ÀÚü´Â ÈǸ¢ÇÑ ¹®¹ýÀÌ¸ç ±îÀϸ¸ÇÑ ´ë»óÀÌ ¾Æ´Ï´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ
Ŭ·¡½º Áö¿øÀÌ ¿ö³« ¿¾ÇÇѵ¥´Ù ¹öÀü¿¡ µû¶ó ¹®¹ýÀÌ ÃãÀ» Ãá´Ù´Â°Ô ´õ Å« ¹®Á¦ÀÌ´Ù.
¾î·°Å³ª Ãʺ¸ÀÚ¿¡°Ô Ŭ·¡½º´Â °¡È÷ ½¬¿î ´ë»óÀÌ ¾Æ´Ï°í ¼÷·ÃÀÚ¶ó ÇØµµ ºñ´ëÇØÁö¸é °ü¸®ÇÏ±â ¾î·Æ´Ù. ÀÌ·± ºÒÆíÇÔÀ» ÇØ¼ÒÇϱâ À§ÇØ ¸®¾×Æ® 16.8¿¡¼ µµÀÔÇÑ °ÍÀÌ ÈÅÀÌ´Ù. ÈÅ(hook)Àº ÇÔ¼ö¿¡°Ô Ŭ·¡½º ¼öÁØÀÇ °í±Þ ±â´ÉÀ» ºÎ¿©ÇÏ¿© ÇÔ¼ö¸¸À¸·Îµµ
¸¹Àº °ÍÀ» ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â ÀåÄ¡ÀÌ´Ù. ÈÅÀ¸·Î ÀÎÇØ ÇÔ¼ö°¡ ¿©·¯ º¹ÀâÇÑ ±â´ÉÀ» °¡Áú ¼ö ÀÖ°Ô µÇ¾ú´Ù.
¢º ÇÔ¼ö ³»ºÎ¿¡ »óŸ¦ ÀúÀåÇÏ°í °ü¸®ÇÑ´Ù.
¢º »ý¸íÁֱ⠸޼µå·Î ÃʱâÈ, Á¾·á ó¸® µîÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù.
¢º À̺¥Æ®¸¦ ¹Þ¾Æ µ¿ÀÛÀ» ó¸®ÇÑ´Ù.
¢º ÇÔ¼ö ¾È¿¡ ¸ðµç °ÍÀÌ Æ÷ÇԵǹǷΠÀç»ç¿ëÇϱ⠽±´Ù.
¢º °´Ã¼ ÁöÇâÀ» Àß ¸ô¶óµµ ½±°Ô ¹è¿ì°í ÀϰüµÇ°Ô ¸¸µé ¼ö ÀÖ´Ù.
»ç½Ç ÇÔ¼ö´Â Ŭ·¡½ºº¸´Ù ÇÑÂü ±ÞÀÌ ³·Àº °³³äÀÌ¸ç º¹ÀâÇÑ °ÍÀ» ó¸®Çϱâ´Â ¾î·Æ´Ù.
ÇÔ¼ö ¾È¿¡ Æ÷ÇÔµÈ °ÍÀº ¸ðµÎ Áö¿ªÀûÀ̰í À¯Áö ±â°£ÀÌ Âª¾Æ °ªÀ» ¿À·¡ ÀúÀåÇÒ ¼ö ¾ø´Ù. ¾Õ¿¡¼
¿ì¸®°¡ ¸¸µé¾ú´ø Ä«¿îÆ® ¿¹Á¦¸¦ ´Ù½Ã º¸ÀÚ.
function Counter() {
let
count = 10
...
function Counter() {
const
[count, setCount] = useState(10);
...
º¯¼öµç, »óŵç ÇÔ¼ö ¾È¿¡ ÀÖÀ¸´Ï ÇÔ¼ö°¡ ³¡³ª¸é »ç¶óÁú ¿î¸íÀÌ´Ù. ±×·¯³ª ÀÚ¹Ù½ºÅ©¸³Æ®´Â Ŭ·ÎÀú¶ó´Â ±â¸·Èù ÀåÄ¡°¡ ÀÖ¾î À̸¦ Àß È°¿ëÇϸé ÇÔ¼öµµ Á¤º¸¸¦ ¿À·§µ¿¾È À¯ÁöÇÒ ¼ö ÀÖ´Ù. ¸®¾×Æ® °³¹ßÆÀÀº ÀÌ·± ¹®¹ýÀ» Àû±Ø Ȱ¿ëÇÏ¿© ÇÔ¼ö¿¡°Ô ÀÌÀü »óŸ¦ ±â¾ïÇÏ´Â ´É·ÂÀ» ºÎ¿©ÇÏ¿´´Ù.
¶ÇÇÑ ¸®¾×Æ® ³»ºÎÀÇ »óÅÂ, »ý¸í ÁÖ±â Á¤º¸¸¦ °¥°í¸®Ã³·³ °É¾î¼ ¾×¼¼½ºÇÏ´Â
°Íµµ °¡´ÉÇÏ´Ù. ±×·¡¼ ÀÌ·± ÇüÅÂÀÇ ÇÔ¼ö¿¡°Ô ÈÅ(Hook)À̶ó´Â
¸ÚÁø À̸§À» ºÙ¿´´Ù. ÈÅÀº Á¤¹ÐÇÑ Äڵ忩¼ ¿À·£ ±â°£ ¿¬±¸ÇßÀ¸¸ç ÃæºÐÇÑ Å×½ºÆ®¸¦ °ÅÃÄ °ø°³ÇÏ¿´´Ù.
ÇÔ¼ö°¡ ¾î¶»°Ô Ŭ·¡½º¸¦ ´ë½ÅÇÒ ¼ö ÀÖ´ÂÁö ÈÅÀÇ ¿ø¸®¸¦ ¿¬±¸ÇØ º¸±â À§ÇØ useStateÀÇ
µ¿ÀÛ ¹æ½ÄÀ» º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹Á¦¸¦ ºÐ¼®ÇØ º¸ÀÚ. ½ÇÁ¦ ÈÅÀº À̺¸´Ù Á¤±³ÇÏ°í º¹ÀâÇÏÁö¸¸ °³³äÀ» »ìÆì
º¸±â¿¡´Â ÃæºÐÇÏ´Ù. ºê¶ó¿ìÀú¿¡¼ ¹Ù·Î ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï HTML¾È¿¡
ÀÚ¹Ù½ºÅ©¸³Æ® Äڵ带 ÀÛ¼ºÇß´Ù.
¿¡Á¦ : hook.html
<!DOCTYPE
html>
<html>
<head>
<meta
charset="utf-8">
<title>reacthook</title>
</head>
<body>
<script>
// ÄÄÆ÷³ÍÆ®º°
»óŸ¦ ÀúÀåÇÏ´Â ¹è¿. Àü¿ªÀ̹ǷΠ°ªÀ» °è¼Ó À¯ÁöÇÑ´Ù.
let
componentState = [];
// ´ÙÀ½
»ç¿ëÇÒ ¹è¿ À§Ä¡(=½½·Ô). 0ºÎÅÍ ½ÃÀÛ
let
currentStateIndex = 0;
function
useState(initialState) {
//
»óŸ¦ ÀúÀåÇÒ ½½·Ô ãÀ½
const
slot = currentStateIndex;
//
ºñ¾î ÀÖÀ¸¸é ÃʱⰪÀ» ÀúÀåÇÑ´Ù.
if
(componentState[slot] === undefined) {
componentState[slot]
= initialState;
}
//
»óÅ º¯°æ ÇÔ¼ö. ½½·Ô¿¡ »õ °ªÀ» ´ëÀÔÇÑ´Ù.
//
slotÀº Ŭ·ÎÀú¿¡ ÀÇÇØ °ªÀ» À¯ÁöÇÑ´Ù.
const
setState = (newState) => {
//
ÇÔ¼ö¸¦ Àü´Þ¹Þ¾ÒÀ¸¸é ÇÔ¼ö¿¡°Ô ÇöÀç°ªÀ» Àü´ÞÇÏ¿© ó¸®ÇÏ°í ±× °á°ú¸¦ ½½·Ô¿¡ ±â·ÏÇÑ´Ù.
if
(typeof newState === 'function') {
componentState[slot]
= newState(componentState[slot]);
//
°ªÀ» Àü´Þ¹Þ¾ÒÀ¸¸é ½½·Ô¿¡ °ªÀ» ¹Ù·Î ±â·ÏÇÑ´Ù.
}
else {
componentState[slot]
= newState;
}
//
»óŰ¡ ¹Ù²î¸é ´Ù½Ã ·£´õ¸µÇÑ´Ù.
render();
};
//
´ÙÀ½ »óŰªÀ» ÀúÀåÇÒ ½½·Ô ÁöÁ¤
currentStateIndex++;
//
½½·Ô¿¡ ÀúÀåµÈ °ª°ú º¯°æ ÇÔ¼ö¸¦ ¹è¿·Î ¹¾î ¸®ÅÏÇÑ´Ù.
return
[componentState[slot], setState];
}
// µÎ°³ÀÇ
Á¤¼ö, ¹®ÀÚ¿ »óŸ¦ °¡Áö´Â »ùÇà ÄÄÆ÷³ÍÆ®
function
Compo() {
const
[count, setCount] = useState(0);
const
[text, setText] = useState('One');
document.writeln('Count
: ' + count + ' ,Text : ' + text + '<br />');
//
Á¤¼ö Áõ°¡, ¹®ÀÚ¿ °»½Å ¸Þ¼µå¸¦ °´Ã¼·Î ¹¾î ¸®ÅÏÇÑ´Ù.
return
{
increment:
() => setCount(prevCount => prevCount + 1),
updateText:
(newText) => setText(newText),
};
}
function
render() {
//
·£´õ¸µÇÒ ¶§¸¶´Ù 0¹ø ½½·ÔºÎÅÍ ¼øÈ¸ÇÑ´Ù.
currentStateIndex
= 0;
//
µÎ °³ÀÇ ¸Þ¼µå¸¦ Á¦°øÇÏ´Â ÄÄÆ÷³ÍÆ® °´Ã¼¸¦ »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù.
return
Compo();
}
// ÄÄÆ÷³ÍÆ®
»ý¼º. À̶§ µÎ °³ÀÇ »óŰ¡ ÃʱâȵȴÙ.
const
compo = render();
// Á¤¼ö
Áõ°¡. setState¿¡ ÀÇÇØ ½½·ÔÀÇ °ªÀÌ 1Áõ°¡ÇÏ°í ´Ù½Ã
·£´õ¸µÇÑ´Ù.
//
Compo¸¦ ´Ù½Ã »ý¼º. useState´Â ½½·ÔÀÇ °ª À¯Áö.
compo.increment();
// ¹®ÀÚ¿
º¯°æ
compo.updateText('Two');
// ¼ýÀÚ
Çѹø ´õ Áõ°¡
compo.increment();
</script>
</body>
</html>
ÀÌ ¿¹Á¦¸¦ ÀÌÇØÇÏ·Á¸é ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ Å¬·ÎÀú¿Í È»ìÇ¥ ÇÔ¼ö µîÀÇ °í±Þ ¹®¹ýÀ» ÀÌÇØÇØ¾ß Çϴµ¥ »ç½Ç ±×·¸°Ô ¾î·Á¿î
¹®¹ýµµ ¾Æ´Ï´Ù. Áö±ÝÀº ÀÚ¹Ù½ºÅ©¸³Æ® ¹®¹ýÀ» ¼³¸íÇÒ ´Ü°è´Â ¾Æ´Ï¹Ç·Î ÀÚ¼¼ÇÑ ¼³¸íÀº »ý·«ÇÑ´Ù. ÄÚµåÀÇ ÁÖ¼®À» ´ëÃæ Àо ºÁµµ ¾î¶² ½ÄÀ¸·Î µ¿ÀÛÇÏ´ÂÁö °¨À» ÀâÀ» ¼ö ÀÖ´Ù.
´ëÃæ ÀÌ·± ½ÄÀ¸·Î ±¸ÇöÇß´Ù´Â °ÍÀ» º¸¿©ÁÖ´Â °ÍÀ̹ǷΠ»ç½Ç ±»ÀÌ ´Ù ÀÌÇØÇÏÁö ¸øÇصµ »ó°üÀº ¾øÁö¸¸ Èŵµ ¹®¹ý¿¡
±â¹ÝÇÒ »Ó ¸¶¼ú°°Àº Á¸Àç´Â ¾Æ´Ï¶ó´Â °Í¸¸ ÀνÄÇÏÀÚ. ³ªº¸´Ù ¶È¶ÈÇÑ »ç¶÷µéÀÌ ¾Ë¾Æ¼ Àß ¸¸µé¾î ³ù°Ú°Å´Ï
¹Ï°í »ç¿ëÇÏ¸é µÈ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
Count : 0 ,Text : One
Count : 1 ,Text : One
Count : 1 ,Text : Two
Count : 2 ,Text : Two
¼ýÀÚ¸¦ Áõ°¡½ÃŰ´Â increment ÇÔ¼ö´Â °ªÀ» Àü´ÞÇÏ´Â°Ô ¾Æ´Ï¶ó
ÀÌÀü °ªÀ» Àоî 1Áõ°¡½ÃŰ´Â ÇÔ¼ö¸¦ Àü´ÞÇÑ´Ù. ¿Ö ÀÌ·¸°Ô
µÇ¾î ÀÖ´ÂÁö´Â Áõ°¡°ªÀ» Á÷Á¢ Àü´ÞÇØ º¸¸é ¾Ë ¼ö ÀÖ´Ù.
increment: () => setCount(count + 1),
ÀÌ·¯¸é °ªÀÌ Çѹø¸¸ Áõ°¡ÇÏ¿© 0ÀÌ
1ÀÌ µÉ »ÓÀ̸ç 1Àº Áõ°¡½ÃÄѵµ 2°¡ µÇÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé count´Â CompoÀÇ
Áö¿ª º¯¼öÀÌµÇ increment ÇÔ¼ö¿¡ ÀÇÇØ Ŭ·ÎÀú·Î °¤Çô ÀÖ¾î ÃÖÃÊÀÇ °ªÀ» °¡Áú »Ó »óÅ ¹è¿ÀÇ ½Ç½Ã°£°ªÀ»
¾ËÁö ¸øÇÑ´Ù. ±×·¡¼ Áõ°¡ÇÑ °ªÀÌ ¾Æ´Ï¶ó Áõ°¡½ÃÄÑ ÁÖ´Â ÇÔ¼ö¸¦ Àü´ÞÇÏ¿© È£Ãâ ½ÃÁ¡ÀÇ ½ÇÁ¦°ªÀ» Àоî Áõ°¡Çϵµ·Ï
ÇØ¾ß ÇÑ´Ù.
ÈÅÀº °è»êÀ̳ª µ¿ÀÛÀ» ó¸®ÇÏ´Â ÀÏ¹Ý ÇÔ¼ö¿Í´Â ´Þ¸® ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇÑ´Ù. ¶È°°Àº
ÇÔ¼ö ¸ð¾çÀÌ¶óµµ Å¬·¡½º¿¡ ÁØÇÏ´Â ±â´ÉÀ» Á¦°øÇÏ´Ï È®½ÇÈ÷ ±Þ Â÷À̰¡ ÀÖ´Ù. ¿ªÇÒÀÌ ´Ù¸£´Ùº¸´Ï ÀÏ¹Ý ÇÔ¼ö¿¡
ºñÇØ ¾ö°ÝÇÑ ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù.
¢º ÈÅÀº ÄÄÆ÷³ÍÆ®ÀÇ ÃÖ»óÀ§ ·¹º§¿¡¼¸¸ È£ÃâÇØ¾ß Çϸç Á¶°Ç¹®À̳ª ¹Ýº¹¹® ºí·Ï, Áö¿ª ÇÔ¼ö ¾È¿¡¼ È£ÃâÇØ¼´Â ¾ÈµÈ´Ù. ´ÙÀ½ Äڵ带 º¸ÀÚ. Á¶°Ç¹® ¾È¿¡¼ ¾î¶² »óŸ¦ ¸¸µé°í °ü¸®ÇÏ´Â °ÍÀº µü ºÁµµ ¹º°¡ ¾î¿ï¸®Áö ¾Ê´Â´Ù.
if (Á¶°Ç) {
useState(...)
}
¢º ÈÅÀº ¸®¾×Æ® ÇÔ¼ö ÄÄÆ÷³ÍÆ®¿¡¼¸¸ È£ÃâÇØ¾ß Çϸç ÀÏ¹Ý ÇÔ¼ö¿¡¼ È£ÃâÇØ¼´Â
¾ÈµÈ´Ù. ¸®¾×Æ® ³»ºÎ ±¸Á¶¿¡ Á¢±ÙÇÏ´Â µ¿ÀÛÀº ·£´õ¸µµÇ´Â ÄÄÆ÷³ÍÆ® ³»¿¡¼¸¸ ÇÊ¿äÇÏ´Ù.
¢º ¸®¾×Æ®´Â °¢ ÈŠȣÃâÀ» Ä÷º¼ÇÀ¸·Î °ü¸®ÇÏ¸ç ¼ø¼ÀÇ ÀÇÁ¸ÇÏ¿© »óŸ¦ ¿¬°áÇÑ´Ù. ±×·¡¼ ·£´õ¸µÇÒ ¶§¸¶´Ù Ç×»ó °°Àº ¼ø¼·Î È£ÃâÇÑ´Ù. À§ ÄÚµåÀÇ currentStateIndex º¯¼ö°¡ ¼ø¼¸¦ °ü¸®ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.
ÈÅÀ» Á÷Á¢ ¸¸µé¾î ¾µ ¼öµµ ÀÖ´Ù. À̶§´Â À§ÀÇ ±ÔÄ¢À» ÁؼöÇØ¾ß Çϰí
ÈÅÀ̶ó´Â °ÍÀ» ¸íÈ®È÷ Ç¥½ÃÇϱâ À§ÇØ À̸§À» Ç×»ó use·Î ½ÃÀÛÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù. ÀÌ Á¢µÎ¸¦ ºÙÀÌ´Â ¼ø°£ ESLint´Â ÈÅÀÇ ±ÔÄ¢À» Àß ÁöŰ´ÂÁö ¾Ë¾Æ¼
°Ë»çÇØ ÁØ´Ù.
ÈÅÀ» Àû±Ø Ȱ¿ëÇϸé ÇÔ¼ö¸¸À¸·Îµµ »óŸ¦ À¯ÁöÇÒ ¼ö ÀÖ°í »ý¸í Áֱ⠸޼µåµµ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ´É·ÂÀ» Ãѵ¿¿øÇϸé ÇÔ¼ö·Îµµ ÄÄÆ÷³ÍÆ®¸¦ ÃæºÐÈ÷ ¸¸µé ¼ö ÀÖ°í ÈξÀ ´õ Æí¸®ÇÏ´Ù. ¿äÁòÀº ¸ðµç ÄÄÆ÷³ÍÆ®¸¦ ÇÔ¼öÇüÀ¸·Î ¸¸µé °ÍÀ» ±ÇÀåÇϸç Ŭ·¡½º ÄÄÆ÷³ÍÆ®´Â À¢¸¸ÇÏ¸é ¾²Áö ¸»¶ó°í ±Ç°íÇÑ´Ù. ±×·¯³ª ´õ º¹ÀâÇÑ °æ¿ì¸¦ À§ÇØ Å¬·¡½º ÄÄÆ÷³ÍÆ®µµ °è¼Ó Áö¿øÇÒ °èȹÀ̶ó°í °ø½ÄÀûÀ¸·Î ¹ßÇ¥ÇÏ¿´´Ù.
Áö±Ý±îÁö ¸¸µç ScoreBoard, Counter, AdBox ÄÄÆ÷³ÍÆ®´Â
¸ðµÎ ÇÔ¼öÇüÀÌ´Ù. Ŭ·¡½ºÇüº¸´Ù °£ÆíÇØ ¾²±âµµ ÆíÇϰí ÄÄÆ÷³ÍÆ®·Î¼ÀÇ ¿ä°ÇÀº ´Ù °®Ãß°í ÀÖ¾î ±â´ÉÀûÀ¸·Îµµ
¿Ïº®ÇÏ´Ù. ±×·¯³ª ÇÔ¼öÇüÀ̶ó°í ÇØ¼ ¾Æ¹«·¸°Ô³ª ¸¸µé¾î µÇ´Â °ÍÀº ¾Æ´Ï°í ¿ä°ÇÀº ÁöÄÑ¾ß ÇÑ´Ù. ´ÙÀ½ ÄÄÆ÷³ÍÆ®´Â Ãâ·ÂµÇÁö ¾Ê´Â´Ù.
function
scoreBoard(props) {
return (
<>
<h2>¼ºÀûÇ¥</h2>
<p>{props.name}´ÔÀÇ Á¡¼ö´Â {props.score}ÀÔ´Ï´Ù.</p>
</>
)
}
function
App() {
return (
<>
<scoreBoard
name = "È«±æµ¿" score = "89"/>
</>
);
}
ÄÄÆ÷³ÍÆ®ÀÇ À̸§Àº HTML ÅÂ±×¿Í ±¸ºÐÇϱâ À§ÇØ Ã¹ÀÚ¸¦ ´ë¹®ÀÚ·Î ¾²µµ·Ï °Á¦ÇÑ´Ù. º°°É ´Ù °£¼·ÇÑ´Ù ½Í°ÚÁö¸¸ ±ÇÀå »çÇ×ÀÌ ¾Æ´Ï¶ó °Á¦ »çÇ×ÀÌ´Ù. ¼Ò¹®ÀÚ·Î
µÈ ű״ HTML ű׶ó°í ÀνÄÇØ ·£´õ¸µÇÏÁö ¾ÊÀ¸¸ç ¹«½ÃÇØ ¹ö¸°´Ù.
¿¡·¯°¡ ³ªÁö ¾Ê´Â ÀÌÀ¯´Â scoreBoard¶ó´Â HTML űװ¡ Àå·¡¿¡ »ý±æ ¼ö ÀÖ´Ù°í »ý°¢Çϰí DOM Æ®¸®¿¡ ±×´ë·Î
½á ¹ö¸®±â ¶§¹®ÀÌ´Ù. ºê¶ó¿ìÀúµµ ÀÌ Å±׸¦ ÀνÄÇÏÁö ¾ÊÀ¸¸ç Á¶¿ëÈ÷ ¹«½ÃÇÑ´Ù. ±×·¡¼ ¿¡·¯´Â ¾Æ´Ï¸ç ȸ鿡 ¾Æ¹« °Íµµ ³ªÅ¸³ªÁö ¾ÊÀ» »ÓÀÌ´Ù. ¶§·Î´Â
¸í½ÃÀûÀÎ ¿¡·¯º¸´Ù Á¶¿ëÇÑ ¹«½Ã°¡ ´õ À§ÇèÇÏ´Ù.
ÇÔ¼öÇü ÄÄÆ÷³ÍÆ®´Â function Ű¿öµå·Î ¸¸µå´Âµ¥ ²À ±×·¡¾ß ÇÏ´Â
°ÍÀº ¾Æ´Ï´Ù. ÇÔ¼öÀÇ ÇüÅÂÀ̱⸸ Çϸé ÇÔ¼ö ¸®ÅÍ·²À̳ª È»ìÇ¥ ÇÔ¼ö¸¦
const º¯¼ö·Î ´ëÀԹ޾Ƶµ µÈ´Ù. ÇÊ¿äÇÒ ¶§ È£ÃâÇÒ ¼ö¸¸ ÀÖÀ¸¸é µÈ´Ù. ´ÙÀ½ µÎ ÇüÅ ¸ðµÎ °¡´ÉÇÏ´Ù.
const ScoreBoard = function(props) {
....
const ScoreBoard = (props) => {
....
ÃëÇâ¿¡ µû¶ó ¼±ÅÃÇÒ ¹®Á¦ÀÌµÇ ³ª´Â ¸í½ÃÀûÀÎ ÇÔ¼ö ÇüŰ¡ °¡µ¶¼º¿¡ À¯¸®ÇÏ´Ù°í »ý°¢ÇÏ¿© ¼±È£ÇÏ´Â ÆíÀÌ´Ù. ÄÄÆ÷³ÍÆ®¸¦ Á¤ÀÇÇÒ ¶§´Â ¿ÏÀüÇÑ ÇÔ¼ö ÇüŸ¦ ÁÖ·Î »ç¿ëÇÑ´Ù. ±×·¯³ª
À̸§ÀÌ ¾ø´Â À͸í ÇÔ¼ö´Â ¾ÈµÈ´Ù. À͸í ÇÔ¼ö·Î Á¤ÀÇÇÏ´õ¶óµµ ¹Ýµå½Ã À̸§ÀÖ´Â º¯¼ö³ª »ó¼ö·Î ´ëÀԹ޾ƾß
ÇÑ´Ù. ÄÄÆ÷³ÍÆ®´Â Àç»ç¿ë¼ºÀÌ ±âº»Àε¥ À̸§ÀÌ ¾øÀ¸¸é °¡»ó DOM¿¡
ÄÄÆ÷³ÍÆ®·Î Æ÷ÇÔ½Ãų ¹æ¹ýÀÌ ¾ø´Ù.
¸®¾×Æ®´Â ¿©·¯ °¡Áö ÈÅÀ» Á¦°øÇÑ´Ù. ÈÅÀ» ÅëÇØ º¹ÀâÇÑ Ã³¸®¸¦ ¼öÇàÇÒ
¼ö Àֱ⠶§¹®¿¡ ÇÔ¼ö¸¸À¸·Îµµ ÄÄÆ÷³ÍÆ®¸¦ ÈǸ¢ÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù. ¸®¾×Æ®°¡ Á¦°øÇϴ ǥÁØ ÈźÎÅÍ Çϳª¾¿
ÀÍÇô º¸ÀÚ. »óŸ¦ °ü¸®ÇÏ´Â useState¿Í useReducer´Â ÀÌ¹Ì »ç¿ëÇØ ºÃ´Ù.
useEffect´Â ƯÁ¤ »óŰ¡ ¹Ù²ð ¶§ÀÇ ÈÄ¼Ó Ã³¸®¸¦ ¼öÇàÇÑ´Ù. ÇÑ °ªÀÌ ¹Ù²î¸é ÀÚ¿¬½º·´°Ô °°ÀÌ ¹Ù²î°Å³ª ¶Ç´Â ¿¬À̾î ó¸®ÇØ¾ß ÇÏ´Â Çʼö µ¿ÀÛÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î ¼îÇθô¿¡¼ »óǰÀ» Àå¹Ù±¸´Ï¿¡ ´ãÀ¸¸é Àå¹Ù±¸´ÏÀÇ »óǰ °³¼ö¸¦ Áõ°¡½ÃÄÑ¾ß ÇÑ´Ù. ÀÌó·³ º¯È¿¡ ÀÇÇØ ÀÚµ¿À¸·Î Àû¿ëµÇ´Â °ÍÀ» ºÎÈ¿°ú(Side Effect)¶ó°í
ÇÑ´Ù. ºÎ¼ö È¿°ú¶ó°í ¹ø¿ªÇϱ⵵ Çϴµ¥ ¿©±â¼´Â °¡±ÞÀû ªÀº ´Ü¾î¸¦ »ç¿ëÇÏÀÚ. »ç¿ëÇü½ÄÀº ´ÙÀ½°ú °°´Ù.
useEffect(ºÎÈ¿°úÄݹé, [°¨½Ã´ë»ó])
°¨½Ã´ë»óÀ» ¸í½ÃÇØ µÎ¸é ÀÌ °ªÀÌ ¹Ù²ð ¶§¸¶´Ù ºÎÈ¿°ú¸¦ ó¸®ÇÏ´Â ÄݹéÀ» È£ÃâÇÑ´Ù.
°¨½Ã´ë»óÀº ¹è¿¿¡ ¿©·¯ °³ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ °ª Áß Çϳª¶óµµ º¯ÇÒ ¶§¸¶´Ù ó¸®ÇØ¾ß ÇÒ
ÀÛ¾÷ÀÌ ÀÖÀ¸¸é Äݹé ÇÔ¼ö¿¡¼ ó¸®ÇÑ´Ù. Ä«¿îÆ®°¡ ¹Ù²ð ¶§ ·Î±×¸¦ Ãâ·ÂÇØ º¸ÀÚ. useState ¿¹Á¦¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.
import
{useEffect} from 'react';
function
Counter() {
const [count, setCount] = useState(10);
function decrease() {
setCount(count - 1)
}
function increase() {
setCount(count + 1)
}
function doEffect() {
console.log('ÇöÀç Ä«¿îÆ® : ' + count)
}
useEffect(doEffect, [count])
return (
<>
<h2>{count}</h2>
<button
onClick={decrease}>°¨¼Ò</button>
<button
onClick={increase}>Áõ°¡</button>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
)
}
¹èÆ÷ ¿¹Á¦ ¼±µÎ¿¡´Â import¹®ÀÌ ¹Ì¸® ÀÛ¼ºµÇ¾î ÀÖÁö¸¸ »õ·Î¿î ÈÅÀ»
¾µ ¶§¸¶´Ù import ¹®Àº ¾Ë¾Æ¼ Ãß°¡ÇØ¾ß ÇÔÀ» ÀØÁö ¸»ÀÚ. useEffec¿¡
ÀÇÇØ count »óŰ¡ ¹Ù²î¸é doEffect ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. Áõ°¨ ¹öưÀ» ´·¯ º¸¸é ÄܼÖâ¿¡ ·Î±×°¡ ³ªÅ¸³´Ù. ¿©±â¼´Â È®ÀÎÀ»
À§ÇØ ·Î±×¸¸ Âï¾î ºÃ´Âµ¥ Ä«¿îÆ® º¯°æ ÈÄ ÇØ¾ß ÇÒ º¹ÀâÇÑ µ¿ÀÛÀ» ó¸®ÇÒ ¼öµµ ÀÖ´Ù.
count°¡ ¹Ù²î´Â ½ÃÁ¡¿¡ ¾î¶² ÀÏÀ» ÇÏ·Á¸é increase, decrease ÇÔ¼ö¿¡¼ Á÷Á¢ ó¸®ÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½°ú
°°ÀÌ ¹Ù²ï ½ÃÁ¡¿¡ ºÎÈ¿°ú¸¦ ó¸®Çصµ ÀÏ´Ü È¿°ú´Â °°´Ù.
function decrease() {
setCount(count -
1)
console.log('ÇöÀç
Ä«¿îÆ® : ' + count)
}
function increase() {
setCount(count +
1)
console.log('ÇöÀç
Ä«¿îÆ® : ' + count)
}
±×·¯³ª ÀÌ·± ½ÄÀ̶ó¸é count¸¦ ¹Ù²Ù´Â ¸ðµç °÷¿¡ ÀÌ Äڵ带 ÀÛ¼ºÇؾß
ÇÏ´Ï ºñÈ¿À²ÀûÀÌ´Ù. ¶Ç »óÅ °»½ÅÀº ºñµ¿±âÀûÀ̶ó Áõ°¨ÇÑ ÈÄ¿¡ Àо
count´Â ÀÌÀü °ªÀÌ¾î¼ ÇѹÚÀÚ ´À¸®´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. ÇöÀç Ä«¿îÆ® Ãâ·ÂÀ̶ó´Â ¾ÖÃÊ¿¡
¸ñÀû¿¡ ¸ÂÁöµµ ¾Ê´Ù.
useEffect·Î °¨½Ã ´ë»óÀ» ÁöÁ¤ÇØ µÎ¸é ¹Ù²î´Â ½ÃÁ¡À» Á¤È®È÷
¾Ë ¼ö ÀÖ´Ù. ¶ÇÇÑ °¨½Ã ´ë»óÀ» ¿©·¯ °³ ÁöÁ¤ÇÏ¿© Çϳª¶óµµ ¹Ù²ð ¶§ ÇѲ¨¹ø¿¡ ºÎÈ¿°ú¸¦ ó¸®ÇÒ ¼ö ÀÖ´Â
ÀÌÁ¡µµ ÀÖ´Ù. count »Ó¸¸ ¾Æ´Ï¶ó delta, score°¡
¹Ù²ð ¶§µµ ¶È°°Àº ºÎÈ¿°ú 󸮰¡ ÇÊ¿äÇÏ´Ù¸é [] °ýÈ£¾È¿¡ °¨½Ã ´ë»óÀ» ³ª¿ÇÑ´Ù.
useEffect(doEffect, [count, delta, score])
¼¼ »óÅÂÁß Çϳª¶óµµ ¹Ù²î¸é doEffect°¡ È£ÃâµÈ´Ù. ÀÌ ÇÔ¼ö´Â ¼¼ »óŰªÀ» Á¾ÇÕÀûÀ¸·Î °í·ÁÇÏ¿© ºÎÈ¿°ú¸¦ ó¸®ÇÑ´Ù. ¸¸¾à
°¢ »óź°·Î ó¸®ÇÒ ºÎÈ¿°ú°¡ ´Ù¸£´Ù¸é °¢ »óÅ¿¡ ´ëÇØ useEffect¸¦ µû·Î ÁöÁ¤ÇÑ´Ù.
useEffect(doCountEffect, [count]);
useEffect(doDeltaEffect, [delta]);
useEffect(doScoreEffect, [score]);
ÀÌ·¸°Ô µÇ¸é °¢ »óÅÂÀÇ º¯È¿¡ ´ëÇØ µ¶¸³ÀûÀΠ󸮸¦ ¼öÇàÇÒ ¼ö ÀÖ´Ù. ºÎÈ¿°ú
ÁöÁ¤ÀÇ °³¼ö Á¦ÇÑÀº ¾ø´Ù.
¾î¶² ÄÄÆ÷³ÍÆ®´Â È®½ÇÇÑ ÃʱâÈ¿Í ±ò²ûÇÑ Á¾·á 󸮰¡ Áß¿äÇÏ´Ù. ½º½º·Î
ÀÚ½ÅÀÇ ½ÇÇà ȯ°æÀ» ¸¸µé°í ´Ù ¾²°í³ ´ÙÀ½¿¡´Â Á¤¸®ÇÏ°í ³ª°¡¾ß ÇÑ´Ù. ÀÌ·± 󸮴 º¸Åë »ý¸í ÁÖ±âÀÇ onCreate¿Í onDestroy µî¿¡¼ ó¸®Çϴµ¥ ¸®¾×Æ® ÄÄÆ÷³ÍÆ®¿¡µµ
ºñ½ÁÇÑ ½ÃÁ¡ÀÌ ÀÖ´Ù.
useEffectÀÇ °¨½Ã´ë»óÀº ÇϳªÀÏ ¼öµµ ÀÖ°í ¿©·¯ °³ÀÏ ¼öµµ ÀÖ´Ù. °¨½Ã ´ë»óÀÌ ¾Æ¿¹ ¾ø°Å³ª ºó ¹è¿·Î ÁöÁ¤ÇÏ¸é Æ¯¼öÇÑ È¿°ú°¡ ³ªÅ¸³´Ù. °¨½Ã´ë»óÀ»
ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ·£´õ¸µÇÒ ¶§¸¶´Ù ºÎÈ¿°ú¸¦ ó¸®ÇÑ´Ù.
useEffect(Äݹé) // ·£´õ¸µÇÒ ¶§¸¶´Ù ÄݹéÀ» È£ÃâÇÑ´Ù.
useEffect(Äݹé, []) // óÀ½ ·£´õ¸µÇÒ ¶§ µü Çѹø¸¸ È£ÃâÇÑ´Ù.
ºó ¹è¿À» Àü´ÞÇϸé ÄÄÆ÷³ÍÆ®¸¦ ÃÖÃÊ ·ÎµåÇÒ ¶§ Ãʱâȸ¦ ¼öÇàÇÑ´Ù. ¶Ç
ÄݹéÀº ¸®ÅϰªÀ¸·Î Á¤¸® ÇÔ¼ö¸¦ ¸®ÅÏÇÒ ¼ö Àִµ¥ ÀÌ ÇÔ¼ö´Â ÄÄÆ÷³ÍÆ®¸¦ Á¾·áÇÒ ¶§ È£ÃâµÈ´Ù. ÀÌ µÎ ±â´ÉÀ»
»ç¿ëÇϸé ÃʱâÈ¿Í Á¾·á 󸮸¦ ¸ÚÁö°Ô ¼öÇàÇÒ ¼ö ÀÖ´Ù. ÄÄÆ÷³ÍÆ®ÀÇ »ý¸í ÁÖ±âÀÇ Ã³À½°ú ³¡¿¡ ´ÙÀ½ µÎ
»ç°ÇÀÌ ¹ß»ýÇÑ´Ù.
¢º¸¶¿îÆ® : ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇϰí
À¥ ÆäÀÌÁöÀÇ DOM¿¡ ÇϳªÀÇ ³ëµå·Î ÀÚ¸® Àâ´Â´Ù. À̶§ºÎÅÍ
»ç¿ëÀÚ ´«¿¡ º¸ÀÌ¸ç ½º½º·Î µ¿ÀÛÇϱâ À§ÇÑ Ãʱâȸ¦ ¼öÇàÇÑ´Ù.
¢º¾ð¸¶¿îÆ® : ÄÄÆ÷³ÍÆ®¸¦ ¼û°Ü DOM¿¡¼ Á¦°ÅµÈ´Ù. ȸ鿡¼ »ç¶óÁö¹Ç·Î ÃʱâȽà ÇÒ´çÇß´ø ÀÚ¿øÀ»
¹Ý³³ÇØ¾ß ÇÑ´Ù.
useEffect ÈÅÀ¸·Î ¸¶¿îÆ®¿Í ¾ð¸¶¿îÆ® ½ÃÁ¡À» Àâ¾Æ ó¸®ÇØ º¸ÀÚ. ÀÌ ½Ç½ÀÀ» ÇÏ·Á¸é ÄÄÆ÷³ÍÆ®¸¦ ¼û±â°í º¸À̴ ó¸®°¡ ÇÊ¿äÇØ ºÎ¸ð ÄÄÆ÷³ÍÆ®¸¦ ¸¸µé°í ÀÚ½Ä ÄÄÆ÷³ÍÆ®¿¡¼ useEffect¸¦ ó¸®ÇÑ´Ù. ÀÚ¿ø ÇÒ´çÀ̳ª ÇØÁ¦ µîÀº º¹ÀâÇÏ´Ï ·Î±×¸¦
Âï¾î Á¦´ë·Î ¹ß»ýÇÏ´ÂÁö¸¸ È®ÀÎÇØ º¸ÀÚ.
function
Child() {
function onMount() {
console.log('¾È³çÇϼ¼¿ä.')
return onUnMount;
}
function onUnMount() {
console.log('¾È³çÈ÷ °¡¼¼¿ä.')
}
useEffect(onMount, [])
return (
<>
<h2>Àú´Â
º¸ÀÌ´Ù°¡ ¸»´Ù°¡ ÇÕ´Ï´Ù.</h2>
</>
)
}
function
Parent() {
const [show, setShow] = useState(true)
return (
<>
<button
onClick={() => setShow(!show)}>{show ? "¼û±â±â"
: "º¸À̱â"}</button>
{show &&
<Child />}
</>
)
}
function
App() {
return (
<>
<Parent />
</>
)
}
ºÎ¸ð´Â ÀÚ½ÄÀÇ º¸À̱⠻óŸ¦ °ü¸®ÇÏ¸ç ¹öưÀ» ´©¸¦ ¶§ ÀÚ½ÄÀ» Åä±ÛÇÑ´Ù. ÀÚ½ÄÀº useEffect ÈÅÀÇ °¨½Ã ´ë»ó¿¡ ºó °ýÈ£¸¦ Àû¾î ¸¶¿îÆ®µÉ ¶§ onMount¸¦
È£ÃâÇϵµ·Ï Çß´Ù. óÀ½ µîÀåÇÒ ¶§ Àλ縻À» Ãâ·ÂÇÑ´Ù. onMount´Â
Á¾·á 󸮸¦ ÇÒ ÇÔ¼ö¸¦ ¸®ÅÏÇϴµ¥ Àλ縻À» Ãâ·ÂÇÏ´Â onUnMount ÇÔ¼ö¸¦ ¸®ÅÏÇß´Ù. ½ÇÇàÇØ º¸ÀÚ.

½ÃÀÛÇÏÀÚ ¸¶´Ù ·Î±×â¿¡ '¾È³çÇϼ¼¿ä.'
Àλ縻ÀÌ ³ªÅ¸³´Ù. ¹öưÀ» ´·¯ ¼û±â¸é '¾È³çÈ÷
°¡¼¼¿ä.' Àλ縻À» Ãâ·ÂÇÑ´Ù. ´Ù½Ã º¸ÀÌ¸é ¶Ç Àλ縻ÀÌ ³ªÅ¸³´Ù. ¸¶¿îÆ®½Ã ´Ù½Ã ¼û°å´Ù ³ªÅ¸³ª´Â °Íó·³ º¸ÀÌ´Â ÀÌÀ¯´Â main.tsx¿¡
¼³Á¤µÈ ¾ö°Ý ¸ðµå( <React.StrictMode>) ¶§¹®ÀÌ´Ù. ÀÌ ¸ðµå¸¦ ¾ø¾Ö°Å³ª ÇÁ·Î´ö¼Ç ȯ°æ¿¡¼´Â Á¤»óÀûÀ¸·Î Çѹø¸¸ Ãâ·ÂµÈ´Ù.
¸¶¿îÆ®/¾ð¸¶¿îÆ®¿¡ ´ëÇØ Á¦´ë·Î È£ÃâµÊÀ» ¾Ë ¼ö ÀÖ´Ù. µÎ ½ÃÁ¡¿¡ ¿øÇÏ´Â ÃʱâÈ¿Í Á¾·á 󸮸¦ ÇÏ¸é µÈ´Ù. Äڵ带 ÀÌÇØÇϱâ
½±µµ·Ï onMount, onUnMount ÇÔ¼ö¸¦ Á¤ÀÇÇߴµ¥ Çѹø¸¸ ¾µ ÇÔ¼öÀ̹ǷΠÀζóÀÎÀ¸·Î ½áµµ µÈ´Ù.
useEffect(() => {
console.log('¾È³çÇϼ¼¿ä.')
return () => console.log('¾È³çÈ÷ °¡¼¼¿ä.')
},
[])
¶È°°Àº ÄÚµåÀÌÁö¸¸ ÇÔ¼öÀÇ Àμö¿¡ ÇÔ¼ö°¡ ÀÖ°í ±× ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â °Íµµ ÇÔ¼ö¶ó óÀ½ º¸¸é Çò°¥¸°´Ù. ÀÌ·± Äڵ带 ºü¸£°Ô ÆÄ¾ÇÇÒ ¼ö ÀÖµµ·Ï ½À°üÀÌ µé¾î¾ß ÇÑ´Ù.
useEffectÀÇ Ãʱâ, Á¾·á
ó¸® ½ÃÁ¡À» Àß È°¿ëÇϸé ŸÀ̸Ӹ¦ µ¹¸®¸ç °è¼Ó Áõ°¡Çϴ ŸÀ̸Ӹ¦ ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.
function
Counter() {
const [count, setCount] = useState(10);
useEffect(() => {
const timerId =
setInterval(() => setCount(count => count + 1), 1000)
return () =>
clearInterval(timerId)
}, []);
return (
<>
<h2>{count}</h2>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
)
}
¸¶¿îÆ®µÉ ¶§ 1ÃÊ ÁÖ±âÀÇ Å¸À̸Ӹ¦ ¼³Ä¡Çϰí ŸÀÌ¸Ó Äݹ鿡¼ count¸¦ 1 Áõ°¡½ÃŲ´Ù. setCount(count
+ 1)·Î Çϸé Ä«¿îÆ®°¡ Áõ°¡ÇÏÁö ¾ÊÀ¸¹Ç·Î ÇÔ¼ö¸¦ Àü´ÞÇØ¾ß ÇÑ´Ù.
Á¤¸® ÇÔ¼ö´Â ŸÀ̸Ӹ¦ ÇØÁ¦ÇÑ´Ù. ÇØÁ¦¸¦ À§ÇØ ¼³Ä¡ÇÑ Å¸À̸ÓÀÇ ID¸¦ timerId¿¡ ´ëÀÔÇØ µÎ°í ÇØÁ¦ÇÒ ¶§ Àü´ÞÇß´Ù. Áö¿ª º¯¼ö¿©¼ ÇØÁ¦½Ã °ªÀ» ÀÒ¾î ¹ö¸± °Å °°Áö¸¸ Ŭ·ÎÀú¿¡ °¤Çô ÀÖ¾î °ªÀ» °è¼Ó À¯ÁöÇÑ´Ù. ±²ÀåÈ÷ ¾ÈÁ¤ÀûÀÎ ÄÚµåÀÌ¸ç ±ÇÀåµÇ´Â ÆÐÅÏÀÌ´Ù.
ÀÌ ¿¹Á¦ÀÇ °æ¿ì ÆäÀÌÁö¸¦ ¶°³¯ ¶§³ª ºê¶ó¿ìÀú¸¦ ´ÝÀ» ¶§¸¸ ¾ð¸¶¿îÆ®µÇ¹Ç·Î ȸéÀÌ ½ÇÇàÁßÀÎ µ¿¾È¿¡´Â ŸÀ̸Ӱ¡ ¸ØÃßÁö
¾Ê´Â´Ù.
useRef ÈÅÀº °ª¿¡ ´ëÇÑ ÂüÁ¶¸¦ ÀúÀåÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ´Ü¼øÈ÷ ÀúÀ常 Çϱ⠶§¹®¿¡ °ª º¯È¿¡ ´ëÇØ ·£´õ¸µÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù´Â Á¡¿¡¼ »óÅ¿ʹ ´Ù¸£´Ù. ÀÌ·± Ư¼ºÀ» ÀÌ¿ëÇÏ¿© DOM ¿¤¸®¸ÕÆ®¸¦ Á¦¾îÇϰųª °ªÀ» ÀÐÀ» ¶§
ÂüÁ¶¸¦ ÀúÀåÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ À̸§¿¡ ´ëÇØ Àλ縻À» Ãâ·ÂÇÑ´Ù.
import
{useRef} from 'react';
function
Login() {
const nameInput = useRef(null);
return (
<>
<input
ref={nameInput} type="text"></input>
<button
onClick={()=>{alert('¾È³çÇϼ¼¿ä ' +
nameInput.current.value + '´Ô')}}>Àλç</button>
</>
)
}
function
App() {
return (
<>
<Login />
</>
);
}
ÀÔ·Â ÄÁÆ®·Ñ°ú ¹öưÀ» ¹èÄ¡Çϰí À̸§À» ÀÔ·ÂÇÑ ÈÄ ÀÎ»ç ¹öưÀ» ´©¸£¸é »ç¿ëÀÚÀÇ À̸§À» ÀÐ¾î ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.

ÀÌ µ¿ÀÛÀÌ °¡´ÉÇÏ·Á¸é »ç¿ëÀÚ°¡ ÀÔ·Â ÄÁÆ®·Ñ¿¡ ÀûÀº À̸§À» Àоî¾ß Çϸç À̸¦ À§ÇØ ÀÔ·Â ÄÁÆ®·ÑÀÇ ÂüÁ¶°¡ ÇÊ¿äÇÏ´Ù. ÄÁÆ®·Ñ¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¾ò±â À§ÇØ useRef ÈÅÀ» »ç¿ëÇÑ´Ù. useRefÀÇ Àμö·Î ÃʱⰪÀ» ÁöÁ¤Çϴµ¥ ÃÖÃÊ ·£´õ¸µÇÒ ¶§´Â DOM ¿ä¼Ò°¡
¾ÆÁ÷ »ý¼ºµÇ¾î ÀÖÁö ¾Ê¾Æ °¡¸®Å³ ¼ö ¾ø´Ù. ±×·¡¼ ÃʱⰪÀ» null·Î
ÁÖ¾î ´ë»óÀÌ ¾øÀ½À» ºÐ¸íÈ÷ Ç¥½ÃÇϰí ÂüÁ¶ÇÒ ¿¤¸®¸ÕÆ®ÀÇ ref ¼Ó¼º¿¡ ÂüÁ¶ º¯¼ö¸¦ ´ëÀÔÇÏ´Â ½ÄÀ¸·Î ÃʱâÈÇÑ´Ù.
<input ref={nameInput} ÁöÁ¤¿¡ ÀÇÇØ ÀÌÈĺÎÅÍ
nameInput º¯¼ö°¡ ÀÌ ÄÁÆ®·ÑÀ» °¡¸®Å°¸ç input ¿¤¸®¸ÕÆ®¸¦
ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ÂüÁ¶ÇÒ ¿¤¸®¸ÕÆ®¸¦ ÀÐÀ» ¶§´Â current ¼Ó¼ºÀ»
Àд´Ù. nameInput.current°¡ ÀÔ·Â ÄÁÆ®·ÑÀ̰í value
¼Ó¼ºÀ» ÅëÇØ »ç¿ëÀÚ°¡ ÀÔ·ÂÇØ ³õÀº ³»¿ëÀ» ÀÐÀ» ¼ö ÀÖ´Ù.
ÄÁÆ®·ÑÀÇ °ªÀ» Àд °Í ¿Ü¿¡ focus ¸Þ¼µå·Î Æ÷Ä¿½º¸¦ ÁÙ ¼öµµ
ÀÖ°í style.visibility ¼Ó¼º¿¡ 'hidden'À»
´ëÀÔÇÏ¿© ¼û±æ ¼öµµ ÀÖ´Ù. ÂüÁ¶¸¸ °¡Áö°í ÀÖÀ¸¸é ¾î¶² µ¿ÀÛÀÌµç °¡´ÉÇÏ´Ù. useRef ÈÅÀ» ¾²´Â ´ë½Å DOM ÇÔ¼ö·Î Á÷Á¢ ¿¤¸®¸ÕÆ®¸¦ ã¾Æ¼
ÂüÁ¶ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ÂüÁ¶ÇÒ ÄÁÆ®·Ñ¿¡ id ¼Ó¼ºÀ» ÁöÁ¤Çϰí getElementById ÇÔ¼ö·Î ãÀ¸¸é µÈ´Ù.
function Login() {
return (
<>
<input
id="who" type="text"></input>
<button
onClick={()=>{alert('¾È³çÇϼ¼¿ä ' +
document.getElementById("who").value + '´Ô')}}>
Àλç</button>
</>
)
}
ÀÌ·¸°Ô ¾²¸é ¹öưÀ» ´©¸¦ ¶§¸¶´Ù ¸Å¹ø »õ·Î ãÀ¸´Ï ¼Óµµ°¡ ´À¸®´Ù. useRef´Â
ÃÖÃÊ µü Çѹø¸¸ ã¾Æ ³õ°í ·£´õ¸µÀ» ´Ù½Ã ÇØµµ ±× ÂüÁ¶¸¦ À¯ÁöÇϹǷΠ´õ ºü¸£´Ù. ¹öư Ŭ¸¯½ÃÀÇ ¹ÝÀÀ
¼ÓµµÂ÷ Á¤µµ´Â Å« ÀÇ¹Ì ¾øÁö¸¸ ·çÇÁ³»¿¡¼ ÀÚÁÖ ÂüÁ¶ÇÑ´Ù¸é ½É°¢ÇÑ Â÷À̰¡ ¹ß»ýÇÑ´Ù.
¸®¾×Æ®¿¡¼ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ¾µ ¼ö ÀÖÀ¸¹Ç·Î DOMÀ» Á÷Á¢ Á¶ÀÛÇÏ´Â °ÍÀÌ
°¡´ÉÇÏÁö¸¸ ±ÇÀåÇÏÁö ¾Ê´Â´Ù. ¸®¾×Æ®´Â °¡»ó DOM¿¡ ±â¹ÝÇÏ¿©
µ¿ÀÛÇϴµ¥ ¿ÜºÎ¿¡¼ ÀÓÀÇ·Î DOMÀ» º¯°æÇØ ¹ö¸®¸é ¸®¾×Æ®°¡ ÀÌ »ç½ÇÀ» ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. µÎ ¹æ¹ýÀ¸·Î DOMÀ» Á¶ÀÛÇÏ¸é ¼º´É ÃÖÀûȵµ ÇÒ ¼ö ¾øÀ¸¸ç º¹ÀâÇØÁö°í
¿¹Ãøµµ ¾î·Á¿ö °ñÄ¡¾ÆÇ ¹ö±×ÀÇ ¿øÀÎÀÌ µÈ´Ù.
Æ÷Ä¿½º °ü¸®, ¸ÖƼ¹Ìµð¾î Àç»ý, ¿ÜºÎ
¶óÀ̺귯¸®¿ÍÀÇ ¿¬µ¿ µî ¸®¾×Æ®·Î ó¸®Çϱ⠾î·Á¿î °æ¿ì¿¡ ÇÑÇØ¼¸¸ Á¶½É½º·´°Ô »ç¿ëÇØ¾ß ÇÏ¸ç ¸®¾×Æ® ³»ºÎÀÇ »óÅÂ¿Í µ¿±âÈÇϵµ·Ï Ç×»ó ½Å°æ½á¾ß ÇÑ´Ù.
useRef´Â ÄÄÆ÷³ÍÆ®³»ÀÇ ¿µ±¸ µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â ¿ëµµ·Îµµ »ç¿ëÇÑ´Ù. ÇÔ¼ö ³»ºÎÀÇ Áö¿ª º¯¼ö´Â ¿µ±¸ÀûÀ¸·Î °ªÀ» ÀúÀåÇÏÁö ¸øÇÏÁö¸¸ useRef·Î
ÀúÀåÇÏ¸é °ªÀ» À¯ÁöÇÒ ¼ö ÀÖ´Ù. ÇÔ¼ö ÄÄÆ÷³ÍÆ®°¡ Ŭ·¡½º ¼öÁØÀÇ ÀνºÅϽº º¯¼ö¸¦ °¡Áú ¼ö ÀÖµµ·Ï ÇØ ÁØ´Ù.
¾Õ¿¡¼ useEffect ÈÅÀ¸·Î ±¸ÇöÇÑ Å¸À̸Ӵ ½ÃÀÛ Á÷ÈĺÎÅÍ ³¡³¯
¶§±îÁö °¡µ¿ÇϹǷΠÈÅ ³»ºÎÀÇ Áö¿ª º¯¼ö¿¡ ŸÀÌ¸Ó ID¸¦ ÀúÀåÇØµµ ¹®Á¦°¡ ¾ø¾ú´Ù. À̹ø¿¡´Â ½ÇÇàÁß¿¡ ¹öưÀ¸·Î ½ÃÀÛ, ÁßÁö¸¦ ¸í·ÉÇÒ ¼ö Àִ ŸÀ̸Ӹ¦
¸¸µé¾î º¸ÀÚ. ŸÀ̸Ӹ¦ ¼³Ä¡, ÇØÁ¦ÇØ¾ß ÇϹǷΠŸÀÌ¸Ó ID¸¦ ÀúÀåÇØ¾ß Çϸç À̶§ useRef ÈÅÀ» »ç¿ëÇÑ´Ù.
function
Counter() {
const [count, setCount] = useState(10);
const timerRef = useRef(null);
function handleStart() {
if (timerRef.current ===
null) {
timerRef.current
= setInterval(() =>
setCount(count => count + 1), 100)
}
}
function handleStop() {
if (timerRef.current !==
null) {
clearInterval(timerRef.current)
timerRef.current
= null
}
}
return (
<>
<h2>{count}</h2>
<button
onClick={handleStart}>½ÃÀÛ</button>
<button
onClick={handleStop}>ÁßÁö</button>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
)
}
¸¶¿îÆ® Á÷ÈÄ¿¡ ŸÀ̸Ӵ Á¤Áö »óÅÂÀÌ¸ç ±×·¡¼ useRefÈÅ¿¡¼ timerRef´Â null·Î ÃʱâÈÇÑ´Ù. ½ÃÀÛ ¹öưÀ» ´©¸£¸é 0.1ÃÊ ´ÜÀ§ÀÇ Å¸À̸Ӹ¦ »ý¼ºÇϰí timerRef.current¿¡ ID¸¦ ÀúÀåÇØ µÐ´Ù. useRef´Â ÂüÁ¶¸¸ ÀúÀåÇÒ »ÓÀÌ¸ç ³»ºÎÀÇ ½ÇÁ¦°ªÀº current ¼Ó¼ºÀ»
Àоî¾ß ÇÑ´Ù. ŸÀ̸ӿ¡¼ Ä«¿îÆ®¸¦ °è¼Ó Áõ°¡ÇÑ´Ù.
Á¤Áö ¹öưÀ» ´©¸£¸é ÀúÀåÇØµÐ ID¸¦ »ç¿ëÇÏ¿© ŸÀ̸Ӹ¦ ÇØÁ¦Çϸç null·Î ¹«È¿ÈÇÑ´Ù. ½ÃÀÛ, Á¤Áö½Ã if¹®À¸·Î ŸÀ̸ÓÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏ¿© ÀÌ¹Ì ¼³Ä¡ÇÑ »óÅ¿¡¼ À缳ġÇÏÁö ¾Êµµ·Ï Çß´Ù. ÇØÁ¦½Ã¿¡µµ ¿øÄ¢¿¡ µû¶ó Á¶°ÇÀ» Á¡°ËÇϰí´Â ÀÖÁö¸¸ clearIntervalÀÌ
¹«È¿ÇÑ ID´Â ¹«½ÃÇϹǷΠ½ÇÁ¦·Î´Â »ý·«Çصµ ¹«¹æÇÏ´Ù. ÃÖÃÊ
½ÃÀÛ ÈÄ Á¤Áö »óÅÂÀÌ¸ç ½ÃÀÛ ¹öưÀ» ´©¸£¸é ŸÀ̸Ӱ¡ µ¹°í ÁßÁö ¹öưÀ» ´©¸£¸é Ä«¿îÆ®¸¦ ¸ØÃá´Ù.

ÀÌ ¿¹Á¦¿¡¼ timerRef´Â ÇÔ¼ö ³»ºÎ¿¡ ÀÖÁö¸¸ useRef ÈÅ¿¡ ÀÇÇØ ¸¶Ä¡ ¸â¹ö º¯¼öó·³ °ªÀ» °è¼Ó À¯ÁöÇÑ´Ù. ID´Â
´Ü¼øÇÑ °ªÀÌ´Ï Áö¿ª º¯¼ö·Î ÀúÀåÇØµµ µÉ °Å °°Áö¸¸ Àý´ë ¾ÈµÈ´Ù. ¿Ö ±×·±Áö ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.
function Counter() {
const
[count, setCount] = useState(10);
let
timerId = null;
function handleStart() {
if (timerId === null) {
timerId =
setInterval(() =>
setCount(count => count + 1), 100)
}
}
function handleStop() {
if (timerId !== null) {
clearInterval(timerId)
timerId = null
}
}
....
timerId°¡ Áö¿ª º¯¼öÀ̸é ÇÔ¼ö°¡ ½ÇÇàÁßÀÎ µ¿¾È¸¸ °ªÀ» À¯ÁöÇϸç
´ÙÀ½ ·£´õ¸µ½Ã¿¡´Â ÃʱⰪÀÎ null·Î µ¹¾Æ°¡ ¹ö¸°´Ù. ID¸¦
ÀÒ¾î ¹ö¸®¸é ÇØÁ¦ÇÒ ¼ö ¾øÀ¸¹Ç·Î ÁßÁö ¹öưÀ» ´·¯µµ ŸÀ̸Ӱ¡ ¸ØÃßÁö ¾Ê´Â´Ù. »Ó¸¸ ¾Æ´Ï¶ó ½ÃÀÛ ¹öưÀ»
¶Ç ´©¸£¸é ÀÌÀü ŸÀ̸ӿʹ ´Ù¸¥ »õ·Î¿î ŸÀ̸Ӹ¦ Çϳª ´õ ¼³Ä¡ÇÏ¿© Ä«¿îÆ®°¡ ¸Å Áֱ⸶´Ù 2¹ø Áõ°¡ÇÑ´Ù.
¶ÇÇÑ ÄÄÆ÷³ÍÆ®¸¦ ¾ð¸¶¿îÆ®Çϰųª ÆäÀÌÁö¸¦ ¹þ¾î³ªµµ ŸÀ̸Ӹ¦ ÇØÁ¦ÇÒ ¼ö ¾øÀ¸¹Ç·Î ¸®¼Ò½º°¡ ´©ÃâµÇ´Â ½É°¢ÇÑ ¹®Á¦°¡
¹ß»ýÇÑ´Ù. ÀÌ ¸ðµç ¹®Á¦ÀÇ ¿øÀÎÀº ÇÔ¼ö ÄÄÆ÷³ÍÆ®ÀÇ Áö¿ª º¯¼ö°¡ °ªÀ» ¿µ±¸ÀûÀ¸·Î ÀúÀåÇÒ ´É·ÂÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ ´É·ÂÀ» ºÎ¿©ÇÏ´Â ÀåÄ¡°¡ ¹Ù·Î useRefÈÅÀÌ´Ù.
¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ¹ýÀº Ç×»ó ¿©·¯ °¡Áö°¡ ÀÖ´Ù. °¢ ¹æ¹ý¸¶´Ù Àå´ÜÁ¡ÀÌ
ÀÖ°í À߸øµÈ ¹æ¹ýÀ» ¼±ÅÃÇϸé ÇÔÁ¤¿¡ ºüÁú À§Çèµµ ÀÖ´Ù. ŸÀ̸Ӹ¦ ¼³Ä¡/ÇØÁ¦ÇÏÁö
¸»°í useEffect¿¡¼ °è¼Ó ¼³Ä¡ÇØ µÎµÇ isRunning »óŰª
Çϳª·Î Ä«¿îÆ® Áõ°¡ ¿©ºÎ¸¦ ÅëÁ¦ÇÏ´Â ¹æ¹ýµµ °¡´ÉÇÏ´Ù.
¾î¶² µ¿ÀÛÀ» ÇÒ °ÍÀÎÁö ¸» °ÍÀÎÁö´Â µÑ Áß Çϳª¸¦ ¼±ÅÃÇÏ´Â ¹®Á¦À̹ǷΠ»óÅ·ΠÀúÀåÇϰí ÅëÁ¦ÇÒ ¼ö ÀÖ´Ù. °ú¿¬ °¡´ÉÇÑÁö ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.
function
Counter() {
const [count, setCount] = useState(10);
const [isRunning, setIsRunning] =
useState(false);
useEffect(() => {
const timerId =
setInterval(() => {
if
(isRunning) {
setCount(count => count + 1)
}
}, 100)
return () =>
{
clearInterval(timerId)
}
}, [isRunning]);
return (
<>
<h2>{count}</h2>
<button
onClick={() => setIsRunning(true)}>½ÃÀÛ</button>
<button
onClick={() => setIsRunning(false)}>ÁßÁö</button>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
)
}
isRunning »óÅ´ ī¿îÆ® Áõ°¡ ¿©ºÎ¸¦ °áÁ¤ÇÏ´Â Çã°¡ º¯¼öÀ̸ç
ÃʱⰪÀº falseÀÌ´Ù. µÎ ¹öưÀ» Ŭ¸¯Çϸé isRunningÀÇ »óŰªÀ» º¯°æÇÏ°í »óŰ¡ ¹Ù²ð ¶§ ŸÀ̸ÓÀÇ µ¿ÀÛÀÌ ¹Ù²î¾î¾ß ÇϹǷΠuseEffect ÈÅÀÇ °¨½Ã ´ë»ó¿¡ [isRunning]À» ¹Ýµå½Ã
Àû¾î¾ß ÇÑ´Ù.
isRunningÀÇ »óŰ¡ ¹Ù²î¸é
useEffect´Â Á¤¸® ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ŸÀ̸Ӹ¦ ÇØÁ¦ÇÏ°í ¹Ù²ï »óÅ¿¡ µû¶ó ŸÀ̸Ӹ¦ Àç°¡µ¿ÇÑ´Ù. isRunningÀÌ falseÀ̸é ŸÀ̸Ӹ¦ °¡µ¿ÇÏ´õ¶óµµ Ä«¿îÆ®¸¦ Áõ°¡½ÃŰ´Â µ¿ÀÛÀº ÇÏÁö ¾Ê´Â´Ù. Áï, ŸÀ̸Ӵ Ç×»ó ¼³Ä¡ÇØ ³õµÇ isRunning¿¡ µû¶ó Ä«¿îÆ® Áõ°¡
¿©ºÎ°¡ ´Þ¶óÁø´Ù.
ÀÌ ¿¹Á¦ÀÇ µ¿ÀÛ ¹æ½ÄÀº ¾î·ÆÁö ¾Ê°Ô ÀÌÇØÇÒ ¼ö ÀÖ°í Äڵ尡 ¹Ù²ï ºÎºÐµµ ¸¹Áö ¾Ê´Ù. ±×·±µ¥ useEffectÀÇ °¨½Ã ´ë»ó¿¡ ¿Ö [isRunning]ÀÌ ÁöÁ¤µÇ¾î ÀÖÀ»±î? ÀÌ ÁöÁ¤ ¾øÀÌ [] ºó °ýÈ£¸¸ Àû¾î ³öµµ ŸÀ̸Ӵ ¼³Ä¡µÇ°í isRunning »óŰªÀº
Àß ¹Ù²ð °Íó·³ º¸ÀδÙ. °ú¿¬ ±×·±Áö Å×½ºÆ®ÇØ º¸ÀÚ.
useEffect(() => {
....
}, []);
ÀÌ·¯¸é ESLint°¡ ¸ÕÀú ÀÌ»óÀ» °¨ÁöÇϰí À§ÇèÇÏ´Ù´Â °æ°í¸¦ º¸³½´Ù. °¨½Ã ´ë»óÀ» »©¸é ¾ÈµÈ´Ù´Â Ãæ°íÀÌ´Ù.

ºñ·Ï °æ°í´Â ¹ß»ýÇÏÁö¸¸ ºó °ýÈ£´Â ¸¶¿îÆ®½Ã¿¡ Çѹø¸¸ ½ÇÇàÇ϶ó´Â ¶æÀ¸·Î ÀÌ ÀÚü°¡ ¹®¹ý ¿¡·¯´Â ¾Æ´Ï¾î¼ ½ÇÇàÀº
°¡´ÉÇÏ´Ù. °ú¿¬ Á¦´ë·Î µÇ´ÂÁö ½ÇÇàÇØ º¸¸é ºê¶ó¿ìÀú¿¡ ȸéÀº Á¦´ë·Î ³ªÅ¸³´Ù. ±×·¯³ª ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
useEffect´Â ¸¶¿îÆ®µÉ ¶§ µü Çѹø¸¸ ½ÇÇàµÇ°í À̶§ Ŭ·ÎÀú¿¡
ĸóµÇ´Â isRunningÀÇ ÃʱⰪÀº falseÀÌ´Ù. ÀÌÈÄ ½ÃÀÛ ¹öưÀ» ´·¯ isRunningÀ» true·Î ¹Ù²Ù¾îµµ ÀÌ¹Ì ¼³Ä¡ÇÑ Å¸À̸Ӵ ÀÌ º¯È¸¦ ¾Ë ¼ö ¾ø´Â »óÅÂÀÌ´Ù. ³°Àº
Ŭ·ÎÀú(Stale Closure)°¡ »óÅ º¯È¿¡ ¹ÝÀÀÇÏÁö ¾ÊÀ¸´Ï °á±¹ Ä«¿îÆ®´Â Áõ°¡ÇÏÁö ¾Ê´Â´Ù.
±×·¡¼ useEffectÀÇ ÀÇÁ¸ ¹è¿¿¡ isRunningÀ» Àû¾î ÀÌ »óŰ¡ ¹Ù²î¸é º¯°æµÈ »óŰªÀ» ÂüÁ¶ÇÏ¿© ŸÀ̸Ӹ¦ »õ·Î ¼³Ä¡Çϵµ·Ï ÇØ¾ß ÇÑ´Ù. useEffectÀÇ ºÎÈ¿°ú ó¸® Äڵ忡 isRunningÀ» ÂüÁ¶ÇÏ´Â
¹®ÀåÀÌ ÀÖÀ¸´Ï ÀÌ »óŰ¡ ¹Ù²î¸é ºÎÈ¿°ú¸¦ ´Ù½Ã ó¸®ÇØ¾ß ³í¸®ÀûÀÎ ÀÌ»óÀÌ ¾ø´Ù. ESLint´Â À̸¦ Á¤È®È÷
°£ÆÄÇÑ °ÍÀÌ´Ù.
ŸÀ̸Ӹ¦ Ç×»ó ¼³Ä¡ÇÏÁö ¾Ê°í isRunningÀÌ trueÀÏ ¶§¸¸ ¼³Ä¡ÇÏ´Â ¹æ¹ýµµ °¡´ÉÇÏ´Ù. ŸÀ̸ӿ¡¼ ÇÒ ÀÏÀÌ Ä«¿îÆ®
Áõ°¡¹Û¿¡ ¾ø´Ù¸é ºó ŸÀ̸Ӹ¦ ¼³Ä¡ÇÏ´Â °Íº¸´Ù´Â ¾Æ¿¹ ŸÀ̸Ӹ¦ ¼³Ä¡ÇÏÁö ¾Ê´Â ¹æ¹ýÀÌ ´õ °£´ÜÇÏ´Ù.
function
Counter() {
const [count, setCount] = useState(10);
const [isRunning, setIsRunning] =
useState(false);
useEffect(() => {
let timerId =
null;
if (isRunning) {
timerId = setInterval(() => {
setCount(count => count + 1)
},
1000)
}
return () =>
{
clearInterval(timerId)
}
}, [isRunning]);
return (
<>
<h2>{count}</h2>
<button
onClick={() => setIsRunning(true)}>½ÃÀÛ</button>
<button
onClick={() => setIsRunning(false)}>ÁßÁö</button>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
)
}
ÀÌ °æ¿ì ŸÀÌ¸Ó ID´Â Á¶°Ç¿¡ µû¶ó ¼³Ä¡ ¿©ºÎ°¡ ´Þ¶óÁö¹Ç·Î »ó¼öÀÏ
¼ö ¾øÀ¸¸ç º¯¼ö¿©¾ß ÇÑ´Ù. Çã°¡ »óŰ¡ ¹Ù²ð ¶§¸¶´Ù ŸÀ̸Ӹ¦ À缳ġÇϱâ À§ÇØ useEffectÀÇ ÀÇÁ¸ ¹è¿¿¡´Â isRunningÀ» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.
¾Æ¹« °Íµµ ÇÏÁö ¾Ê´Â ºó ŸÀ̸Ӹ¦ µ¹¸®´Â °Íº¸´Ù´Â ÀÌ ¹æ¹ýÀÌ ¸®¼Ò½º Àý¾à¿¡ À¯¸®ÇÏ´Ù. ¸¸¾à ŸÀ̸ӿ¡¼ ÇØ¾ß ÇÒ ´Ù¸¥ Àϵµ ÀÖ´Ù¸é À̶§´Â ¾Õ ¿¹Á¦Ã³·³ ŸÀ̸Ӵ °è¼Ó µ¹¸®°í »óÅ º¯¼ö´Â Ä«¿îÆ® Áõ°¡
¿©ºÎ¸¸ Á¦¾îÇÏ´Â ¹æ½ÄÀÌ ÀûÇÕÇÏ´Ù.
·£´õ¸µÀ» ÇÒ ¶§¸¶´Ù ó¸®ÇÒ ºÎÈ¿°ú°¡ ÀÖ´Ù°í ÇÏÀÚ. ½Ã°£ÀÌ ¾ó¸¶³ª °É·È´ÂÁö
ÃøÁ¤Çϰųª ÀÚ¿ø »ç¿ë·®À» ¾Ë¾Æ³¾ ¼öµµ Àִµ¥ ¿©±â¼´Â ·Î±×¸¸ Ãâ·ÂÇØ º¸ÀÚ. ·£´õ¸µÇÒ ¶§¸¶´Ù ½ÇÇàÇÒ ÄÚµå¶ó¸é useEffectÈÅÀÇ ÀÇÁ¸ ¹è¿À» ¾Æ¿¹ »ý·«ÇØ ¹ö¸®¸é µÈ´Ù.
function
Fruit() {
const [fruit, setFruit] =
useState("Choice")
function onRender() {
console.log('·£´õ¸µ')
}
useEffect(onRender)
return (
<>
<h2>{fruit}</h2>
<button
onClick={() =>
setFruit("Apple")}>Apple</button>
<button
onClick={() => setFruit("Orange")}>Orange</button>
<h2>Àú´Â
·£´õ¸µÇÒ ¶§¸¶´Ù ·Î±×¸¦ Âï½À´Ï´Ù.</h2>
</>
)
}
function
App() {
return (
<>
<Fruit />
</>
)
}
useEffect ÈÅ¿¡¼ ºÎÈ¿°ú ÇÔ¼ö·Î onRender¸¦ ÁöÁ¤Çϰí ÀÇÁ¸ ¹è¿Àº ÀûÁö ¾Ê¾Ò´Ù. ¹öưÀ» ´©¸¦ ¶§¸¶´Ù
·£´õ¸µÀ» ´Ù½Ã ÇÑ´Ù´Â ·Î±×°¡ Ãâ·ÂµÈ´Ù.

Àß µ¿ÀÛÇÏÁö¸¸ ¹º°¡ ½É½ÉÇÏ°í °°Àº ·Î±×¸¸ ÂïÈ÷´Ï Àç¹Ìµµ ¾ø´Ù. ´Ü¼øÈ÷
·£´õ¸µÀ» ÇÑ´Ù´Â »ç½Ç¸¸ ÂïÀ»°Ô ¾Æ´Ï¶ó ¸î ¹øÂ° ±×¸®´Â °ÍÀÎÁö Ä«¿îÆ®¸¦ Ãâ·ÂÇØ º¸ÀÚ. »óÅ º¯¼ö¸¦ Çϳª
´õ ¸¸µé°í ±×¸± ¶§¸¶´Ù 1¾¿ Áõ°¡½ÃŰ°í ±× °ªÀ» ÂïÀ¸¸é µÉ °Å °°´Ù.
function
Fruit() {
const [fruit, setFruit] =
useState("Choice")
const [rendCount, setRendCount] =
useState(0);
function onRender() {
setRendCount(rendCount + 1)
console.log('·£´õ¸µ ȸ¼ö : ' + rendCount)
}
useEffect(onRender)
return (
<>
<h2>{fruit}</h2>
<button
onClick={() =>
setFruit("Apple")}>Apple</button>
<button
onClick={() => setFruit("Orange")}>Orange</button>
<h2>Àú´Â
·£´õ¸µ ȸ¼ö¸¦ Ä«¿îÆ®ÇÕ´Ï´Ù.</h2>
</>
)
}
function
App() {
return (
<>
<Fruit />
</>
)
}
rendCount »óŸ¦ Á¤ÀÇÇϰí
onRender¿¡¼ 1 Áõ°¡½ÃŲ ÈÄ ±× °ªÀ» ·Î±×·Î Ãâ·ÂÇß´Ù. Apple, Orange ¹öưÀ» ´©¸¦ ¶§¸¶´Ù ·£´õ¸µ ȸ¼ö°¡ Áõ°¡ÇÒ °Å °°Áö¸¸ ½ÇÇàÇØ º¸¸é ±×¾ß ¸»·Î ³¸®°¡
³´Ù.

CPU´Â ¹ÌÃÄ ³¯¶Ù¸ç ÄÄÇ»ÅÍ ÆÒÀÌ ¿ì··Â÷°Ô µ¹±â ½ÃÀÛÇÑ´Ù. ÀÌ´ë·Î °è¼Ó ¹æÄ¡ÇÏ¸é ¹æÀÌ µû¶æÇØÁö´Â ³¹æ È¿°ú°¡ ³ªÅ¸³´Ù. ·£´õ¸µ
ȸ¼ö´Â ºü¸¥ ¼Óµµ·Î Áõ°¡Çϸç Áß°£ Áß°£¿¡ 'À̰Š³Ê¹« ÇÏÀݾÆ'¶ó´Â
Åõ´ú°Å¸²ÀÌ º¸ÀδÙ.
ÀÌ·¸°Ô µÇ´Â ÀÌÀ¯´Â onRender ÇÔ¼ö°¡ °úÀÏÀ» ¹Ù²Ü ¶§¸¸ È£ÃâµÇ´Â
°ÍÀÌ ¾Æ´Ï¶ó »óÅÂÁß Çϳª¶óµµ ¹Ù²ð ¶§¸¶´Ù È£ÃâµÇ±â ¶§¹®ÀÌ´Ù. onRender ¾È¿¡¼ rendCount »óŸ¦ ¹Ù²Ù°í ÀÖÀ¸´Ï °á±¹ ÀÚ½ÅÀÌ ÀÚ½ÅÀ» ´Ù½Ã È£ÃâÇÏ´Â ¹«ÇÑ ·çÇÁ¿¡ ºüÁø´Ù.
¹®Á¦ÀÇ ÇÙ½ÉÀº rendCount°¡ ·£´õ¸µÀ» À¯¹ßÇÏ´Â »óŰªÀ̶ó´Â °ÍÀÌ´Ù. ȸ鿡 Ãâ·ÂÇÏÁö ¾Ê°í ·Î±×·Î¸¸ Ãâ·ÂÇÒ ´Ü¼ø º¯¼öÀÓ¿¡µµ »óÅ·ΠÁ¤ÀÇÇÑ °ÍÀÌ ÆÐÂøÀÇ ¿øÀÎÀÌ´Ù. ±×·¸´Ù¸é »óŰ¡ ¾Æ´Ñ ´Ü¼ø º¯¼ö·Î Á¤ÀÇÇÏ¸é ¾î¶»°Ô µÉ±î?
function Fruit() {
const
[fruit, setFruit] = useState("Choice")
let
rendCount = 0;
function onRender() {
rendCount++
console.log('·£´õ¸µ ȸ¼ö : ' + rendCount)
}
..
ÀÌ ÄÚµå´Â ¸»½éÀº ¾øÁö¸¸ ·£´õ¸µ ȸ¼ö°¡ Ç×»ó 1ÀÌ´Ù. ¿Ö³ÄÇϸé Áö¿ª º¯¼ö´Â ÇÔ¼ö°¡ È£ÃâµÉ¶§¸¶´Ù Ãʱâȵǰí Ä«¿îÆ®°ªÀ» À¯ÁöÇÒ ´É·ÂÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. À§ µÎ ¿¹Á¦ÀÇ ¹®Á¦Á¡À» Á¤¸®ÇØ º¸¸é ´ÙÀ½°ú °°´Ù.
¢ºrendCount »óÅ : °ªÀº ±â¾ïÇÏÁö¸¸ º¯°æ¿¡ ÀÇÇØ ·£´õ¸µÀÌ ¹ß»ýÇÑ´Ù.
¢ºrendCount º¯¼ö : °ªÀ» ¹Ù²ãµµ ·£´õ¸µÀº ¹ß»ýÇÏÁö ¾ÊÁö¸¸ °ªÀ» ±â¾ïÇÏÁö ¸øÇÑ´Ù.
¹®Á¦¸¦ ¾Ë¾ÒÀ¸´Ï ÇØ°áÃ¥À» ã¾Æ¾ß ÇÑ´Ù. °ªÀ» ±â¾ïÇϸ鼵µ ·£´õ¸µÀ»
¹ß»ý½ÃŰÁö ¾Ê´Â ÀåÄ¡°¡ ÇÊ¿äÇϰ¡. ±×°Ô ¹Ù·Î useRefÀÌ´Ù.
function
Fruit() {
const [fruit, setFruit] =
useState("Choice")
const rendCount = useRef(0);
function onRender() {
rendCount.current++
console.log('·£´õ¸µ ȸ¼ö : ' + rendCount.current)
}
useEffect(onRender)
return (
<>
<h2>{fruit}</h2>
<button
onClick={() =>
setFruit("Apple")}>Apple</button>
<button
onClick={() => setFruit("Orange")}>Orange</button>
<h2>Àú´Â
·£´õ¸µ ȸ¼ö¸¦ Ä«¿îÆ®ÇÕ´Ï´Ù.</h2>
</>
)
}
function
App() {
return (
<>
<Fruit />
</>
)
}
rendCount¸¦ useRef·Î
¼±¾ðÇϰí ÃʱⰪÀ» 0À¸·Î ÁöÁ¤Çß´Ù. Àаųª º¯°æÇÒ ¶§´Â current ¼Ó¼ºÀ» ÂüÁ¶ÇÏ¸é µÈ´Ù. °ªÀ» Àß ±â¾ïÇϸ鼵µ ¹«ÇÑ ·çÇÁ´Â
¹ß»ýÇÏÁö ¾Ê´Â´Ù.

useState¿Í ¹¹°¡ ´Ù¸¥Áö ¸íÈ®È÷ ¾Ë ¼ö ÀÖ´Â ¿¹Á¦ÀÌ´Ù. ȸ鿡 º¸ÀÏ ÇÊ¿ä ¾ø°í ³»ºÎÀûÀÎ °ªÀ» ÀúÀåÇÒ ¶§´Â »óŰ¡ ¾Æ´Ñ ÂüÁ¶¸¦ »ç¿ëÇÑ´Ù.
ÄÄÆ÷³ÍÆ®°¡ ´Ù¸¥ ÄÄÆ÷³ÍÆ®¸¦ Æ÷ÇÔÇÏ´Â °æ¿ì´Â ÈçÇϸç ÄÄÆ÷³ÍÆ®³¢¸® °èÃþÀ» ÀÌ·ç¾î ´õ º¹ÀâÇÑ ºÎǰÀ» ¸¸µç´Ù. À̶§ ºÎ¸ð´Â Àڽſ¡°Ô ¼ÓÇÑ ÀÚ½ÄÀÇ ¼Ó¼ºÀ» ¹Þ¾Æ ´ë½Å Àü´ÞÇØ Áà¾ß ÇÑ´Ù. ´ÙÀ½
¿¹Á¦´Â App-Parent-Child ¼¼ °³ÀÇ °èÃþÀ¸·Î µÈ ÄÄÆ÷³ÍÆ®¸¦ ¸¸µç´Ù.
function
Parent(props) {
return (
<>
<p>I am a
Parent</p>
<Child
version={props.version} />
</>
)
}
function
Child(props) {
return (
<>
<p>It is
Child</p>
<h2>{props.version === 'basic' ? '¹«·á¹öÀü':'À¯·á¹öÀü'}</h2>
</>
)
}
function
App() {
return (
<>
<Parent
version='basic' />
</>
);
}
À¥¾Ûµµ °ú±Ý ¿©ºÎ¿¡ µû¶ó ±â´É¿¡ Â÷À̸¦ µÎ¾î À¯·á ¹öÀüÀ» ¸¸µé ¼ö ÀÖ´Ù. À̸¦
±¸ºÐÇÏ·Á¸é ÀÏ¹Ý¿ë ¹«·á ¹öÀü(basic)ÀÎÁö µ·¹Þ°í ÆÄ´Â À¯·á ¹öÀü(Pro)ÀÎÁö
±¸ºÐÇϰí ÄÚµåÀÇ ¸ðµç ºÎºÐ¿¡¼ ÂüÁ¶ÇØ¾ß ÇÑ´Ù.
App¿¡¼ Parent¿¡°Ô
Á¦Ç° ¹öÀüÀ» version ¼Ó¼ºÀ¸·Î ¾Ë·Á ÁÖÁö¸¸ Parent´Â
²®µ¥±âÀÏ »ÓÀ̶ó ÀÌ Á¤º¸¸¦ Á÷Á¢ »ç¿ëÇÏÁö´Â ¾Ê´Â´Ù. ½ÇÁ¦ ±â´ÉÀ» ±¸ÇöÇÏ´Â Á¦ÀÏ ¾Æ·¡ÂÊÀÇ Child¸¸ ÀÌ ¼Ó¼ºÀ» »ç¿ëÇÑ´Ù. App¿¡¼ Child¸¦ Á÷Á¢ »ý¼ºÇÏÁö ¾ÊÀ¸´Ï Child¿¡°Ô versionÀ» ¹Ù·Î Àü´ÞÇÒ ¹æ¹ýÀº ¾ø°í Parent¸¦ °æÀ¯ÇØ Child¿¡°Ô±îÁö °¡µµ·Ï ÇØ¾ß ÇÑ´Ù.
ÀÌ ¿¹Á¦¿¡¼´Â 3´Ü°èÀÌÁö¸¸ °æ¿ì¿¡ µû¶ó¼´Â 6´Ü°è, 7´Ü°è¸¦ ³»·Á°¥ ¼öµµ ÀÖ´Ù.
°èÃþÀ» µû¶ó ¾Æ·¡ÂÊÀ¸·Î Âß ÆÄ°í µç´Ù°í ÇØ¼ ¼Ó¼º µå¸±¸µ(Prop drilling)À̶ó°í
ÇÏ¸ç »ç¿ëÇÏÁö ¾Ê´Â Àμö¸¦ ¿À·ÎÁö ¾Æ·¡·Î Àü´ÞÇϱâ À§ÇØ ¹Þ¾Æ¾ß ÇϹǷΠÅë°ú Àμö¶ó°íµµ ÇÑ´Ù.

¿©±â Àú±â¼ »ç¿ëÇÒ Àü¿ªÀûÀÎ °ªÀ» ¼Ó¼ºÀ» ÅëÇØ ÀÏÀÏÀÌ Àü´ÞÇÏ´Â °ÍÀº ºñÈ¿À²ÀûÀÌ´Ù. Áß°£ ´Ü°è¿¡¼´Â Á÷Á¢ ¾²Áö ¾ÊÁö¸¸ Àü´ÞÀ» À§ÇØ ¾î¿ ¼ö ¾øÀÌ ¹Þ¾Æ¾ß ÇÏ´Ï ±¸Á¶»óÀ¸·Î ¹Ù¶÷Á÷ÇÏÁö ¾Ê°í ¼Ó¼ºÀÌ
´Ã¾î³ª°Å³ª ÁÙ¾îµé ¶§ °ü¸®Çϱ⵵ ¾î·Æ´Ù.
»ö»óÀ̳ª Å©±â, Å׸¶Ã³·³ ¾Û Àüü°¡ ¿µÇâÀ» ¹Þ´Â °ªÀº Àü¿ªÀ¸·Î Á¤ÀÇÇϰí
¸ðµç ÄÄÆ÷³ÍÆ®°¡ ÀÚÀ¯·Ó°Ô ÂüÁ¶ÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. Àü¿ª ÀúÀå¼Ò¸¦ ÄÁÅØ½ºÆ®¶ó°í ÇÏ¸ç ¿©±â¿¡ °ªÀ» ³Ö¾î
µÎ¸é ¾îµð¼³ª ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇÏ¿© Åë°ú Àμö¸¦ Á¦°ÅÇØ º¸ÀÚ.
import {
createContext, useContext } from "react";
const
VersionContext = createContext();
function
Parent() {
return (
<>
<p>I am a
Parent</p>
<Child
/>
</>
)
}
function
Child() {
const version =
useContext(VersionContext);
return (
<>
<p>It is
Child</p>
<h2>{version ===
'basic' ? '¹«·á¹öÀü':'À¯·á¹öÀü'}</h2>
</>
)
}
function
App() {
return (
<>
<VersionContext.Provider value='basic'>
<Parent />
</VersionContext.Provider>
</>
);
}
ÄÁÅØ½ºÆ®´Â createContext ÇÔ¼ö·Î »ý¼ºÇÑ´Ù. Àü¿ªÀûÀÎ ÀúÀå¼ÒÀ̹ǷΠÀÌ ¼±¾ð¹®Àº ´ç¿¬È÷ ÃÖ»óÀ§ ·¹º§ÀÇ Àü¿ª ¹üÀ§¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ÈÅÀÌ ¾Æ´Ï¶ó ±×³É ÀÚ¹Ù½ºÅ©¸³Æ® ÇÔ¼öÀÏ »ÓÀÌ¾î¼ ÇÔ¼ö ¾È¿¡¼µµ È£ÃâÇÒ ¼ö´Â ÀÖÁö¸¸ °øÀ¯¸¦ À§ÇØ »ý¼ºÇÏ´Â
°´Ã¼°¡ ÇÔ¼ö ¾È¿¡ ÀÖ´Ù´Â °Í ÀÚü°¡ ¸»ÀÌ ¾ÈµÇ°í ½ÇÁ¦·Îµµ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
ÄÁÅØ½ºÆ®ÀÇ Provider ÄÄÆ÷³ÍÆ®·Î °ªÀ» ÁöÁ¤Çϴµ¥ À̶§ °øÀ¯ÇÒ
¼Ó¼ºÀÇ À̸§Àº value·Î ¾à¼ÓµÇ¾î ÀÖ´Ù. Provider ÄÄÆ÷³ÍÆ®·Î
µÑ·¯½ÎÀÎ ¿µ¿ª¿¡¼´Â ÄÁÅØ½ºÆ®ÀÇ Á¤º¸¸¦ ¾ðÁ¦µçÁö ²¨³» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡¼´Â value¿¡ 'basic'°ªÀ» ÁöÁ¤Çϰí <Parent/ > ÄÄÆ÷³ÍÆ®¸¦ °¨½ÕÀ¸¹Ç·Î Parent´Â
¹°·ÐÀ̰í Parent¿¡ ¼ÓÇÑ ¸ðµç ÄÄÆ÷³ÍÆ®°¡ VersionContextÀÇ
Á¤º¸¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÄÁÅØ½ºÆ®ÀÇ °ªÀ» ²¨³¾ ¶§´Â useContextÈÅÀ» »ç¿ëÇÑ´Ù. Child´Â VersionContext¿¡ ÀúÀåµÈ °ªÀ» ²¨³» versionÀ¸·Î ´ëÀÔ¹Þ¾Æ Äڵ忡¼ »ç¿ëÇÑ´Ù. Provider¿¡¼
°ªÀ» Àü´ÞÇÒ ¶§´Â Ç×»ó valueÀÌÁö¸¸ ²¨³» ¾µ ¶§´Â ¿øÇÏ´Â À̸§À¸·Î ´ëÀÔ¹ÞÀ» ¼ö ÀÖ´Ù. Parent°¡ Åë°ú Àμö¸¦ Àü´ÞÇÏÁö ¾Ê¾Æµµ ÇÏÀ§ ÄÄÆ÷³ÍÆ®°¡ ÇÊ¿äÇÒ ¶§ °ªÀ» ²¨³» ¾µ ¼ö ÀÖ´Â ÀÌÁ¡ÀÌ ÀÖ´Ù. Provider ÀÇ value ¼Ó¼ºÀ» º¯°æÇϸé Child°¡ Áï½Ã ¾Ë¾ÆÃ¦´Ù.

¿©±â¼´Â ´ÜÀÏ ¹®ÀÚ¿ Çϳª¸¸ ÀúÀåÇߴµ¥ ÄÁÅØ½ºÆ®¿¡ °´Ã¼¸¦ ÀúÀåÇÏ¸é ¿©·¯ Á¤º¸¸¦ ³Ö¾îµÑ ¼ö ÀÖ´Ù. Àü¿ªÀûÀÎ °ªÀ» Æí¸®ÇÏ°Ô ÀúÀåÇÒ ¼ö ÀÖ´Â ÀÌÁ¡ÀÌ ÀÖÁö¸¸ ÀÚ½Ä ÄÄÆ÷³ÍÆ®¿Í ºÎ¸ð ÄÄÆ÷³ÍÆ®°¡ ÄÁÅØ½ºÆ®·Î ¹¿© ÀÖ´Â
»óŶó ´Üü·Î °°ÀÌ ¿òÁ÷¿©¾ß ÇÏ´Â °ÍÀº ´ÜÁ¡ÀÌ´Ù. µ¶¸³¼ºÀº ¶³¾îÁö¸ç ÀçȰ¿ëÇϱâ´Â ¾î·Æ´Ù.
createContext ÇÔ¼ö´Â º¸Åë Àμö¾øÀÌ È£ÃâÇÏÁö¸¸ Àü¿ª ¼Ó¼ºÀÇ
µðÆúÆ®°ªÀ» Àμö·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ °ªÀº Provider·Î
°¨½ÎÁö ¾ÊÀº »óÅ¿¡¼ useContext ÈÅÀ¸·Î ÄÁÅØ½ºÆ®¸¦ ÀÐÀ» ¶§ Àû¿ëµÈ´Ù. ±âº»°ªÀ» basicÀ¸·Î ÁöÁ¤ÇÏ°í ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÒ ¶§¸¸ pro·Î Àû¿ëÇØ º¸ÀÚ.
const
VersionContext = createContext('basic');
function
Parent() {
return (
<>
<p>I am a
Parent</p>
<Child
/>
</>
)
}
function
Child() {
const version =
useContext(VersionContext);
return (
<>
<p>It is
Child</p>
<h2>{version ===
'basic' ? '¹«·á¹öÀü':(version === 'pro' ? 'À¯·á¹öÀü':'¹ÌÁ¤')}</h2>
</>
)
}
function
App() {
return (
<>
<VersionContext.Provider value='pro'>
<Parent />
</VersionContext.Provider>
</>
);
}
Provider¿¡¼ value¸¦
¸íÈ®È÷ pro·Î ÁöÁ¤ÇßÀ¸¸é Child°¡ Àд °ªÀº proÀÌ´Ù. ¹Ý¸é Provider¸¦
»ý·«Çϰųª Provider ¿ÜºÎ¿¡ ÀÖ´Â ÄÄÆ÷³ÍÆ®´Â ±âº»°ªÀÎ basicÀ»
Àд´Ù.
function App() {
return (
<>
<Parent />
</>
);
}
¿©±â±îÁö´Â »ó½ÄÀûÀÌÁö¸¸ ´ÙÀ½ °á°ú´Â Á» ÀÇ¿ÜÀÏ ¼öµµ ÀÖ´Ù. Provider´Â
ÀÖÁö¸¸ value¸¦ »ý·«Çϸé À̶§´Â ±âº»°ªÀÌ ¾Æ´Ñ undefined°¡
Àû¿ëµÈ´Ù.
function App() {
return (
<>
<VersionContext.Provider>
<Parent />
</VersionContext.Provider>
</>
);
}
Áï, createContext·Î ÁöÁ¤ÇÏ´Â µðÆúÆ®°ªÀº Provider¸¦ »ý·«ÇßÀ» ¶§ Àû¿ëµÇ´Â °ªÀÌÁö value¸¦ »ý·«ÇÒ
¶§ Àû¿ëµÇ´Â °ªÀÌ ¾Æ´Ï´Ù. ¼Ó¼ºÀ» Ç×»ó ¸í½ÃÀûÀ¸·Î Àü´ÞÇÑ´Ù¸é µðÆúÆ®°ªÀº ±»ÀÌ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ »ó°ü ¾ø´Ù.
ÄÁÅØ½ºÆ®¿¡ ÀúÀåÇØ µÐ Àü¿ª°ªÀº Çʿ信 µû¶ó ¹Ù²Ü ¼öµµ ÀÖ´Ù. ¿¹¸¦
µé¾î ¹«·á ¹öÀüÀ¸·Î ½ÃÀÛÇß´Ù°¡ »ç¿ëÀÚ°¡ Á¦Ç°À» µî·ÏÇÏ¸é ±×¶§ºÎÅÍ´Â À¯·á ¹öÀüÀÌ µÈ´Ù. º¯°æÇÏÁö ¾ÊÀ»
°ªÀ̶ó¸é ±×³É »ó¼ö¸¦ ¾²¸é µÉ »Ó ±»ÀÌ ÄÁÅØ½ºÆ®¿¡ ÀúÀåÇÒ Çʿ䵵 ¾ø´Ù. ¹öư µÎ °³¸¦ ¹èÄ¡Çϰí Àü¿ª
º¯¼ö¸¦ ¹Ù²ã º¸ÀÚ.
const
VersionContext = createContext();
function
Parent() {
return (
<>
<p>I am a
Parent</p>
<Child
/>
</>
)
}
function
Child() {
let version =
useContext(VersionContext);
return (
<>
<p>It is
Child</p>
<h2>{version ===
'basic' ? '¹«·á¹öÀü':'À¯·á¹öÀü'}</h2>
<button
onClick={() => version = 'pro'}>Á¦Ç° µî·Ï</button>
<button
onClick={() => version = 'basic'}>µî·Ï Ãë¼Ò</button>
</>
)
}
function
App() {
return (
<>
<VersionContext.Provider value='basic'>
<Parent />
</VersionContext.Provider>
</>
);
}
versionÀº »ó¼ö°¡ ¾Æ´Ñ º¯¼öÀ̹ǷΠconst°¡ ¾Æ´Ñ letÀ¸·Î ¼±¾ðÇÑ´Ù. µÎ ¹öưÀ» Ŭ¸¯Çϸé versionÀ» pro¿Í basicÀ¸·Î Åä±ÛÇÑ´Ù. ±×·¯³ª
ÀÌ ¿¹Á¦´Â ¿©·¯ °¡Áö ÀÌÀ¯·Î ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
¢º versionÀº ÄÁÅØ½ºÆ®¿¡¼
ÀÐÀº »çº»À̸ç ChildÀÇ Áö¿ª º¯¼ö¿¡ ºÒ°úÇÏ´Ù. ÀÌ °ªÀ»
¹Ù²Û´Ù°í ÇØ¼ ÄÁÅØ½ºÆ®¿¡ ÀúÀåµÈ °ªÀÌ ¹Ù²î´Â °ÍÀº ¾Æ´Ï´Ù.
¢º ¼³»ç °ªÀÌ ¹Ù²î¾ú´Ù°í ÇÏ´õ¶óµµ º¯¼ö¿¡ °ªÀ» ´ëÀÔÇÏ´Â °Í¸¸À¸·Î ·£´õ¸µÀÌ
¹ß»ýÇÏÁö´Â ¾Ê´Â´Ù. ȸ鿡´Â ¾Æ¹« º¯È°¡ ¾ø´Ù.
º¯°æ °¡´ÉÇÏ°í ·£´õ¸µ±îÁö ÇÏ·Á¸é °á±¹ »óÅ¿©¾ß ÇÑ´Ù. ¶ÇÇÑ ÀÌ »óŰ¡
Àü¿ªÀûÀÌ·Á¸é ÄÁÅØ½ºÆ® ¾È¿¡ ³Ö¾î¾ß ÇÑ´Ù.
const
VersionContext = createContext();
function
Parent() {
return (
<>
<p>I am a
Parent</p>
<Child
/>
</>
)
}
function
Child() {
const {version, setVersion} =
useContext(VersionContext);
return (
<>
<p>It is
Child</p>
<h2>{version ===
'basic' ? '¹«·á¹öÀü':'À¯·á¹öÀü'}</h2>
<button
onClick={() => setVersion('pro')}>Á¦Ç° µî·Ï</button>
<button
onClick={() => setVersion('basic')}>µî·Ï Ãë¼Ò</button>
</>
)
}
function
App() {
const [version, setVersion] =
useState('basic');
return (
<>
<VersionContext.Provider value = {{version, setVersion}}>
<Parent />
</VersionContext.Provider>
</>
);
}
ÄÁÅØ½ºÆ®¸¦ Á¦°øÇÏ´Â App ¶Ç´Â º°µµÀÇ Àü¿ª ÄÄÆ÷³ÍÆ®¿¡ version »óŸ¦ Á¤ÀÇÇÑ´Ù. ±×¸®°í »óŰª version°ú »óŸ¦ º¯°æÇÏ´Â ÇÔ¼ö setVersionÀ» °´Ã¼·Î
¹¾î ÄÁÅØ½ºÆ®¿¡ ÀúÀåÇÑ´Ù. value = {{version, setVersion}} ´ëÀÔ¹®¿¡¼ ¾ÈÂÊ
°ýÈ£´Â °´Ã¼ÀÌ°í ¹Ù±ùÂÊ °ýÈ£´Â JSXÀÇ °ª Ç¥Çö½ÄÀÌ´Ù.
Child¿¡¼ useContext·Î
°´Ã¼¸¦ ²¨³»¸é ÀÌ ¾È¿¡ version »óÅÂ¿Í ÀÌ »óŸ¦ º¯°æÇÏ´Â
setVersionÀÌ µé¾î ÀÖ´Ù. ÇöÀç ¹öÀüÀº
<h2>¿¡ Ãâ·ÂÇÏ°í ¹öưÀÇ Å¬¸¯ À̺¥Æ®¿¡¼ setVersionÀ» È£ÃâÇÏ¿© »óŸ¦
º¯°æÇÑ´Ù. »óŰ¡ ¹Ù²î¸é Áï½Ã ·£´õ¸µÀÌ ¹ß»ýÇϰí ȸéÀÌ °»½ÅµÈ´Ù.

useState¿Í
useContext¸¦ °°ÀÌ ¾²´Ï ¾î·Á¿ö º¸ÀÌÁö¸¸ ±×¸® º¹ÀâÇÑ ¿¹Á¦´Â ¾Æ´Ï´Ù. ÄÁÅØ½ºÆ®´Â
Àü¿ª º¯¼ö¸¦ ÀúÀåÇÒ »Ó Àü¿ª »óŸ¦ ÀúÀåÇÏ´Â °ÍÀº ¾Æ´Ï¹Ç·Î useState·Î »óŸ¦ Á¤ÀÇÇϰí ÀÌ »óŸ¦
ÄÁÅØ½ºÆ®¿¡ ³Ö´Â´Ù. À̶§ ÄÁÅØ½ºÆ®¿¡ °ª»Ó¸¸ ¾Æ´Ï¶ó º¯°æ ÇÔ¼ö±îÁö °°ÀÌ ³Ö¾î µÐ´Ù´Â°Ô ÇÙ½ÉÀÌ´Ù.
°ªÀ» ¿µ±¸ÀûÀ¸·Î ÀúÀåÇÒ ¸ñÀûÀ̶ó¸é Àü¿ª º¯¼ö¶ó´Â °Íµµ ÀÖ´Ù. ÃÖ»óÀ§
·¹º§¿¡ º¯¼ö¸¦ ¼±¾ðÇØ µÎ°í °ªÀ» ÂüÁ¶Çϰųª º¯°æÇÏ¸é µÉ °Å °°´Ù. ¿¹»ó °¡´ÉÇϵí Àü¿ª º¯¼ö·Î´Â °ªÀ»
ÀúÀåÇÒ ¼ö ¾ø´Ù.
let
version = 'basic';
function
Parent() {
return (
<>
<p>I am a
Parent</p>
<Child
/>
</>
)
}
function
Child() {
return (
<>
<p>It is
Child</p>
<h2>{version ===
'basic' ? '¹«·á¹öÀü':'À¯·á¹öÀü'}</h2>
<button
onClick={() => version = 'pro'}>Á¦Ç°µî·Ï</button>
<button
onClick={() => version = 'basic'}>µî·Ï Ãë¼Ò</button>
</>
)
}
function
App() {
return (
<>
<Parent />
</>
);
}
ÃÖ»óÀ§ ·¹º§¿¡ ¼±¾ðÇÑ Àü¿ª º¯¼öÀ̹ǷΠ·£´õ¸µÀÌ ¹ß»ýÇØµµ °ªÀ» À¯ÁöÇÑ´Ù. ¶Ç
ÇÊ¿äÇÒ ¶§ Àü¿ª º¯¼öÀÇ °ªÀ» ¸¶À½´ë·Î º¯°æÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ¸®¾×Æ®´Â º¯¼ö°¡ º¯°æµÈ °ÍÀ» ÀüÇô ¾ËÁö
¸øÇÏ¸ç µû¶ó¼ °ªÀ» ¹Ù²ãµµ ·£´õ¸µÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ÀÌ·± °£´ÜÇÑ ¹æ¹ýÀÌ °¡´ÉÇÏ´Ù¸é »óÅÂ´Ï ÄÁÅØ½ºÆ®´Ï
ÇÏ´Â º¹ÀâÇÑ °ÍÀ» ¸¸µé Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù.
¼³»ç ÀÌ·± ¹®Á¦°¡ ¾Æ´Ï´õ¶óµµ Àü¿ª º¯¼ö´Â ÀϹÝÀûÀ¸·Î ±âÇÇ ´ë»óÀÌ´Ù. ¾îµð¼
´©°¡ °ªÀ» ¹Ù²ÜÁö ¾Ë ¼ö ¾øÀ¸´Ï °ñÄ¡ ¾ÆÇ ¹ö±×ÀÇ ¿øÀÎÀÌ µÇ°í ´©±¸¿¡°Ô³ª °ø°³µÇ¾î ÀÖÀ¸´Ï º¸¾È»óÀÇ ¹®Á¦µµ ÀÖ´Ù.
ÄÄÆ÷³ÍÆ®°¡ ƯÁ¤ Àü¿ª º¯¼ö¿¡ ÀÇÁ¸ÇÏ¸é µ¶¸³¼ºµµ ¶³¾îÁö°í ÀçȰ¿ëÇϱ⵵ ¾î·Æ´Ù.
useMemo´Â ÇÔ¼öÀÇ ½ÇÇà °á°ú¸¦ ¹Ì¸® °è»êÇÏ¿© ij½Ã¿¡ ÀúÀåÇØ µÒÀ¸·Î½á
Áߺ¹ ½ÇÇàÀ» ¹æÁöÇÏ°í ½ÇÇà ¼Óµµ¸¦ °³¼±ÇÏ´Â ±â¹ýÀÌ´Ù. »ç¿ë Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
°á°ú°ª = useMemo(Äݹé, [ÀÇÁ¸¹è¿])
ÀÇÁ¸ ¹è¿³»ÀÇ °ª Áß Çϳª¶óµµ º¯°æÀÌ ÀÖÀ¸¸é ÄݹéÀ» Àç½ÇÇàÇÏ¿© °á°ú°ªÀ» ´Ù½Ã °è»êÇØ ³õ´Â´Ù. °ªÀÌ ¹Ù²îÁö ¾ÊÀ¸¸é ´Ù½Ã ½ÇÇàÇÒ ÇÊ¿ä¾øÀÌ ¹Ì¸® °è»êÇØ ³õÀº °á°ú°ªÀ» °è¼Ó »ç¿ëÇÑ´Ù. ÀÇÁ¸¹è¿ÀÌ ¾ø°Å³ª ºñ¾î ÀÖÀ¸¸é ÃÖÃÊ ·£´õ¸µ½Ã µü Çѹø¸¸ °è»êÇÑ´Ù. ½ÇÇàÁß¿¡
º¯ÇÏÁö ¾Ê´Â °Å´ëÇÑ »ó¼ö°ªÀ» »ç¿ëÇÒ ¶§´Â ÀÇÁ¸ ¹è¿À» ºñ¿ö µÎ±âµµ ÇÑ´Ù.
ÀÏ»ó »ýȰ¿¡¼ Áß¿äÇÑ °É ¸Þ¸ðÇØ µÎµí ¾îµò°¡¿¡ Àû¾î ³õ´Â´Ù°í ÇØ¼ ¸Þ¸ðÈ(Memoization)¶ó°í
ÇÑ´Ù. ´ÙÀ½Àº ¸Þ¸ðÈÀÇ Çʿ伺°ú µ¿ÀÛÀ» º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹ÀÌ´Ù.
import {
useMemo } from 'react';
function
SumArray() {
const nums = [1,2,3,4];
const sum = useMemo(() => {
let total = 0;
for (let i = 0;i <
nums.length;i++) total += nums[i];
return total;
}, [nums]);
return (
<>
<h3> ÇÕ°è = {sum} </h3>
</>
)
}
function
App() {
return (
<>
<SumArray
/>
</>
);
}
ÀÌ ¿¹Á¦´Â 1 ~ 4±îÁöÀÇ Á¤¼ö ¹è¿ numsÀÇ Çհ踦 ¹Ì¸® °è»êÇÏ¿© sum º¯¼ö¿¡ ´ëÀÔÇØ µÐ´Ù. ÃÖÃÊ ·£´õ¸µ½Ã ¶Ç´Â nums ¹è¿ÀÌ ¹Ù²ð ¶§¸¶´Ù ÄݹéÀ» ´Ù½Ã È£ÃâÇÏ¿©
Àç°è»êÇ쵂 ÀÌ ¿¹Á¦¿¡¼´Â ¿ÜºÎ¿¡¼ nums¸¦ º¯°æÇÏ´Â ºÎºÐÀÌ ¾ø¾î µü Çѹø¸¸ °è»êÇÏ´Â ¼ÀÀÌ´Ù. Çհ踦 ±¸ÇÏ´Â ÄݹéÀÇ µ¿ÀÛÀº Áö±ØÈ÷ »ó½ÄÀûÀÎ ÄÚµåÀÌµÇ ´õ °£´ÜÇÏ°Ô ÁÙÀÏ ¼öµµ ÀÖ´Ù.
const sum = useMemo(() => { return
nums.reduce((a,c) => a+c, 0)}, [nums]);
ÀÌ Äڵ尡 ´õ °£´ÜÇÏÁö¸¸ È»ìÇ¥ ÇÔ¼ö°¡ Áߺ¹µÇ¸é °¡µ¶¼ºÀÌ ¶³¾îÁ® ½±°Ô Ç®¾î½è´Ù.
ÀÌ·¸°Ô °è»êÇÑ °á°ú¸¦ <h3> ¿¤¸®¸ÕÆ®¿¡ ´ã¾Æ Ãâ·ÂÇß´Ù.

¾îÂ÷ÇÇ °è»êÇØ¾ßÇÒ °ªÀ̶ó¸é ÄÄÆ÷³ÍÆ® ½ÃÀÛ Á÷ÈÄ¿¡ °è»êÇØµµ ¶È°°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦µµ ½ÇÇà °á°ú´Â °°´Ù.
function SumArray() {
const
nums = [1,2,3,4];
let
sum = 0;
for
(let i = 0;i < nums.length;i++) {
sum += nums[i];
}
return (
<>
<h3> ÇÕ°è = {sum} </h3>
</>
)
}
ÀÌ·¸°Ô µÇ¸é ·£´õ¸µÀ» ÇÒ ¶§¸¶´Ù °è»ê ·çÇÁ¸¦ ¸Å¹ø ´Ù½Ã ½ÇÇàÇϱ⠶§¹®¿¡ ºÒÇÊ¿äÇÑ ¿¬»êÀ» ÇÏ´Â ¼ÀÀÌ´Ù. useMemo´Â µü Çѹø¸¸ °è»êÇϰí ÀÇÁ¸ ¹è¿ÀÌ ¹Ù²îÁö ¾ÊÀ¸¸é ÀúÀåÇØ ³õÀº °ªÀ» »ç¿ëÇϹǷΠ¼º´É Çâ»ó È¿°ú°¡
¶Ñ·ÈÇÏ´Ù. ¶Ç useMemo´Â Çѹø °è»êÇÑ °ªÀ» Àç»ç¿ëÇϰڴٴÂ
Àǻ縦 ¸íÈ®È÷ ÇÏ°í ¾î¶² °ªÀÌ ¹Ù²ð ¶§ Àç°è»êÇÏ´ÂÁö¸¦ ºÐ¸íÈ÷ Ç¥½ÃÇÏ¿© °³¹ßÀÚ°£ÀÇ ÀÇ»ç ¼ÒÅëÀÌ ½±´Ù.
¿¹Á¦¸¦ È®ÀåÇÏ¿© Çհ踦 °è»êÇØµÑ ¹üÀ§¸¦ »óÅ·ΠÁöÁ¤ÇÏ°í ½ÇÇàÁß¿¡ ¹üÀ§¸¦ Á¶Á¤ÇÏ´Â ±â´ÉÀ» ³Ö¾î º¸ÀÚ. ¹üÀ§°¡ ¹Ù²î¸é ÇÕ°èµµ Àç°è»êÇØ¾ß ÇÏ¸ç ·Î±×¸¦ Ãâ·ÂÇÏ¿© Àç°è»êÇÔÀ» Ç¥½ÃÇß´Ù. Çհ踦
º¸¿©Á٠ĸ¼ÇÀ» º¯°æÇÏ´Â ±â´Éµµ ³Ö¾ú´Ù.
function
SumArray() {
const [from, setFrom] = useState(5);
const [to, setTo] = useState(10);
const [cap, setCap] = useState('ÇÕ°è');
const sum = useMemo(() => {
let total = 0;
console.log('ÇÕ°è Àç°è»ê');
for (let i = from;i <=
to;i++) total += i;
return total;
}, [from, to]);
return (
<>
<h3>
{from} ~ {to} {cap} = {sum} </h3>
<button
onClick={() => setFrom(from - 1)}>from °¨¼Ò</button>
<button
onClick={() => setTo(to + 1)}>to Áõ°¡</button>
<button
onClick={() => setCap(cap === 'ÇÕ°è' ?
"Total":"ÇÕ°è")}>cap º¯°æ</button>
</>
)
}
function
App() {
return (
<>
<SumArray
/>
</>
);
}
useMemoÀÇ ÀÇÁ¸ ¹è¿¿¡
from°ú to¸¦ ÁöÁ¤Çß´Ù. from °¨¼Ò, to Áõ°¡ ¹öưÀ» ´©¸£¸é ÀÇÁ¸ ¹è¿ÀÌ ¹Ù²î¹Ç·Î useMemo°¡ Àç°è»êÀ»
¼öÇàÇÑ´Ù.

±×·¯³ª ĸ¼ÇÀº Ãâ·Â ÇüŸ¦ ÁöÁ¤ÇÒ »Ó °è»ê °á°ú¿¡´Â ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê¾Æ Àç°è»êÇÒ Çʿ䰡 ¾ø´Ù. useMemo´Â ÀÇÁ¸ ¹è¿ ³»ÀÇ º¯¼ö°¡ ¹Ù²ð ¶§¸¸ Àç°è»êÇϴµ¥ capÀº
ÀÇÁ¸ ¹è¿¿¡ ¾øÀ¸´Ï ºÒÇÊ¿äÇÑ Àç°è»êÀ» ÇÏÁö ¾Ê´Â´Ù.
¸Þ¸ðȸ¦ ¾î´À ¼öÁرîÁö ÇÒ °ÍÀΰ¡´Â ¿¹»ó ½Ã°£À» º¸°í Àß °áÁ¤ÇØ¾ß ÇÑ´Ù.
useMemo ÀÚüµµ ÀÇÁ¸°ªÀ» ÀÏÀÏÀÌ ºñ±³ÇÏ´À¶ó ½Ã°£À» ¼Ò¸ðÇϱ⠶§¹®¿¡ Ç×»ó À̵æÀ̶ó°í º¼ ¼ö ¾ø´Ù.
»ç½Ç Á¤¼öÇÕÀ» ±¸ÇÏ´Â °£´ÜÇÑ ¿¬»êÀº ±»ÀÌ ¸Þ¸ðȱîÁö ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×·¯³ª ¹è¿ÀÌ °Å´ëÇϰí
¿¬»êµµ º¹ÀâÇÏ´Ù¸é ¸Þ¸ðÈ·Î ÀÎÇÑ ¼º´É Çâ»ó È¿°ú°¡ ÀÖ´Ù.
ƯÈ÷ ¿ÜºÎ ³×Æ®¿öÅ© ÀÔÃâ·ÂÀ» ÇÒ ¶§´Â Áö±¸ ¹Ý´ëÆí¿¡ ÀÖÀ»Áöµµ ¸ð¸£´Â ¼¹ö¿Í Åë½ÅÇØ¾ß ÇϹǷΠ²À ÇÊ¿äÄ¡ ¾ÊÀº ¿¬»êÀº
ÃÖ¼ÒÈÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ±â»ó ¼¹ö¿¡ Á¢¼ÓÇØ¼ ÇöÀç ¿Âµµ¸¦ Á¶»çÇÑ´Ù¸é ÃÖ¼ÒÇÑ ºÐ´ÜÀ§´Â ¹Ù²î¾úÀ» ¶§
ÀçÁ¶»çÇÏ´Â °ÍÀÌ ÇÕ¸®ÀûÀÌ´Ù. ¿Âµµ°¡ ÃÊ´ÜÀ§·Î ¹Ù²ð¸®´Â ¾ø°í ¼·¾¾/Ⱦ¾
Ç¥½Ã Çü½ÄÀ» º¯°æÇÒ ¶§´Â ¾Æ¿¹ Á¢¼ÓÇÒ Çʿ䰡 ¾ø´Ù.
ÄÄÆ÷³ÍÆ®´Â ´Üµ¶À¸·Îµµ »ç¿ëÇÏÁö¸¸ ´Ù¸¥ ÄÄÆ÷³ÍÆ®ÀÇ ºÎǰÀ¸·Î »ç¿ëÇÏ¿© °èÃþÀ» ÀÌ·ç±âµµ ÇÑ´Ù. ÀÌ »óÅ¿¡¼ ºÎ¸ð°¡ ¹Ù²î¾î ´Ù½Ã ±×·Á¾ß ÇÑ´Ù¸é Àڽĵµ ´Ù½Ã ·£´õ¸µÇÏ´Â°Ô ÀÚ¿¬½º·´´Ù. °ú¿¬ ±×·±Áö ´ÙÀ½ ¿¹Á¦·Î È®ÀÎÇØ º¸ÀÚ.
function
Child(props) {
console.log('render');
return (
<div>{props.value}</div>
)
}
function
Counter() {
const [count, setCount] = useState(0);
const [lang, setLang] = useState('han');
return (
<>
<h2> Count
= {count} </h2>
<button
onClick={()=>setCount(count+1)}>Áõ°¡</button>
<button
onClick={()=>setLang(lang ==='han' ? 'eng':'han')}>¾ð¾î º¯°æ</button>
<Child
value={lang === 'han' ? '³ª´Â Â÷ÀϵåÀÔ´Ï´Ù.':'I am a child'}
/>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
);
}
Ä«¿îÆ® ¾Æ·¡¿¡ ¹®ÀÚ¿À» Ãâ·ÂÇÏ´Â Child¸¦ ¹èÄ¡Çß´Ù. Child´Â ºÎ¸ð·ÎºÎÅÍ ¼Ó¼ºÀ» Àü´Þ¹Þ¾Æ ȸ鿡 Ãâ·ÂÇÏ¸ç ·£´õ¸µÀÌ ¹ß»ýÇÏ´ÂÁö È®ÀÎÇϱâ À§·¡ Äֿܼ¡ ·Î±×µµ Ãâ·ÂÇÑ´Ù. ºÎ¸ð´Â Ä«¿îÆ®¸¦ Áõ°¡½ÃŰ´Â ¹öư°ú ¾ð¾î¸¦ º¯°æÇÏ´Â ¹öưÀÌ ÀÖ´Ù. ½ÇÇà
ÈÄ µÎ ¹öưÀ» ´·¯ º¸ÀÚ.

¾ð¾î¸¦ º¯°æÇϸé Childµµ Ãâ·ÂÇÒ ¸Þ½ÃÁö¸¦ ¹Ù²ã¾ß ÇÏ´Ï ´ç¿¬È÷ ´Ù½Ã
±×·Á¾ß ÇÑ´Ù. ±×·¯³ª Ä«¿îÆ®¸¦ Áõ°¡ÇÏ´Â °ÍÀº Child¿¡
¾Æ¹«·± ¿µÇâÀ» ¹ÌÄ¡Áö ¾ÊÁö¸¸ ºÎ¸ð°¡ ¹Ù²î¾î ¸Å¹ø ´Ù½Ã ·£´õ¸µÇÏ´Â ºÒÇÕ¸®ÇÔÀÌ ÀÖ´Ù.
memo ÇÔ¼ö´Â ÄÄÆ÷³ÍÆ®¸¦ ÀúÀåÇÏ¿© ºÒÇÊ¿äÇÑ ·£´õ¸µÀ» ¹æÁöÇÑ´Ù. ·£´õ¸µÇÒ ¶§ props¸¦ ºñ±³ÇØ º¸°í ¹Ù²î¾úÀ» ¶§¸¸ ·£´õ¸µÇÏ°í ±×·¸Áö
¾ÊÀ¸¸é ±â¾ïÇØ µÐ Â÷Àϵ带 ¸®ÅÏÇÏ¿© ¼º´ÉÀ» Çâ»ó½ÃŲ´Ù. Ç×»ó ¼Ó¼ºÀ» ºñ±³Çϵµ·Ï µÇ¾î ÀÖ¾î º°µµÀÇ ÀÇÁ¸
º¯¼ö´Â ÁöÁ¤ÇÏÁö ¾Ê´Â´Ù. »ç¿ë ¹æ¹ýÀº °£´ÜÇÏ´Ù. ÀÚ½Ä ÄÄÆ÷³ÍÆ®¸¦ memo ÇÔ¼ö·Î °¨½Î »õ·Î¿î ÄÄÆ÷³ÍÆ®¸¦ Á¤ÀÇÇÑ´Ù.
function
Child(props) {
console.log('render');
return (
<div>{props.value}</div>
)
}
const
MemoizedChild = memo(Child);
function
Counter() {
const [count, setCount] = useState(0);
const [lang, setLang] = useState('han');
return (
<>
<h2> Count
= {count} </h2>
<button
onClick={()=>setCount(count+1)}>Áõ°¡</button>
<button
onClick={()=>setLang(lang ==='han' ? 'eng':'han')}>¾ð¾î º¯°æ</button>
<MemoizedChild value={lang === 'han' ? '³ª´Â Â÷ÀϵåÀÔ´Ï´Ù.':'I am a child'} />
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
);
}
memo(Child)¸¦ ´ëÀÔ¹Þ´Â MemoizedChild´Â
ÀúÀåÇØ ³õÀº ÄÄÆ÷³ÍÆ®ÀÌ¸ç ºÎ¸ð´Â Child ´ë½Å MemoizedChild¸¦
¹èÄ¡ÇÑ´Ù. ¸Þ¸ðÈµÈ ÄÄÆ÷³ÍÆ®´Â ÀÌÀü ¼Ó¼º°ú ºñ±³ÇÏ¿© ´Ù½Ã ±×¸± °ÍÀÎÁö ¾Æ´ÑÁö °áÁ¤ÇÏ°í ºÒÇÊ¿äÇÑ ·£´õ¸µÀ»
¹æÁöÇÑ´Ù.
ÀÌ·¯¸é ¾ð¾î¸¦ º¯°æÇÒ ¶§ Child·Î Àü´ÞÇÒ ¼Ó¼ºÀÌ ¹Ù²î¹Ç·Î ´Ù½Ã
·£´õ¸µÇÏÁö¸¸ Ä«¿îÆ®¸¦ Áõ°¡ÇÒ ¶§´Â ±×·² ÇÊ¿ä¾ø´Ù. ºÎ¸ðÀÇ Ä«¿îÆ®°¡ Áõ°¡ÇÑ °Í°ú ChildÀÇ Ãâ·Â ¸ð½ÀÀº ¾Æ¹«·± °ü·ÃÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. memo·Î Child¸¦ °¨½Î º°µµÀÇ º¯¼ö·Î ´ëÀÔ¹Þ´Â °ÍÀÌ ¹ø°Å·Ó´Ù¸é ÄÄÆ÷³ÍÆ®¸¦ È»ìÇ¥ ÇÔ¼ö·Î Á¤ÀÇÇÏ¿© °¨½Î¸é µÈ´Ù.
const Child = memo((props) => {
console.log('render');
return (
<div>{props.value}</div>
)
});
Çü½ÄÀÌ º¹ÀâÇØ¼ °¡µ¶¼ºÀº ¶³¾îÁöÁö¸¸ °°Àº ÄÚµåÀÌ´Ù. È»ìÇ¥ ÇÔ¼ö ´ë½Å
ÇÔ¼ö ¸®ÅÍ·² Çü½ÄÀÇ memo(function(props) {... } À» Àμö·Î ³Ñ°Üµµ µÈ´Ù. ºÎ¸ð´Â Á¢µÎ¾øÀÌ <Child>¶ó´Â ÆòÀÌÇÑ À̸§À¸·Î ÀÚ½Ä
ÄÄÆ÷³ÍÆ®¸¦ ¹èÄ¡ÇÒ ¼ö ÀÖ¾î »ç¿ë¸é¿¡¼´Â ´õ °£ÆíÇÏ´Ù.
memo´Â ÇÔ¼öÀÌÁö¸¸ Àμö·Î ÄÄÆ÷³ÍÆ®¸¦ ¹Þ¾Æ ´õ Çâ»óµÈ ±â´ÉÀÇ ÄÄÆ÷³ÍÆ®¸¦
¸®ÅÏÇÑ´Ù. ÀÌó·³ ½ÇÇàÁß¿¡ ÄÄÆ÷³ÍÆ®¸¦ ¸¸µé¾î ³»´Â ±â¹ýÀ» °íÂ÷ ÄÄÆ÷³ÍÆ®(Higher-Order Component, HOC)¶ó°í ºÎ¸¥´Ù. ÇÔ¼ö·Î
ÄÄÆ÷³ÍÆ®¸¦ ¸¸µé¸é °øÅë Äڵ带 Àç»ç¿ëÇÏ¿© ºñ½ÁÇÑ ÄÄÆ÷³ÍÆ®¸¦ È¿À²ÀûÀ¸·Î Âï¾î³¾ ¼ö ÀÖÁö¸¸ À̸§ Ãæµ¹À̳ª ·¡Çο¡ ÀÇÇÑ º¹À⼺ÀÌ Áõ°¡ÇÏ´Â ´ÜÁ¡ÀÌ ÀÖ¾î
²À ÇÊ¿äÇÒ ¶§¸¸ ÁÖÀDZí°Ô »ç¿ëÇØ¾ß ÇÑ´Ù.
useMemo´Â °ªÀ» ¸Þ¸ðÈÇϰí
memo ÇÔ¼ö´Â ÄÄÆ÷³ÍÆ®¸¦ ¸Þ¸ðÈÇÑ´Ù. ÀÌ¿¡ ºñÇØ
useCallbackÀº ÇÔ¼ö¸¦ ¸Þ¸ðÈÇÏ¿© ¸Å¹ø Àç»ý¼ºÇÏ´Â °ÍÀ» ¹æÁöÇÑ´Ù. ÀÌ ÈÅÀº Àû¿ëµÇ´Â
»óȲÀÌ Á¦ÇÑÀûÀÌ¾î¼ Á÷°üÀûÀ¸·Î ÀÌÇØÇÏ±â ³ÇØÇÏ´Ù. ¸ÕÀú Ä«¿îÆ® ¿¹Á¦¸¦ ÅëÇØ °³³äÀûÀÎ »ç¿ë¿¹¸¦ º¸ÀÚ.
import {
useCallback } from 'react';
function
Counter() {
const [count, setCount] = useState(10);
const dec = () => {
console.log('dec');
setCount((c) => c - 1);
}
const inc = useCallback(() => {
console.log('inc');
setCount((c) => c + 1);
}, []);
return (
<>
<h3> Count
= {count} </h3>
<button
onClick={dec}>°¨¼Ò</button>
<button
onClick={inc}>Áõ°¡</button>
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
);
}
Ä«¿îÆ® Áõ°¨À» dec, inc ÇÔ¼ö·Î ÀÛ¼ºÇߴµ¥ Áö¿ª ÇÔ¼öµµ ÄÄÆ÷³ÍÆ®ÀÇ
ÀϺÎÀ̹ǷΠ·£´õ¸µÇÒ ¶§¸¶´Ù »õ·Î »ý¼ºµÈ´Ù. ÇÔ¼ö°¡ °Å´ëÇÏ°í ³»¿ëÀÌ ¹Ù²îÁö ¾Ê´Â´Ù¸é ±»ÀÌ ¸Å¹ø Àç»ý¼ºÇÒ
ÇÊ¿ä ¾ø´Ù. dec´Â ÀÏ¹Ý ÇÔ¼ö·Î ÀÛ¼ºÇÏ¿© ¸Å¹ø »ý¼ºÇϵµ·Ï ³»¹ö·Á µÎ¾úÁö¸¸ inc´Â useCallback ÈÅÀ¸·Î °¨½Î ¸Å¹ø »ý¼ºÇÏÁö ¾Êµµ·Ï Çß´Ù.
ÇÔ¼öÀÇ º»Ã¼¸¦ ÀúÀåÇØ µÎ°í ·£´õ¸µÇÒ ¶§¸¶´Ù °è¼Ó »ç¿ëÇϹǷΠ±×¸¸Å ¼º´É Çâ»óÀÇ È¿°ú´Â ÀÖ´Ù. ±×·¯³ª ÀÌ ¿¹Á¦°¡ ·£´õ¸µÇÒ ¶§¸¶´Ù inc¸¦ Àç»ý¼ºÇÏ´ÂÁö ¾Æ´Ï¸é ¸Þ¸ðȵÈ
ÇÔ¼ö¸¦ °è¼Ó »ç¿ëÇÏ´ÂÁö È®ÀÎÇÒ ¹æ¹ýÀº ¾ø´Ù. ·Î±×´Â ÇÔ¼ö È£Ãâ¿¡ ´ëÇØ Âï´Â °ÍÀÌÁö ÇÔ¼ö »ý¼º½Ã¿¡ Âï´Â°Ô
¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ¶Ç ÀÌ Á¤µµ ±æÀÌÀÇ ÂªÀº ÇÔ¼ö¸¦ ÀúÀåÇØ ºÁ¾ß ½ÇÁúÀûÀÎ À̵浵 °æ¹ÌÇÏ´Ù. ¾Æ´Ï, ¿ÀÈ÷·Á ÀúÀåÇÏ°í ²¨³»´À¶ó ´õ ¼ÕÇØº¼ È®·üÀÌ ³ô´Ù.
Áï, ÀÌ ¿¹Á¦´Â ¾îµð±îÁö³ª °³³äÀ» º¸¿©ÁÙ »Ó ½Ç¿ëÀûÀÎ ±â¹ýÀÌ ¾Æ´Ï°í useCallback ÈÅÀÇ È¿°ú¸¦ ½Ç°¨ÇÏ±â ¾î·Æ´Ù. ÇÔ¼ö¸¦ ¸Þ¸ðÈÇØ¾ß
ÇÏ´Â ±â¹ýÀº memo ÇÔ¼ö·Î ÄÄÆ÷³ÍÆ®¸¦ ¸Þ¸ðÈÇÏ°í ±× ÄÄÆ÷³ÍÆ®ÀÇ ÄݹéÀ¸·Î ÇÔ¼ö¸¦ Àü´ÞÇÒ ¶§¿¡ Áø°¡¸¦
¹ßÈÖÇÑ´Ù. Äݹé ÇÔ¼ö¿¡ ÁÖ·Î Àû¿ëÇÑ´Ù°í ÇØ¼ ÈÅÀÇ À̸§ÀÌ
useCallbackÀÌ´Ù.
ÀÌ ÈÅÀÇ µ¿ÀÛ ¿¹¸¦ º¸±â À§ÇØ ¾Õ Ç×ÀÇ ¿¹Á¦¸¦ º¯ÇüÇÏ¿© Child¿¡°Ôµµ
½º½º·Î ¾ð¾î¸¦ º¯°æÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» Ãß°¡ÇØ º¸ÀÚ. ºÎ¸ð°¡ ÀÌ¹Ì ¾ð¾î¸¦ º¯°æÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ ChildÀÇ ¼Ó¼ºÀ¸·Î Àü´ÞÇϰí Child´Â ¹öư Ŭ¸¯½Ã ÄݹéÀ¸·Î Àü´Þ¹ÞÀº
ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.
const
Child = memo((props) => {
console.log('render');
return (
<div>
<h3>{props.value}</h3>
<button
onClick={props.onLang}>½º½º·Î ¾ð¾î º¯°æ</button>
</div>
)
});
function
Counter() {
const [count, setCount] = useState(0);
const [lang, setLang] = useState('han');
function toggleLang() {
setLang(lang === 'han' ?
'eng' : 'han');
}
return (
<>
<h2> Count
= {count} </h2>
<button
onClick={()=>setCount(count+1)}>Áõ°¡</button>
<button
onClick={toggleLang}>¾ð¾î º¯°æ</button>
<Child
value={lang === 'han' ? '³ª´Â Â÷ÀϵåÀÔ´Ï´Ù.':'I am a child'}
onLang={toggleLang} />
</>
)
}
function
App() {
return (
<>
<Counter
/>
</>
);
}
¾ð¾î¸¦ º¯°æÇÏ´Â ±â´ÉÀ» toggleLang ÇÔ¼ö·Î ÀÛ¼ºÇϰí Child¿¡°Ô onLang ¼Ó¼ºÀ¸·Î Àü´ÞÇß´Ù. ºÎ¸ð³ª ÀÚ½ÄÀ̳ª ÇÊ¿äÇÒ ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾çÂÊ¿¡¼ ¾ð¾î¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.

½ÇÇàÇØ º¸¸é Àß µ¿ÀÛÇÑ´Ù. ±×·¯³ª ·Î±×¸¦ Àß °üÂûÇØ º¸¸é ¶Ç ´Ù¸¥
¹®Á¦°¡ ÀÖ´Ù. Child¸¦ ¸Þ¸ðÈÇØ ³õ¾ÒÀ¸¹Ç·Î Ä«¿îÆ® Áõ°¨¿¡´Â ·£´õ¸µÇÒ ÇÊ¿ä¾øÁö¸¸ Áõ°¡ ¹öưÀ» ´©¸£¸é Childµµ Ç×»ó ·£´õ¸µµÈ´Ù. ±× ÀÌÀ¯´Â ºÎ¸ð¸¦ ·£´õ¸µÇÒ ¶§ toggleLang ÇÔ¼ö°¡ Àç»ý¼ºµÇ±â ¶§¹®ÀÌ´Ù. ÀÌ ÇÔ¼ö¸¦ ¼Ó¼ºÀ¸·Î
Àü´Þ¹Þ´Â Child´Â ¸Þ¸ðȵǾî ÀÖ´õ¶óµµ ¼Ó¼ºÀÌ ¹Ù²î¾úÀ¸¹Ç·Î ´Ù½Ã ·£´õ¸µÇØ¾ß ÇÑ´Ù°í ÆÇ´ÜÇÑ´Ù.
±×·¯³ª ºÎ¸ð°¡ Ä«¿îÆ®¸¦ Áõ°¡½ÃŲ´Ù°í ÇØ¼ toggleLang ÇÔ¼ö°¡
¿µÇâÀ» ¹Þ´Â ºÎºÐÀº ¾ø´Ù. ¾ð¾î°¡ ¹Ù²ð ¶§´Â toggleLangµµ
Àç»ý¼ºÇØ¾ß ÇÏÁö¸¸ Ä«¿îÆ® º¯°æ¿¡ ´ëÇØ¼´Â ±×·² Çʿ䰡 ¾ø´Ù. ÀÌ·± ÀÌÀ¯·Î toggleLangÀ» ¸Þ¸ðÈÇØ¾ß Çϸç ÀÌ·² ¶§ »ç¿ëÇÏ´Â °ÍÀÌ
useCallback ÈÅÀÌ´Ù.
const
toggleLang = useCallback(function () {
setLang(lang === 'han' ? 'eng' : 'han');
},
[lang]);
toggleLangÀ»
useCallbackÀ¸·Î °¨½ÎµÇ ÀÇÁ¸ º¯¼ö´Â langÀ¸·Î ÁöÁ¤ÇÏ¿© ¿ÜºÎ¿¡¼ ÀÌ º¯¼ö¸¦ º¯°æÇÒ
¶§¸¸ Àç»ý¼ºÇÑ´Ù. ÇöÀç Äڵ忡´Â lang »óŸ¦ º¯°æÇÏ´Â
Äڵ尡 ÀÚ±â ÀڽŹۿ¡ ¾ø´Ù. ÇÔ¼ö°¡ langÀ» Åä±ÛÇϸé useCallbackÀº º¯°æµÈ lang¿¡ ´ëÇØ toggleLang ÇÔ¼ö¸¦ Àç»ý¼ºÇÏ¿© Àç±ÍÀûÀÎ °Íó·³ º¸ÀÌÁö¸¸ ±×·¸Áö´Â ¾Ê´Ù.
ÇÔ¼ö°¡ langÀ» ¹Ù²Û ÈÄ ´Ù½Ã Àç»ý¼ºµÇÁö¸¸ »óŸ¦ ¹Ù²Ù´Â °ÍÀº ¾Æ´Ï¹Ç·Î
µü Çѹø¸¸ Àç»ý¼ºµÉ »ÓÀÌ´Ù. ¿ÀÈ÷·Á ÀÇÁ¸ º¯¼ö¿¡ langÀ»
ÀûÁö ¾ÊÀ¸¸é ÇÔ¼ö°¡ óÀ½ ÃʱâÈµÈ »óÅ ±×´ë·Î À¯ÁöµÇ¾î ¹ö¸°´Ù. ¾ð¾î°¡ ÃʱⰪÀÎ hanÀÎ »óÅ·ΠÇÔ¼öÀÇ µ¿ÀÛÀÌ °íÁ¤µÇ¹Ç·Î Çѹø¸¸ eng·Î ¹Ù²î¸ç ´Ù½Ã
Çѱ۷Π¹Ù²Ü ¼ö ¾ø´Ù.
toggleLangÀ» ¸Þ¸ðÈÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ¾ð¾î º¯°æ¿¡ ´ëÇØ¼´Â Child¸¦ ·£´õ¸µÇÏÁö¸¸ Ä«¿îÆ® Áõ°¡¿¡ ´ëÇØ¼´Â ·£´õ¸µÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. Ä«¿îÆ®°¡
¾Æ¹«¸® ¹Ù²î¾îµµ toggleLang ÇÔ¼ö°¡ ¹Ù²îÁö ¾ÊÀ¸¸ç Child°¡
¹Þ´Â Àμöµµ º¯È°¡ ¾øÀ¸¹Ç·Î ´Ù½Ã ·£´õ¸µÇÒ Çʿ䰡 ¾ø´Ù.
ÇÔ¼ö Àç»ý¼ºÀ» ÃÖ¼ÒÈÇÏ´Â ¸¸Å ¼º´ÉÀº Çâ»óµÇÁö¸¸ Çâ»óÀÇ Á¤µµ´Â ±ØÈ÷ ¹Ì¹ÌÇÏ´Ù.
À¢¸¸Å Å« ÇÔ¼ö¶óµµ º»Ã¼¸¦ ¸¸µå´Â µ¿ÀÛÀÌ ¾öû³ ½Ã°£À» ¼Ò¸ðÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. useCallbackÀ»
»ç¿ëÇÏ´Â ÁøÂ¥ Àǹ̴ ÇÔ¼ö¸¦ ¸Þ¸ðÈÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÌ ÇÔ¼ö¸¦ ÄݹéÀ¸·Î ¹Þ´Â ÄÄÆ÷³ÍÆ® ÀüüÀÇ ·£´õ¸µÀ» ÃÖ¼ÒÈÇÏ´Â °ÍÀÌ´Ù.