โ™พ๏ธ

2. useState

ย 
ย 

2.1 useState๋ž€?

useState๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋ณธ Hook์ž…๋‹ˆ๋‹ค. useState์—์„œ๋Š” ์ฃผ์š” ํ‚ค์›Œ๋“œ์ธ state์™€ setState๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

2.1.1 state

React์—์„œ์˜ state๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ด€๋ฆฌ ๋ฐ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. React์—์„œ๋Š” state๊ฐ€ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€, state ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
// ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ function Product() { // const [state, setState] = useState(์ดˆ๊นƒ๊ฐ’); const [price, setPrice] = useState(1000); // ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ class Product extends React.Component { constructor(props) { super(props); this.state = { price: 1000 }; }
ย 
์œ„์˜ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useState Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ๋ณ€์ˆ˜ price์— ์ƒํƒœ ๊ฐ’์œผ๋กœ 1000์ธ ์ดˆ๊นƒ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” this.state = { price: 1000 }; ์„ ์‚ฌ์šฉํ•˜์—ฌ price๋ฅผ 1000์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ constructor(์ƒ์„ฑ์ž) ์•ˆ์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ย 
state๋Š” JavaScript์˜ ๊ฐ์ฒด์ด๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ state๋ฅผ props๋ฅผ ํ†ตํ•ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ  ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. state๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ ์™ธ์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ์ปฌ ๋˜๋Š” ์บก์Šํ™”๋ผ๊ณ  ํ‘œํ˜„๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
props๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? props๋„ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ์ด์ž, JavaScript์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” state์™€ ๋‹ค๋ฅด๊ฒŒ โ€˜์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•œ๋‹คโ€™๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. React ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ž์‹ ์˜ props๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€ํ•จ์—†์ด ๋™์ผํ•œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ Œ๋”๋ง ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด props๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
function Introduce(props) { // --- โ‘ก return <h1>๋‚˜๋Š” {props.color}์ƒ‰์„ ์ข‹์•„ํ•ด!</h1>; } const root = ReactDOM.createRoot(document.getElementById("root")); const element = <Introduce color="์ดˆ๋ก" />; // --- โ‘  root.render(element);
ย 
  1. <Introduce color=โ€์ดˆ๋กโ€ /> element๋กœ root.render()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  1. props๋กœ {color: โ€œ์ดˆ๋กโ€} ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ Introduce ์ปดํฌ๋„ŒํŠธ์— ํ˜ธ์ถœ๋˜์–ด ์ „๋‹ฌ๋ฐ›๊ณ , ํ™”๋ฉด์—์„œ๋Š” Introduce ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’, ๋‚˜๋Š” ์ดˆ๋ก์ƒ‰์„ ์ข‹์•„ํ•ด! ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
ย 
์ฆ‰, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ๋‹จ์ผ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•˜๋Š”๋ฐ ๋ฐ”๋กœ ์ด โ€˜๋‹จ์ผ ๊ฐ์ฒดโ€™๊ฐ€ props์ž…๋‹ˆ๋‹ค.
ย 

2.1.2 setState

์œ„์—์„œ state๋Š” ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ด€๋ฆฌ๋˜๊ณ  ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ž„์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. state์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ setState๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋ฉฐ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ 2.3.3 ์ฑ•ํ„ฐ์—์„œ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
<button onClick={() => this.setState({ price: this.state.price + 100})}>๊ฐ€๊ฒฉ ์ธ์ƒโฌ†๏ธ</button>
ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ this.setState ์‚ฌ์šฉ
ย 
์ด ์ฑ…์—์„œ ์„ค๋ช…ํ•  React์˜ ๊ธฐ๋ณธ Hook์ธ useState๋Š” setState ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒˆ state ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›์•„์„œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์„ ํ์— ๋“ฑ๋กํ•˜๊ณ  ์ตœ์‹  state๋กœ ๊ฐฑ์‹ ํ•ด ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ props์™€ ๋™์ผํ•˜๊ฒŒ setState ํ•จ์ˆ˜๋„ ๋™์ผ์„ฑ์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ๋ฆฌ๋ Œ๋”๋ง ์‹œ์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ย 

2.1.3 useState

์œ„์˜ ์˜ˆ์‹œ๋“ค์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. React Hook์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋Š” state ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ–ˆ์œผ๋‚˜ ์ด์ œ๋Š” React ๊ธฐ๋ณธ Hook์ธ useState๋กœ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋„ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” useState์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฐ’์ธ state ๋ณ€์ˆ˜์™€ ๊ทธ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” setState ํ•จ์ˆ˜๋ฅผ ์Œ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • useState ํ˜ธ์ถœ ์‹œ, ์ปดํฌ๋„ŒํŠธ state๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” state์˜ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ๋ฐฐ์—ด, ๋ฌธ์ž, ์ˆซ์ž ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ useState Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • function Person() { // const [state, setState] = useState(์ดˆ๊นƒ๊ฐ’); const [age, setAge] = useState(18); const [grade, setGrade] = useState("A"); const [todos, setTodos] = useState([{ subject: "Math" }]); const [check, setCheck] = useState(false); ... }
ย 

2.2 useState๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

React์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ state ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ด์œ ๋Š” DOM ๋ Œ๋”๋ง๊ณผ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ state ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ์ค‘์—์„œ๋„ ์™œ useState๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

2.2.1 ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ์˜ค๋Š˜ ๋งˆ์‹  ๋ฌผ์ด ๋ช‡ ์ž”์ธ์ง€ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์˜ ํด๋ฆญ ํšŸ์ˆ˜์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ธ drink๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ drinkWater ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด drink ๋ณ€์ˆ˜์— ํด๋ฆญ ํšŸ์ˆ˜๊ฐ€ ๋ˆ„์ ๋˜์–ด โ“ต์— ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.
ย 
// ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ function App() { let drink = 0; // ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ const drinkWater = () => { drink += 1; console.log(`๋ฒ„ํŠผ ํด๋ฆญํšŸ์ˆ˜: ${drink}๋ฒˆ`); }; return ( <> <p> ๐Ÿฅค ์˜ค๋Š˜์€ ๋ฌผ <strong> {drink}</strong>์ž”์„ ๋งˆ์…จ์–ด์š”! // --- โ“ต </p> <button onClick={drinkWater}>๐Ÿ’ง</button> </> ); } export default App;
App.js
ย 
๊ทธ๋ฆผ 2-1๊ทธ๋ฆผ 2-1
๊ทธ๋ฆผ 2-1
ย 
drink์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ™”๋ฉด์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒํ–ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ˜์†”์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด drink์˜ ๊ฐ’์€ ๋ณ€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ ํ™”๋ฉด์—๋Š” ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
์ด์œ ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ๋ Œ๋”๋ง ๋  ๋•Œ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ดˆ๊ธฐํ™” ๋˜์ง€๋งŒ, state ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋ฐ˜์˜ํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ย 

2.2.2 State ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

์ด์ œ useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ drink์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. useState๋ฅผ ์„ ์–ธํ•ด ์ฃผ๊ณ , setDrink ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
ย 
import { useState } from "react"; function App() { const [drink, setDrink] = useState(0); // useState ์‚ฌ์šฉ const drinkWater = () => { setDrink(drink + 1); }; return ( <> <p> ๐Ÿฅค ์˜ค๋Š˜์€ ๋ฌผ <strong> {drink}</strong>์ž”์„ ๋งˆ์…จ์–ด์š”! </p> <button onClick={drinkWater}> ๐Ÿ’ง </button> {console.log(`๋ฒ„ํŠผ ํด๋ฆญํšŸ์ˆ˜: ${drink}๋ฒˆ`)} </> ); } export default App;
App.js
ย 
๊ทธ๋ฆผ 2-2๊ทธ๋ฆผ 2-2
๊ทธ๋ฆผ 2-2
ย 
์ผ๋ฐ˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๋‹ค๋ฅด๊ฒŒ setDrink ํ•จ์ˆ˜๋กœ ์ƒํƒœ ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด ์คฌ๊ธฐ ๋•Œ๋ฌธ์— drink์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง ๋˜์–ด ์ตœ์‹  ๊ฐ’์ด ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

2.2.3 React๊ฐ€ useState ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ 

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” state ๋ณ€๊ฒฝ์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์ด ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— state์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐฑ์‹ ํ•ด ์ฃผ๋Š” ๊ฒƒ์— ๋” ๊ฐ€๊น๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
useState๋Š” ์ƒํƒœ ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์™€ state๋ฅผ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ํ•จ์ˆ˜์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” state ๋ณ€์ˆ˜์™€ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” setState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.
ย 
const [state, setState] = useState(์ดˆ๊นƒ๊ฐ’);
ย 
์ด๋Š” ๊ธฐ์กด์˜ state๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ state๋ฅผ ๊ฐฑ์‹ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, setState๋ฅผ ํ†ตํ•ด state์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์•Œ์•„์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ย 
โ“
setState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ์•ž์„œ state๋Š” ๊ฐ์ฒด๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— state ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. state๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๊ฐ’๊ณผ ์ด์ „ ๊ฐ’์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ๊ฐ™์•„์ง€๋ฉด์„œ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์ด ๊นจ์ง€๊ฒŒ ๋˜๊ณ , React ๋˜ํ•œ ์ฐธ์กฐ ๊ฐ’์ด ๊ฐ™์•„ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React๋Š” state์— ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ state ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๊ฐ’(์ฃผ์†Œ๊ฐ’)๋งŒ ๋น„๊ตํ•˜์—ฌ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— React์—์„œ๋Š” ๋ณ€๊ฒฝ๋œ state ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜์˜ํ•ด ์ฃผ๊ฑฐ๋‚˜ ์ด์ „ state ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ state๋ฅผ ๋ฐ”๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ๊ฐ์ฒด ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ state ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
ย 
์ด์ œ๋ถ€ํ„ฐ ์‹ค์Šต์„ ํ†ตํ•ด useState์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.
ย 

2.3 useState ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

useState๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ์„ค์ •์„ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. React ์„ค์น˜๋Š” ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
npx create-react-app my-app . // npx create-react-app my-app --template basic-react // ์ตœ์†Œํ•œ์˜ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
ย 

2.3.1 import ํ•˜๊ธฐ

useState๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” react ๋ชจ๋“ˆ์—์„œ useState๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
import { useState } from 'react';
App.js
ย 
๐Ÿ’ก
useState๋ฅผ ์ •ํ™•ํžˆ ์–ด๋””์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฑด๊ฐ€์š”? React๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” ํด๋”๋“ค ์ค‘์—๋Š” node_module์ด๋ผ๋Š” ํด๋”๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ ์•ˆ์— ์žˆ๋Š” react ๋ชจ๋“ˆ ํด๋”๋ฅผ ์ž˜ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด ๋‹ค์–‘ํ•œ Hooks ํ•จ์ˆ˜๋“ค์ด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Hook์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆผ 2-3 node_modules/react/cjs/react.development.js๊ทธ๋ฆผ 2-3 node_modules/react/cjs/react.development.js
๊ทธ๋ฆผ 2-3 node_modules/react/cjs/react.development.js
ย 

2.3.2 useState ์„ ์–ธํ•˜๊ธฐ

const [state, setState] = useState(์ดˆ๊นƒ๊ฐ’);
ย 
useState ํ•จ์ˆ˜์— ์ดˆ๊นƒ๊ฐ’์„ ๋„ฃ์–ด ํ˜ธ์ถœํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ์ด๋Š” ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ state์™€ setState๋ผ๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ ๋„˜๊ธด ์ดˆ๊นƒ๊ฐ’์€ state ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์€ state ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๊ณ , state ๋ณ€์ˆ˜ ์•ˆ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด setState ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ state๋ผ๋Š” ๋ณ€์ˆ˜ ๋ช…์€ count, email ๋“ฑ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๋‹ค์Œ ์ฝ”๋“œ๋Š” count๋ผ๋Š” ๋ณ€์ˆ˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์žˆ๊ณ , setCount ํ•จ์ˆ˜๋Š” count ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž„์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
const [count, setCount] = useState(0);
ย 

2.3.3 state ๊ฐ€์ ธ์˜ค๊ธฐ, ๊ฐฑ์‹ ํ•˜๊ธฐ

์œ„์—์„œ ์ƒ์„ฑํ•œ ๋ณ€์ˆ˜ count๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•ด ๋ด…์‹œ๋‹ค.
ย 
<p>You clicked {count} times</p>
ย 
๊ทธ๋Ÿผ ์ด count ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด count ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด setCount๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ย 
<button onClick={() => setCount(count + 1)}> Click me </button>
ย 
๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด onClick ์ด๋ฒคํŠธ๋กœ ์ธํ•ด setCount ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , count ๋ณ€์ˆ˜์— 1์„ ๋”ํ•ด ๊ฐ’์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. count ๋ณ€์ˆ˜๋Š” ํด๋ฆญ๋  ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€๋œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 

2.3.4 (์‹ค์Šต) useState์˜ ์ž‘๋™๋ฐฉ์‹

๊ทธ๋ ‡๋‹ค๋ฉด useState๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ๊ฐฑ์‹ ๋˜๋Š” ๊ฑธ๊นŒ์š”? ์ด ๊ณผ์ •์€ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.
ย 
import { useState } from "react"; import "./app.css"; function App() { const [count, setCount] = useState(0); console.log("๋ Œ๋”๋ง ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); console.log(`ํ˜„์žฌ count : ${count}`); return ( <div> <img src="./๋ผ์ด์บฃ.png" alt="๋ผ์ด์บฃ"></img> <p>๋ผ์ด์บฃ์ด ๊ท€์—ฌ์šฐ์‹œ๋‹ค๋ฉด ๋”ฐ๋ด‰์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!</p> <button onClick={() => { console.log("-----------"); console.log("๐Ÿ‘ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค."); setCount(count + 1); console.log(`๋ Œ๋”๋ง ๋˜๊ธฐ ์ „์˜ count : ${count}`); }} > ๐Ÿ‘ </button> <span>{count}</span> </div> ); } export default App;
App.js
ย 
๊ทธ๋ฆผ 2-4๊ทธ๋ฆผ 2-4
๊ทธ๋ฆผ 2-4
๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉด์„œ count ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†”์ฐฝ์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜๊ณ  count ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๊ฐฑ์‹ ๋˜๋Š” ๊ณผ์ •์„ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.
ย 
๐Ÿ’ก
React Developer Tools ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๋ฉด ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ตฌ๊ฐ„์„ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
  1. ์ฒ˜์Œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๊ณ  ์ดˆ๊นƒ๊ฐ’์ด ๋‹ด๊ธด count๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  1. ์ดํ›„, ๐Ÿ‘ย ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฐ”๋กœ setCount ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ํ˜„์žฌ ์‹œ์ ์˜ count๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  1. ๋ Œ๋”๋ง์ด ๋œ ํ›„, ํ˜„์žฌ ์‹œ์ ์˜ count ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
ย 
ํ˜น์‹œ ์ฝ˜์†”์ฐฝ์—์„œ ์กฐ๊ธˆ ์˜์•„ํ•œ ๋ถ€๋ถ„์ด ๋ณด์ด์‹œ์ง€ ์•Š๋‚˜์š”?
ย 
๐Ÿ‘ย ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด setCount ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋ฐ”๋กœ count ๊ฐ€ ๊ฐฑ์‹ ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ์ดํ›„์—๋„ count ๊ฐ’์€ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ณ  ๋‚œ ํ›„์—์•ผ count ๊ฐ€ ๊ฐฑ์‹ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ์™œ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๋Š” ๊ฑธ๊นŒ์š”?
๊ทธ๋ฆผ 2-5๊ทธ๋ฆผ 2-5
๊ทธ๋ฆผ 2-5
ย 
์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉฐ ์—…๋ฐ์ดํŠธ ๊ณผ์ •์„ ์ˆœ์„œ๋Œ€๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
  1. setCount ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ฐฑ์‹ ํ•  ๊ฐ’์„ react ๋ชจ๋“ˆ ๋‚ด ์„ ์–ธ๋œ ์ „์—ญ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด ์ค๋‹ˆ๋‹ค.
  1. ์ดํ›„, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๊ณ  App.js๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ดˆ๊นƒ๊ฐ’ 0์„ ๋‹ค์‹œ useState์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด์„œ useState ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  1. ํ˜ธ์ถœ๋œ useState ํ•จ์ˆ˜๋Š” ๋จผ์ € react ๋ชจ๋“ˆ ๋‚ด ์„ ์–ธ๋œ ์ „์—ญ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ดˆ๊นƒ๊ฐ’ 0์€ ๋ฌด์‹œ๋˜๊ณ  ์ „์—ญ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด๋‘์—ˆ๋˜ ๊ฐ’๊ณผ setCount ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  1. ์œ„์—์„œ useState๋Š” [๋ณ€์ˆ˜, ํ•จ์ˆ˜] ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ–ˆ์—ˆ์ฃ ? ๋ฐ˜ํ™˜๋ฐ›์€ ๋‘ ๊ฐ’์€ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ํ†ตํ•ด ๊ฐ๊ฐ count ๋ณ€์ˆ˜์™€ setCount ํ•จ์ˆ˜์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
ย 
์ •๋ฆฌํ•˜์ž๋ฉด, setCount ํ•จ์ˆ˜๋Š” ํ˜„์žฌ์˜ state ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ณ  ๋‚œ ์ดํ›„์˜ useState๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด ์ฃผ๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก
useState์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์ง์ ‘ ํ™•์ธํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด?
node_module > react > imd > react.development.js ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
  1. useState๋Š” ์ดˆ๊นƒ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์—๋Š” resolveDispatcher ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฆฌํ„ด๋œ dispatcher์˜ useState ๋ฉ”์„œ๋“œ์— ์ดˆ๊นƒ๊ฐ’์„ ์ „๋‹ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ๊ทธ๋ฆผ 2-6๊ทธ๋ฆผ 2-6
      ๊ทธ๋ฆผ 2-6
      ย 
  1. ๊ฐ™์€ ํŒŒ์ผ ๋‚ด์—์„œ resolveDispatcher ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„๋ณด๋ฉด resolveDispatcher ํ•จ์ˆ˜๋Š” ๋˜๋‹ค์‹œ ReactCurrentDispatcher ์•ˆ์— ์žˆ๋Š” current๋ผ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ๊ทธ๋ฆผ 2-7๊ทธ๋ฆผ 2-7
      ๊ทธ๋ฆผ 2-7
      ย 
  1. ๋งˆ์ง€๋ง‰์œผ๋กœ ReactCurrentDispatcher๋ฅผ ๊ฐ™์€ ํŒŒ์ผ ๋‚ด์—์„œ ๋˜ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ณด๋ฉด, ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ current๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ๊ทธ๋ฆผ 2-8๊ทธ๋ฆผ 2-8
      ๊ทธ๋ฆผ 2-8
ย 
ย 

2.4 (์‹ค์Šต) useState ์‘์šฉํ•ด๋ณด๊ธฐ

ย 

2.4.1 useState์™€ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ํผ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

์ด์ „ useState ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด count ๊ฐœ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์‹ค์Šต์„ ํ†ตํ•ด useState์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์•ž์—์„œ ๋ฐฐ์šด ๊ฐœ๋…์„ ํ™•์žฅํ•˜์—ฌ useState์™€ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ํผ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
  1. ๋จผ์ € React ๊ธฐ๋ณธ Hook์—์„œ ์ œ๊ณตํ•˜๋Š”ย useState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React์—์„œ useState๋ฅผ import ๋ฐ›์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๋Š” App.js์—์„œ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
import { useState } from "react";
App.js
ย 
  1. LoginForm ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๊ทธ ์•ˆ์— state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์ค๋‹ˆ๋‹ค.
import { useState } from "react"; // ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋Š” Hook์„ ์ด์šฉํ•˜์—ฌ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. function LoginForm() { const [id, setId] = useState(""); const [password, setPassword] = useState(""); return; } function App() { return ( <div> <LoginForm /> </div> ); } export default App;
id ์™€ password ๋ผ๋Š” state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. id ์™€ password์˜ ์ดˆ๊นƒ๊ฐ’์€ ์ฒ˜์Œ์— id ์™€ password์˜ input ์„ ๋นˆ์นธ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์˜ ์ดˆ๊นƒ๊ฐ’์„ useState Hook์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด id ์™€ setId ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ id ์™€ password๋ผ๋Š” state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น state ๊ฐ’์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” setId ์™€ setPassword ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด state๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
state ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 
state๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ state ๋ณ€์ˆ˜์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ state ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ state ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์— ๋ฆฌ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.
ย 
  1. state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์ฃผ์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋กœ๊ทธ์ธ ํผ์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.
// login form์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜ const handleLoginForm = (event) => { event.preventDefault(); };
handleLoginForm ํ•จ์ˆ˜ ์•ˆ์—๋Š” preventDefault() ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ form ์•ˆ์— submit ์—ญํ• ์„ ํ•˜๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ฐฝ์ด ์ƒˆ๋กœ๊ณ ์นจ ๋˜์ง€ ์•Š๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
Event.preventDefault() ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
Event ์ธํ„ฐํŽ˜์ด์Šค์˜ย preventDefault()ย ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•œย ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
ย 
  1. id ์™€ password๋ฅผ ์ž…๋ ฅํ•  ๋‘ ๊ฐœ์˜ input๊ณผ form์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋„๋ก ๋งˆํฌ์—…์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
... return ( <form onSubmit={handleLoginForm}> <label> Id : <input type='text' value={id} placeholder='์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.'/> </label> <label> Password : <input type='password' value={password} placeholder='๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.'/> </label> <button type='submit'>Login</button> </form> );
ย 
๊ทธ๋Ÿผ ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธ ํผ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ•œ๋ฒˆ ํ™•์ธํ•ด ๋ณผ๊นŒ์š”?
ย 
๊ทธ๋ฆผ 2-9๊ทธ๋ฆผ 2-9
๊ทธ๋ฆผ 2-9
ย 
์‹ค์ œ ํ™”๋ฉด์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ํผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„ ์ฝ”๋“œ๋Š” ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด ๊ทธ ์ด์œ ๋ฅผ ์นœ์ ˆํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 2-10๊ทธ๋ฆผ 2-10
๊ทธ๋ฆผ 2-10
ย 
์œ„์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋กœ id ์™€ password์˜ ์ƒํƒœ๋Š” ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ, ์•„์ง input์— ๊ฐ’์„ ์ž…๋ ฅํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. id ์™€ password์˜ state๋งŒ ์„ ์–ธํ•ด ์ฃผ์—ˆ์„ ๋ฟ, ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋ผ๊ณ  ์ง€์‹œํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— state ๊ฐ’์„ ๋ณ€๊ฒฝ ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, input์— ์ž…๋ ฅํ•œ ๊ฐ’์„ React๊ฐ€ ์ธ์ง€ํ•˜๊ณ  ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก onChange๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ state ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ์ค˜์•ผ value ๊ฐ’๋„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ form ํƒœ๊ทธ๋ฟ ์•„๋‹ˆ๋ผ, id ์™€ password์˜ ๊ฐ input ํƒœ๊ทธ์—๋„ onChange๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ย 
  1. id ์™€ password์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
// id input์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜ const handleIdInput = (event) => { setId(event.target.value); }; // password input์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜ const handlePasswordInput = (event) => { setPassword(event.target.value); };
ย 
  1. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์œผ๋‹ˆ, ๊ฐ input์— onChange ์ด๋ฒคํŠธ๋„ ๋“ฑ๋กํ•ด ์ค๋‹ˆ๋‹ค.
... return ( <form onSubmit={handleLoginForm}> <label> Id : <input type='text' value={id} placeholder='์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' onChange={handleIdInput} /> </label> <label> Password : <input type='password' value={password} placeholder='๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' onChange={handlePasswordInput} /> </label> <button type='submit'>Login</button> </form> );
ย 
  1. ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์ž˜ ๋“ค์–ด์˜ค๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
// login form์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜ const handleLoginForm = (event) => { event.preventDefault(); console.log("๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค."); alert(` Id : ${id} \n Password : ${password}`); }; // id input์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜ const handleIdInput = (event) => { console.log("์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค."); // console.log(event.target.value)๋ฅผ ๋„ฃ์–ด์„œ ๊ฐ’์„ ํ™•์ธํ•ด๋ณด์„ธ์š”. setId(event.target.value); }; // password input์„ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜ const handlePasswordInput = (event) => { console.log("ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค."); setPassword(event.target.value); };
ย 
๐Ÿ’ก
์ด๋ฒคํŠธ ํ™•์ธํ•ด๋ณด๊ธฐ console.log(event) : ํ•ด๋‹น ์ด๋ฒคํŠธ์˜ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
console.log(event.target) : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
console.log(event.target.value) : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ์— ์ž…๋ ฅ๋œ ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆผ 2-11๊ทธ๋ฆผ 2-11
๊ทธ๋ฆผ 2-11
๊ทธ๋ฆผ 2-12๊ทธ๋ฆผ 2-12
๊ทธ๋ฆผ 2-12
ย 
  1. ์ด์ œ ๋กœ๊ทธ์ธ ํผ์ด ์™„์„ฑ๋˜์—ˆ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
id ์™€ password์˜ input์— ๊ฐ’์„ ์ž…๋ ฅํ•œ ํ›„์— Login ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋ณด๋ฉด ์ฝ˜์†”์ฐฝ์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ ๊นŒ์š”?
ย 
๊ทธ๋ฆผ 2-13๊ทธ๋ฆผ 2-13
๊ทธ๋ฆผ 2-13
ย 
๊ทธ๋ฆผ 2-14๊ทธ๋ฆผ 2-14
๊ทธ๋ฆผ 2-14
ย 
๊ฐ input์— ๊ฐ’์„ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์œ„์™€ ๊ฐ™์ด ์ฝ˜์†”์ฐฝ์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Login ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด โ€œ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.โ€๋ผ๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์•„๋ž˜์™€ ๊ฐ™์€ alert ์ฐฝ์ด ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, alert ์ฐฝ์—์„œ๋Š” ๊ฐ input์— ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
ย 
๊ทธ๋ฆผ 2-15๊ทธ๋ฆผ 2-15
๊ทธ๋ฆผ 2-15
ย 
์ด๋ ‡๊ฒŒ useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ๊ทธ์ธ ํผ์„ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ input์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ ๋ชจ๋“  ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— React Hook์—์„œ ์ œ๊ณตํ•˜๋Š” useState๋ฅผ ํ†ตํ•ด ํŠน์ • ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
ย 

2.4.2 ์ตœ์ข… ์ฝ”๋“œ

import { useState } from "react"; function LoginForm() { const [id, setId] = useState(""); const [password, setPassword] = useState(""); const handleLoginForm = (event) => { event.preventDefault(); console.log("๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค."); alert(` Id : ${id} \n password : ${password}`); }; const handleIdInput = (event) => { console.log("์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค."); setId(event.target.value); }; const handlePasswordInput = (event) => { console.log("ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค."); setPassword(event.target.value); }; return ( <form onSubmit={handleLoginForm}> <label> Email : <input type='text' value={id} placeholder='์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' onChange={handleIdInput} /> </label> <label> Password : <input type='password' value={password} placeholder='๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' onChange={handlePasswordInput} /> </label> <button type='submit'>Login</button> </form> ); } function App() { return ( <div> <LoginForm /> </div> ); } export default App;
App.js
ย 
ย