[React] React์˜ State, Props, Ref์˜ ์—ญํ• 

2024. 9. 18. 18:31ยท ๐Ÿ’ปDEV-STUDY/React
๋ชฉ์ฐจ
  1. ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์—ญํ• ์„ ํ•˜๋Š” State & ํŒŒ๋ผ๋ฏธํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” Props & React ๋…๋ฆฝ์  Ref
728x90
๋ฐ˜์‘ํ˜•
์ œ์–ด ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ


๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์—ญํ• ์„ ํ•˜๋Š” State & ํŒŒ๋ผ๋ฏธํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” Props & React ๋…๋ฆฝ์  Ref

React Hook ์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋„์ž…ํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด, State & Props & Ref ์„ธ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ๋‹ค. 

 

1. State: ๋‚ด๋ถ€ ๋ณ€์ˆ˜ (์ œ์–ด ์ปดํฌ๋„ŒํŠธ)

  • State๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋กœ, React์—์„œ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค.
  • State ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ: React๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์—ฌ UI๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•œ๋‹ค.
  • ๋‚ด๋ถ€ ๋ณ€์ˆ˜์˜ ์˜๋ฏธ:
    • State๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
    • ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์—, UI๊ฐ€ ํ•ญ์ƒ ์ƒํƒœ์™€ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค.
import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);  // count๋Š” state, setCount๋Š” state ๋ณ€๊ฒฝ ํ•จ์ˆ˜

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
}
  • ์œ„ ์ฝ”๋“œ์—์„œ count๋Š” state๋กœ, ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉฐ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.

2. Props: ํŒŒ๋ผ๋ฏธํ„ฐ

  • Props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.
  • ๋ถˆ๋ณ€(Immutable): Props๋Š” ์ „๋‹ฌ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์˜ค์ง ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.

React ๊ณต์‹๋ฌธ์„œ (https://ko.legacy.reactjs.org/docs/components-and-props.html)

 

โš ๏ธ์ถ”ํ›„์— ๋‚˜์˜ค๋Š” State Lifting(์ƒํƒœ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ)์—์„œ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

props๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๊ณ ํ•˜๋Š” ๊ฒƒ์€ props๋กœ ๋„˜๊ธฐ๋Š” ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ผ๋ฟ, State Lifting์„ ์œ„ํ•ด setStateํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํ•จ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— props๋กœ ๋„˜๊ฒจ๋„ ์ฝ๊ธฐ ์ „์šฉ์€ ์—ฌ์ „ํ•˜๋‹ค.

โ†’ State Lifting์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” props๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ถ€๋ชจํ•œํ…Œ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ.

 

  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ:
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ Props๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” Props๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;  // name์€ props
}

function App() {
  return <Greeting name="John" />;  // 'John'์ด props๋กœ ์ „๋‹ฌ๋จ
}
  • ์—ฌ๊ธฐ์„œ name์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ props๋กœ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.

3. Ref: ์™ธ๋ถ€ ๋ณ€์ˆ˜ (๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ)

  • Ref๋Š” React๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋กœ, ์ปดํฌ๋„ŒํŠธ์˜ DOM ์š”์†Œ๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค
  • Ref ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง ์—†์Œ: Ref์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” React๊ฐ€ Ref์˜ ๋ณ€๊ฒฝ์„ ์ธ์‹ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์™ธ๋ถ€ ๋ณ€์ˆ˜์˜ ์˜๋ฏธ:
    • Ref๋Š” ์ฃผ๋กœ DOM ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
    • ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด ๊ฐ’์„ ์ง์ ‘ ์ฐธ์กฐํ•˜์—ฌ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
import { useRef } from 'react';

function TextInputWithFocusButton() {
  const inputEl = useRef(null);  // ref๋กœ DOM ์š”์†Œ ์ฐธ์กฐ

  const onButtonClick = () => {
    inputEl.current.focus();  // input์— ํฌ์ปค์Šค ์„ค์ •
  };

  return (
    <>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </>
  );
}
  • ์œ„ ์ฝ”๋“œ์—์„œ useRef๋Š” DOM ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, input์— ํฌ์ปค์Šค๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. Ref๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค.

State, Props, Ref ์ฐจ์ด์  ์ •๋ฆฌ

๊ตฌ๋ถ„ State Props Ref
์—ญํ•  ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ DOM์š”์†Œ๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ ์ฐธ์กฐ
๋ฆฌ๋ Œ๋”๋ง ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ๋ฆฌ๋ Œ๋”๋ฆฌ ๋ฐœ์ƒ(๋ณ€๊ฒฝ ์ž์ฒด๋Š” ๋ถˆ๊ฐ€๋Šฅ) Ref ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
์ œ์–ด๋ฐฉ์‹ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์—์„œ ๊ด€๋ฆฌ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์ฐธ์กฐ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‚˜ UI์— ์˜ํ–ฅ ์—†์Œ

 


โ„น๏ธ์ฐธ๊ณ 

[ASAC 6๊ธฐ ๊ฐ•์˜์ž๋ฃŒ]

๋ฐ˜์‘ํ˜•

'๐Ÿ’ปDEV-STUDY > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] Vite๋กœ React ์ดˆ๊ธฐ ์•ฑ ์„ค์ •  (2) 2024.09.18
[React] JSX ๋ฌธ๋ฒ• + ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ + VDOM  (1) 2024.09.17
[React] ๋ Œ๋”๋ง๋ฐฉ์‹(CSR)๊ณผ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ(SPA)  (1) 2024.09.17
[React] React์˜ ๋“ฑ์žฅ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ vs ํ”„๋ ˆ์ž„์›Œํฌ  (1) 2024.09.17
  1. ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์—ญํ• ์„ ํ•˜๋Š” State & ํŒŒ๋ผ๋ฏธํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” Props & React ๋…๋ฆฝ์  Ref
'๐Ÿ’ปDEV-STUDY/React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [React] Vite๋กœ React ์ดˆ๊ธฐ ์•ฑ ์„ค์ •
  • [React] JSX ๋ฌธ๋ฒ• + ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ + VDOM
  • [React] ๋ Œ๋”๋ง๋ฐฉ์‹(CSR)๊ณผ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ(SPA)
  • [React] React์˜ ๋“ฑ์žฅ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ vs ํ”„๋ ˆ์ž„์›Œํฌ
1000_sang
1000_sang
CHEONSANG-DEV1000_sang ๋‹˜์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
๋ฐ˜์‘ํ˜•
๊ธ€์“ฐ๊ธฐ ๊ด€๋ฆฌ์ž
1000_sang
CHEONSANG-DEV
1000_sang
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (77)
    • ๐Ÿ’ปDEV-STUDY (77)
      • HTTP (19)
      • JavaScript (8)
      • Git (6)
      • CS (1)
      • React (5)
      • Java (12)
      • Spring (12)
      • AWS (3)
      • Docker (7)
      • DataBase (4)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์›น ์ €์žฅ์žฅ์†Œ
  • sessionstrorage
  • secure
  • ์›น ๊ฐœ๋ฐœ
  • Cookie
  • stateful
  • git branch
  • JSON Web Token
  • ํผ์ŠคํŠธํŒŒํ‹ฐ
  • GitHub
  • stateless
  • localStorage
  • Git
  • webstorage
  • ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€
  • WORA
  • ์„œ๋“œํŒŒํ‹ฐ
  • Branch
  • samesite
  • git๋ช…๋ น์–ด
  • ์˜ค๋ธ”์™„
  • ใ…“
  • ์›น ์ธ์ฆ
  • JWT
  • jdk
  • httponly
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • bash
  • ์Šคํ† ๋ฆฌ์ง€
  • ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€

์ตœ๊ทผ ๋Œ“๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
1000_sang
[React] React์˜ State, Props, Ref์˜ ์—ญํ• 
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.