props๋ ์ปดํฌ๋ํธ์ ๊ตฌ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ฉฐ ๋ถ๋ชจ-์์ ์ปดํฌ๋ํธ ๊ฐ์ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ญํ ์ด๋ค.
๋ฆฌ์กํธ์ ๊ฐ์ DOM ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ง์ง๋ง์ ๋ง๋ค์ด๋ด๋ ์ปดํฌ๋ํธ์ ํธ๋ฆฌ๋ฅผ ๊ฒฐ์ ํ๋ค. ๊ฐ๊ฐ์ ํ์ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ๋ค์ JSX ์ฝ๋๋ฅผ ๋ฐํํ๋๋ฐ, ์ด ๊ฐ์ DOM์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ํ์ฌ ๋ชจ์๊ณผ ์ต์ข ๋ชจ์์ ๊ฒฐ์ ์ง๋๋ค. ๊ฐ๋ น, ์ํ(state)๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ์ด ์ ๋ฐ์ดํธ๋๋ ์ ๋ณด๋ ReactDOM ์ผ๋ก ์ ๋ฌ๋์ด ์ ๋ฐ์ดํธ ์ด์ ๊ณผ ์ดํ(๊ฐฑ์ ์ดํ)์ ์ํ(state) ์ฐจ์ด๋ฅผ ์ธ์ํ๊ณ ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํตํด ๊ตฌ์ฑํ ๊ฐ์์ ์ค๋ ์ท์ธ ๊ฐ์DOM ๊ณผ ์ผ์นํ๋๋ก ์ค์ DOM์ ์กฐ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๊ฒ ํ๋ค.
์์ ์ฌ๋ฌ๋ฒ ๊ฑฐ๋ก ํ๋ค์ํผ ๋ฆฌ์กํธ๋ ์ํ(state)๋ props, ์ปจํ ์คํธ(context) ๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ ํจ์ ์์ฒด๊ฐ ์ฌ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๋ ๋ค์ ๋ ๋๋ง์ ํด์ค๋ค. ํ์ง๋ง ์ด ๋ ๋๋ง์ด ์ค์ DOM ์ ์ฒด๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ด ์๋์ ๋ช ์ฌํด์ผ ํ๋ค. ๊ทธ๋ฌ๋๊น ๋ฆฌ์กํธ์ ์ํด ์๋์ผ๋ก ์ปดํฌ๋ํธ ํจ์๊ฐ ์ฌ์คํ๋๋ค๊ณ ํด์ ์ค์ DOM์ ๊ฐ ๋ถ๋ถ๋ค์ด ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ ์๋๋ผ๋ ์๋ฏธ์ด๋ค. ์ฌ์คํ๊ณผ ๋ ๋๋ง์ ๋ค๋ฃฐ ๋ ์ปดํฌ๋ํธ ๋ถ๋ถ๊ณผ ๋ฆฌ์กํธ ๋ถ๋ถ, ๊ทธ๋ฆฌ๊ณ ์ค์ ์ ๋ฐ์ดํธ ๋๋ DOM(ํธ๋ฆฌ)๋ฅผ ๊ตฌ๋ถํด์ ์ดํดํด์ผ ํ๋ค.
์ปดํฌ๋ํธ๋ ์ํ, props, ์ปจ๋ฑ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฆฌ๋ ๋๋ง ๋๋ค. ํ์ง๋ง ๋ค์ ๋ ๋๋ง์ด ๋์ด๋ ์ค์ DOM ์ React๊ฐ ๊ตฌ์ฑํ ์ปดํฌ๋ํธ์ ์ด์ ์ํ์ ํ์ฌ ์ํ์ ์ค์ง์ ์ธ ์ฐจ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ค์ง์ ์ผ๋ก ์ ๋ฐ์ดํธ ๋๋ ๋ถ๋ถ์ด ์์ ๋๋ง ๋ณ๊ฒฝ-์ ๋ฐ์ดํธ๋ฅผ ํด์ค๋ค. ์ฆ, ์ค์ DOM ์ ๊ฐ์์ DOM ๊ณผ ๋น๊ตํ์ฌ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค๊ณ 'ํ๋จ'์ด ๋ ๋์๋ง ์ ๋ฐ์ดํธ๋ฅผ ํด์ค๋ค๋ ๋ป์ด๋ค.
<div>
<h1>Hi there!</h1>
</div>
<div>
<h1>Hi there!</h1>
<p>This is New!</p>
</div>
<h1>
ํ๊ทธ ๋ฐ์ ์๋ก์ด <p>
ํ๊ทธ๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค. ๋ฆฌ์กํธ๋ ์ด ๋๊ฐ์ ์ค๋
์ท(์ต์ข
์ค๋
์ท, ํ์ฌ ์ค๋
์ท) ๊ฐ์ ์ฐจ์ด์ ์ด ์ด <p>This is New!</p>
์์ ํ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌ์ค์ ReactDOM ์ ์ ๋ฌํ๋ฉด ReactDOM ์ ์ค์ DOM์ ์
๋ฐ์ดํธํ๊ณ ์ด <p>This is New!</p>
์ ์ง์ด๋ฃ๋๋ค. ReactDOM ์ ์ ์ฒด DOM์ ์ฌ๋ ๋๋ง ํ์ง ์๋๋ค. ์ด์ ์ DOM ํธ๋ฆฌ์ ์
๋ฐ์ดํธ ๋์๋ ์ต์ข
์ค๋
์ท ๋ด๋ถ์ ์ฝ๋ <h1>
๊ณผ <div>
๋ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ๋ค๋ง ํ์ฌ์ ์ค๋
์ท๊ณผ ์ต์ข
์ค๋
์ท๊ณผ์ ์ฐจ์ด์ ์ธ <p>This is New!</p>
๋ง์ ์ถ๊ฐํด์ ์ค์ DOM ํธ๋ฆฌ์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฆฌ์กํธ๊ฐ ์๋ํ๋ ๋ฐฉ์์ด๋ค.<div className="app">
<h1>Hi there!</h1>
</div>
App.js
์๋ ๊ฐ๋จํ <div>
์ <h1>
ํ๊ทธ๊ฐ ๋ค์ด์๋ค.<div className="app">
<h1>Hi there!</h1>
<p>This is New!</p>
</div>
<p>This is New!</p>
๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํด๋ณด์. ์ด๋ป๊ฒ ํ๋ฉด, ์ฒ์์๋ ๋ฌธ์ฅ์ ํ์(์ถ๊ฐ)ํ์ง ์์ ์ํ์์ ์ด๋ค ์์ ์ ๊ธฐ์ ์ผ๋ก ๋ฌธ์ฅ์ ํ์(์ถ๊ฐ)ํ ์ ์์๊น? ์ด๋ ์ฐ๋ฆฌ๊ฐ ๋ ์ฌ์ฉํ๋ ์ํ(state)๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ด ๋ ์ฌ๋ ธ๋ค๋ฉด ์ ๋ต์ด๋ค. ์ํ(state)์ ์ํ(state) ์
๋ฐ์ดํธ ํจ์๋ฅผ ์ด์ฉํด์, ์ฒ์์๋ <p>
ํ๊ทธ์ ๋ฌธ์ฅ์ด ํ์๋์ง ์๋ค๊ฐ ํด๋น ์ํ(state)์ ์
๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ธฐ๋ฅ(๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, ํ์ด๋จธ๋ฅผ ์๋์ํจ๋ค๊ฑฐ๋)์ ๋ฐ๋ผ์ <p>
ํ๊ทธ์ ๋ฌธ์ฅ์ด ํ์๋๋๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.const [showParagraph, setShowParagraph] = useState(false);
useState
์ํ(state)๋ฅผ ์ค์ ํ๋ค. ์์ ๋๋ํ ๋งํ๋ฏ์ด ๋ฆฌ์กํธ๋ ์ํ(state)๋ props, ์ปจํ
์คํธ(context) ๋ณ๊ฒฝ ์์๋ง ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ฌ์คํํ๊ณ ์ฌ ๋ ๋๋ง ํ๋ค. ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ root ์ปดํฌ๋ํธ๋ก props๋ ์ปจํ
์คํธ(context)๋ก๋ ๊ฑฐ์ ๋ฐ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ง๊ธ ์ํ(state) ๋ณํ๋ฅผ ์ด์ฉํด์ ์์ ์ค๋ช
ํ ์ด๋ก ์ ์ด์ผ๊ธฐ๋ค์ ์ถ์์ ์ธ ์ดํด๊ฐ ์๋ ์ค์ง์ ์ธ ์ดํด๋ก ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.<div className="app">
<h1>Hi there!</h1>
{showParagraph && <p>This is New!</p>}
</div>
showParagraph
์ํ(state)์ setShowParagraph
์ํ(state) ์
๋ฐ์ดํธ ํจ์๋ฅผ ์ด์ฉํด์, ์ฆ ์ด์ ์ ๋ฐฐ์ด ์กฐ๊ฑด๋ถ ์์ ์ด์ฉํด์ showParagraph
๊ฐ true ์ผ ๋๋ง <p>
ํ๊ทธ์ ๋ฌธ์ฅ์ด ํ์๋๋๋ก ์์ ํด์ฃผ์๋ค. showParagraph
์ํ(state)์ ์ด๊ธฐ ๊ฐ์ด false ์ด๋ฏ๋ก, ์ฒ์ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ฉด, <p>
ํ๊ทธ์ ๋ฌธ์ฅ์ ๋ณด์ด์ง ์์ ๊ฒ์ด๋ค. ์ด์ <p>
ํ๊ทธ์ ๋ฌธ์ฅ์ ๋ณด์ผ ์ ์๊ฒ๋ showParagraph
์ํ(state) ๊ฐ์ ๋ณ๊ฒฝํด๋ณด์.const Button = (props) => {
return (
<button
type={props.type || "button"}
className={`${classes.button} ${props.className}`}
onClick={props.onClick}
disabled={props.disabled}
>
{props.children}
</button>
);
};
import Button from "./components/UI/Button/Button";
...
<div className="app">
<h1>Hi there!</h1>
{showParagraph && <p>This is New!</p>}
<Button onClick={}>Toggle Paragraph!</Button>
</div>
Button
์ปดํฌ๋ํธ๋ฅผ import ํ๊ณ onClick ์ด๋ผ๋ prop์ผ๋ก (์ํ๋ฅผ ๋ณํ์ํค๋)ํธ๋ฆฌ๊ฑฐ ํจ์๋ฅผ ์คํํ ์ ์๋๋ก ๋ฐ์ธ๋ ํ๋ค.const toggleParagraphHandler = () => {
setShowParagraph((prevParagraph) => !prevParagraph);
};
...
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
showParagraph
์ํ(state)์ ์
๋ฐ์ดํธ ํจ์์ธ setShowParagraph()
๋ฅผ ๋ถ๋ฌ์ค๊ณ , ํด๋น ํธ๋ฆฌ๊ฑฐ ํจ์๊ฐ Button
์ปดํฌ๋ํธ์ onClick ์ด๋ฒคํธ๋ก ํธ๋ฆฌ๊ฑฐ ๋ ๋๋ง๋ค ๊ธฐ์กด์ ์ํ(prevParagraph
)์ ๋ฐ๋๊ฐ(!prevParagraph
)์ผ๋ก ์
๋ฐ์ดํธํ๋๋ก ์์ฑํ๋ค..app {
...
text-align: center;
}
App
์ปดํฌ๋ํธ์ ๊ฐ๋จํ ๋ก๊ทธ๋ฅผ ์์ฑํด๋ณด์.console.log("APP RUNNING");
const toggleParagraphHandler = () => {
setShowParagraph((prevParagraph) => !prevParagraph);
};
console.log("APP RUNNING");
๋ฅผ ์ถ๊ฐํด์ ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค "APP RUNNING" ๋ฌธ๊ตฌ๋ฅผ ์ฝ์๋ก๊ทธ์ ์ถ๋ ฅํ๋๋ก ํ๋ค.App
์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ์ต์ด๋ก ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒซ ๋ ๋๋ง์ ํ๋ฉด์ ๋ฆฌ์กํธ๋ <div>
์ <h1>
์์ ๊ทธ๋ฆฌ๊ณ <Button>
์ด ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์ฐ๋ฆฌ๊ฐ ์กฐ๊ฑด๋ถ ์์ผ๋ก ์์ฑํ๋ <p>
์ ๋ฌธ์ฅ๋ค์ ํ์๋์ง ์๋๋ค. <p>
์ ๋ฌธ์ฅ์ด true ์ผ ๋๋ง ํ์ํ๋๋ก ์ปจํธ๋กคํ๋ ์ํ(state) ๊ฐ์ ์ด๊ธฐ ๊ฐ์ false ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฆฌ์กํธ๊ฐ App
์ปดํฌ๋ํธ๋ฅผ ์ฒ์์ผ๋ก ๋ ๋๋งํ ์ดํ ์ถ๋ ฅํ ๊ฒ์ ์๋ค. ์ฆ ์ด์ ์ค๋
์ท์ ์กด์ฌํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ฐจ์ด์ ์ ๋น๊ตํ๋ ๊ณผ์ ์์ <div>
์ <h1>
์์ ๊ทธ๋ฆฌ๊ณ <Button>
๊ฐ ๋ค์ ๋ ๋๋งํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ณด๊ฐ ReactDOM ํจํค์ง๋ก ์ ๋ฌ๋๋ฉฐ ํ๋ฉด์ ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ ํ์๋๋ค.App
์ปดํฌ๋ํธ๋ ์ฌ์คํ๋๋ฉฐ ๋ค์ ๋ ๋๋ง ๋๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ค์ DOM ์๋ ์ด๋ค ์ํฅ์ ๋ผ์น ๊น? ๋ผ์ด๋ธ ์๋ฒ๋ฅผ ์ด๊ณ , ๊ฐ๋ฐ์ ๋๊ตฌ์ Elements ํญ์ ํ์ธํด๋ณด์.ํ์ด์ง๋ฅผ ๋ก๋ํ๋ฉด ๊ฐ๋ฐ ์ฐฝ์ <div>
์ <h1>
์์ ๊ทธ๋ฆฌ๊ณ <Button>
์์๊ฐ ์กด์ฌํ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
๊ฐ๋ฐ ํด์ Elements ํญ์ DOM ์์ ๋ฐ์ํ ๋ณ๊ฒฝ ์์๋ค์ ๊ฐ์กฐํด์ ํ์ํด์ค๋ค. ์ด๋ฅผ ํตํด ์ค์ DOM์ด ์๋ก ๋ ๋๋ง ๋๊ฑฐ๋ ๊ฐฑ์ ๋ ์์๋ค์ ๋ณผ ์ ์๋ ๊ฒ์ด๋ค.
<Button>
์ ํด๋ฆญํ๋ฉด, <p>
๋ถ๋ถ์ด ๊ฐ์กฐ๋์ด ํ์๋๋ ๊ฑธ ์ ์ ์๋ค. ๋ฐ๋ฉด ๊ธฐ์กด์ <div>
์ <h1>
, <Button>
์์๋ค์ ์ด์ ๊ณผ ๊ทธ๋๋ก์ด๋ค. ๋ค์ <Button>
์ ํด๋ฆญํ๋ฉด <div>
์์๊ฐ ๊ฐ์กฐ ํ์ ๋๋ค. ์ด ์์ ์๋ <p>
์์๊ฐ ์ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ฒ๋ผ ์ค์ DOM์ ํตํ ์
๋ฐ์ดํธ๋ ๋ฆฌ์กํธ์ ๊ฐ์ DOM ๊ณผ ์ต์ข
์ค๋
์ท์ ์ ์ฅํ๊ณ ์๋ ์ค์ DOM ๊ณผ์ ์ฐจ์ด์ ๋ง ๋ฐ์๋๋ ๊ฒ์ด๋ค.
Demo
๋ฅผ ๋ง๋ค๊ณ , ์ฌ๊ธฐ์ ์๋ก์ด ํ์ผ DemoOutput.js
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.const DemoOutput = (props) => {
return;
};
App
์ปดํฌ๋ํธ์ ์กฐ๊ฑด์ <p>
๋ฌธ์ฅ์ ์ ๊ฑฐํ๊ณ , DemoOutput
์ปดํฌ๋ํธ์ ๋ฃ์ด์ค๋ค.const DemoOutput = (props) => {
return <p>This is New!</p>;
};
show
์ํ(state)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์กฐ๊ฑด์ <p>
ํ๊ทธ ์ ๋ฌธ์ฅ์ ๋ ๋๋งํ๋ค.const DemoOutput = (props) => {
return <p>{props.show ? "This is New!" : ""}</p>;
};
App
์ปดํฌ๋ํธ๋ก ๋์์์, DemoOutput
์ปดํฌ๋ํธ๋ฅผ import ํ๊ณ , ์ง์ ์ ์ง์์ค ์ฝ๋ ์์น์ ์์น์ํจ ๋ค, show ๋ผ๋ ํ๋์ props๋ก showParagraph
์ํ(state) ๊ฐ์ ๋๊ฒจ์ค๋ค.<div className="app">
<h1>Hi there!</h1>
<DemoOutput show={showParagraph} />
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
</div>
DemoOutput
์ปดํฌ๋ํธ์ props ๋ก ๋๊ฒจ์ค show์ ์ํ๊ฐ์ ๋ฐ๋ผ ๊ธฐ๋ณธ ๊ฐ์ false๊ฐ ๋ ๊ฒ์ด๊ณ , ๋ฒํผ์ ํด๋ฆญํ๋ฉด true๋ก ์ํ๊ฐ์ด ์
๋ฐ์ดํธ ๋์ด <p>
ํ๊ทธ ๋ด๋ถ์ ๋ฌธ์ฅ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.DemoOutput
์ปดํฌ๋ํธ๋ ํญ์ ๋ ๋๋ง ๋๊ณ , DemoOutput
์ปดํฌ๋ํธ ์์์๋ <p>
ํ๊ทธ๊ฐ ํญ์ ๋ ๋๋ง ๋์ง๋ง, <p>
ํ๊ทธ ๋ด๋ถ์ ๋ฌธ์์ด์ props.show
์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒ์ด๋ค.Elements
ํญ์์ ์ด์ ๊ณผ๋ ์ฐจ์ด์ ์ด ์์์ ์ ์ ์๋๋ฐ,ํ๋ฉด์ ๋ ๋๋งํ์๋ง์ DOM
์ ํ์ฅํด์ ๋ณด๋ฉด <p>
ํ๊ทธ ์์๊ฐ ํญ์ ํ์๋์ด ์๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ด๋ฒ์๋ <p>
ํ๊ทธ๊ฐ ๊น๋นก์ด๊ณ , ๋ค์ ํด๋ฆญํ๋ฉด <p>
ํ๊ทธ ์ญ์ ๋ค์ ๊น๋นก์ธ๋ค.
<p>
ํ๊ทธ๊ฐ ๊น๋นก์ด๋ ์ด์ ๋ ํ
์คํธ์ ์ถ๊ฐ์ ์ญ์ ๊ฐ <p>
ํ๊ทธ ์์ ์์์๋ง ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ์ ์ ์ฒด ์์์ ๋ํ ๋ณ๊ฒฝ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ ํ
์คํธ๊ฐ ์๋ <p>
ํ๊ทธ๊ฐ ๊น๋นก์ด๋ ์ด์ ๋ ์ด ํ
์คํธ๊ฐ <p>
ํ๊ทธ์ props
์ ๋์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌผ๋ก , ์ด๋ฅผ ์ปจํ
์คํธ๋ผ๊ณ ํ ์๋ ์๊ฒ ์ง๋ง ์ด๊ฒ์ ์์ฐํ <p>
ํ๊ทธ์ด๋ค.
์ด ๋ง์ธ ์ฆ์จ, ์ด <p>
ํ๊ทธ๋ ํ์ฌ <p>
ํ๊ทธ์ ์ ์๋์ ์์นํ <h1>
์ด๋ <button>
๊ฐ์ ์ผ๋ฐ์ ์ธ ํ๊ทธ ์์๊ฐ ์๋๋ผ๋ ๋ป์ด๋ค. ์๋ํ๋ฉด, ๋ฆฌ์กํธ์ ์
๋ฐ์ดํธ ๋งค์ปค๋์ฆ์ ๊ฐ์์ DOM
๊ณผ ์ค์ DOM์ ์ค์ง์ ์ธ ์ฐจ์ด์ ์ ๋น๊ตํ์ฌ ์คํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ,
App
์ปดํฌ๋ํธ์ ์ํ๋ ๊ณ์ ๋ฐ๋๋ ์ค์ ๋ก ๋ฐ๋๋ ๋ถ๋ถ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ผ๋ถ๋ถ์ด๋ค.
์ด ์ฌ๋ก๋ ๋ฆฌ์กํธ๊ฐ ๊ฐ์์ DOM
์ ์ฌ์ฉํ์ฌ ๋์์์ด ์ค์ ์ DOM
๊ณผ ๊ณ์ ๋น๊ต ์์
์ ํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ DOM
์ ์
๋ฐ์ดํธ๋ฅผ ํ๋ค๋ ์ฆ๊ฑฐ๊ฐ ๋๋ค.
console.log("APP RUNNING");
const toggleParagraphHandler = () => {
setShowParagraph((prevParagraph) => !prevParagraph);
};
๋ค์ ๊ฐ๋ฐ์ ๋๊ตฌ์ Console
๋ก ์ด๋ํด์ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด, ์๊น์ APP RUNNING
๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๊ณ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค ๋ฌธ๊ตฌ๊ฐ ์ถ๊ฐ๋ก ํ์ธ๋๋ค. ์ค์ ๋ณ๊ฒฝ์ DemoOutput
์์ ๋ฐ์ํ์ง๋ง props.show
์ ๋ํ ์ํ(state)๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ App
์ปดํฌ๋ํธ ์ญ์ ๋ค์ ์คํ๋๋ ๊ฒ์ด๋ค.
์ํ(state)๋ props ๋๋ ์ปจํ
์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์์ ํด๋น ์ํ(state)๋ฅผ ๋ณํ์ํจ๋ค๊ณ ํด๋, ์ฌ์คํ-๋ฆฌ๋ก๋ ๋๋ค. ํ์ฌ show
๋ผ๋ ์ํ(state)๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ ๊ฑด App
์ด๊ธฐ ๋๋ฌธ์, App
์์ ๊ด๋ฆฌ๋๋ ์ํ(state)์ ๋ฐ๋ฅธ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์๊ฐ์ ์ผ๋ก ์ํฅ์ ์คฌ์ ๋ ๋น์ฐํ App
์ปดํฌ๋ํธ๊ฐ ์ฌ์คํ๋๊ฑฐ๋ ๋ฆฌ๋ก๋ ๋๋ ๊ฒ์ด๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก App
์ด ์ด ๋ชจ๋ ๋ณํ์ ์ํ(state) ๊ด๋ฆฌ๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
const DemoOutput = (props) => {
console.log("DemoOutput RUNNUNG");
return <p>{props.show ? "This is New!" : ""}</p>;
};
DemoOutput
์ปดํฌ๋ํธ์ "DemoOutput RUNNUNG" ์ ์ถ๋ ฅํ๋๋ก console.log
๋ฅผ ์ถ๊ฐํ๋ค.APP
๊ณผ DemoOutput
์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๋์ ๋ ์ถ๋ ฅ๋๋ ๋ฌธ๊ตฌ๋ค์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋งค๋ฒ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค "DemoOutput RUNNUNG" ์ด ์ถ๋ ฅ๋๋ค. ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค show
๋ผ๋ props
๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ APP
๊ณผ DemoOutput
์ปดํฌ๋ํธ ์ญ์ ๊ทธ์ ๋ฐ๋ผ์ ์ฌ์คํ ๋๋ค๋ ๋ป์ด๋ค.<DemoOutput show={showParagraph} />
DemoOutput
์ปดํฌ๋ํธ์ show
prop ์ผ๋ก ์ ๋ฌํ๋ ์ํ(state) ๊ฐ์ธ showParagraph
๋ฅผ ์์ ํด์ฃผ์.<DemoOutput show={false} />
DemoOutput
์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ show
์ ๊ฐ์ false๋ก ๋ฐ๊ฟ์ค ๊ฒ์ด๋ค. onClick
์ด๋ฒคํธ๋ก showParagraph
์ํ(state) ๊ฐ์ ๋ณ๊ฒฝ์ ํด์ฃผ๊ณ ์์ง๋ง showParagraph
๊ฐ์ ๊ฐ์ํํ๋ DemoOutput
์ ์ด ์
๋ฐ์ดํธ ๋ showParagraph
๊ฐ์ ์ ๋ฌํด์ฃผ์ง ์๊ณ ์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ป๊ฒ ๋ ๊น? ํ์ด์ง๋ฅผ ์ฌ์คํํด๋ณด์.App
๊ณผ DemoOutput
์ปดํฌ๋ํธ ๋ชจ๋ ๋ ๋๋ง ๋๊ณ ๋ ํ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์ ๋์ผํ๊ฒ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ์์ ์ค์ ํ ์ฝ์ ๋ก๊ทธ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๋ค. ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ๋ง์ด๋ค.DemoOutput
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ์ด์ App
์ปดํฌ๋ํธ์์ DemoOutput
์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ show
์ ๊ฐ์ props ๊ฐ์ false๋ก ๊ณ ์ ์ ํด์ฃผ์์์๋ ๋ถ๊ตฌํ๊ณ DemoOutput
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค. ์ ๊ทธ๋ด๊น? ํ๋ํ๋ ์ง์ด๋ณด๋๋ก ํ์.
๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค App
์ปดํฌ๋ํธ๋ showParagraph
์ํ(state)๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๋น์ฐํ๊ฒ๋ ๋ฆฌ๋ ๋๋ง ๋๋ค.
return (
<div className="app">
<h1>Hi there!</h1>
<DemoOutput show={false} />
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
</div>
);
App
์ปดํฌ๋ํธ๋ ๋ฌด์์ ๋ฐํํ ๊น? ๋น์ฐํ JSX
์ฝ๋๋ฅผ ๋ฐํํ๋ค. ์ฌ๊ธฐ์ ์๋ ๋ชจ๋ JSX ์์๋ค์ ๊ฒฐ๊ตญ ์ปดํฌ๋ํธ ํจ์์ ๋ํ ํจ์ ํธ์ถ๊ณผ ๋์ผํ๋ค. ์ด๋ง์ธ ์ฆ์จ, App
์ปดํฌ๋ํธ๊ฐ ๋ฐํํ๋ JSX ์์๋ค ์์ ์๋ DemoOutput
์ด๋, Button
์ปดํฌ๋ํธ ๋ฑ์ ํธ์ถํ๊ณ ์๋ค๋ ๋ป์ด๋ค. App
์ปดํฌ๋ํธ์์ ๊ด๋ฆฌํ๊ณ ์๋ ์ํ(state)๊ฐ ๋ณํํ ๋๋ง๋ค APP
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ฒ๋ผ, App
์ปดํฌ๋ํธ์์ ๋ฐํํ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ(DemoOutput
, Button
) ์ญ์ ๋์ผํ๊ฒ ๋ฆฌ๋ ๋๋ง ๋๋ค๋ ๋ป์ด๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ ํจ์๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฉด, ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ปดํฌ๋ํธ ํจ์๋ ๋ฆฌ๋ ๋๋ง ๋๋ค. ๋ฐ๋ผ์ props์ ๊ฐ์ ์ด ๋ฆฌ๋ ๋๋ง๊ณผ ๊ด๋ จํ์ฌ ์๊ด์ด ์๋ค๊ณ ํ ์ ์์ ๊ฒ์ด๋ค.
DOM
์ ์
๋ฐ์ดํธ๋ก ์ด์ด์ง ์๋ ์์ผ๋, ์ปดํฌ๋ํธ ํจ์์์ ๋ฆฌ๋ ๋๋ง์ ํ ๋๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ๊ฒ๋ง์ผ๋ก ์ถฉ๋ถํ๋ค. ๊ทธ๋ฌ๋ DemoOutput
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ด ์ค์ DOM
์ด ์
๋ฐ์ดํธ๋๋ค๋ ๊ฒ๊ณผ ๋์ผํ ๋ป์ ์๋ ๊ฒ์ด๋ค.Element
๋ฅผ ํ์ธํด๋ณด๋ฉด, ๋ฒํผ์ ์๋ฌด๋ฆฌ ๋๋ฌ๋ ํด๋น ์์๋ค ์ค ๊ทธ ์ด๋ ๊ฒ๋ ๋ฐ์ง์ด์ง ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค. ์์ ์ฌ๋ฌ ๋ฒ ๊ฑฐ๋ก ํ ๊ฒ์ฒ๋ผ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง๊ณผ ์ปดํฌ๋ํธ ํจ์์ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋, ์ค์ DOM
์ด ๋ค์ ๋ ๋๋ง๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.App
์ปดํฌ๋ํธ๊ฐ ์ฌ์คํ๋ ๋๋ง๋ค DemoOutput
์ปดํฌ๋ํธ ๋ฟ๋ง์ด ์๋๋ผ, Button
์ปดํฌ๋ํธ ์ญ์ ๋ฆฌ๋ ๋๋ง ๋๋ค. ๋ง์ฝ App
์ปดํฌ๋ํธ์์ ๋ฐํํ๋ ์์ ์ปดํฌ๋ํธ์ธ DemoOutput
์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ ๋ค๋ฅธ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ค๋ฉด, ๊ทธ ์ปดํฌ๋ํธ ์ญ์ App
์ปดํฌ๋ํธ๊ฐ ์ฌ์คํ๋ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.์ด๋ ๊ฒ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ก ๋ป์ด๋๊ฐ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ๊ฒ์ ๋ณผ ๋๋ง๋ค ์๋ฌธ์ด ์๊ธธ ์๋ ์๋ค. App
์ปดํฌ๋ํธ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์์ ์ปดํฌ๋ํธ ํจ์๊ฐ ๋์์ ๋ฆฌ๋ ๋๋ง ๋๋ฉด, ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง๋ ์์๊น ํ๋ ์๋ฌธ ๋ง์ด๋ค. ํ์ง๋ง ๊ธฐ์ตํ์. ๋ฆฌ์กํธ๋ ๊ฐ์์ DOM
๊ณผ ์ค์ DOM
์ ๋น๊ตํ์ฌ ์ค์ง์ ์ผ๋ก ๋ณํ ๋ถ๋ถ๋ง ์
๋ฐ์ดํธ๋ฅผ ํ๋ค.
๋ฐฉ๊ธ ์ ์์๋ฅผ ๋ดค๋ฏ์ด, DemoOutput
์ปดํฌ๋ํธ๋ ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฏ๋ก DemoOutput
์ปดํฌ๋ํธ๋ ์ฌํ๊ฐ ๋์ง ์๋๋ค. ๋ง์ฝ DemoOutput
์ปดํฌ๋ํธ์ prop ์ผ๋ก ๋ด๋ ค์ฃผ๋ ๊ฐ์ ์ง์ด๋ค๋ฉด, App
์ปดํฌ๋ํธ์ ์ํ(state) ๋ณ๊ฒฝ์ด ์์ผ๋ฏ๋ก ์ถ๋ ฅ ๊ฒฐ๊ณผ ์ญ์ ๋ฐ๋๋ ๊ฒ์ด ์์ ๊ฒ์ด๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , DemoOutput
์ปดํฌ๋ํธ์ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ํ๋ ๊ฒ์ ์๋ง๋ ๋ถํ์ํ ๋ญ๋น๊ฐ ๋ ์ ์๋ค.
๐จ ํด๋น ํฌ์คํ ์ Udemy์ โReact ์๋ฒฝ ๊ฐ์ด๋โ ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ