๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

React, useEffect, useRef, props ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/React

React, useEffect, useRef, props

Daehyunii 2022. 12. 18. 22:50
React๋ž€?

1. React ์†Œ๊ฐœ

  ๋ฆฌ์•กํŠธ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ตœ๋Œ€์˜ ํšจ์œจ์„ ๋‚ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.

2. React ํŠน์ง•

  • Reactive Programming์ด๋‹ค.
    • React๋Š” ์ƒํƒœ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์—ฐ๊ด€๋œ ๊ณณ์—์„œ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋œ๋‹ค.
  • MVC์—์„œ ๋ฆฌ์•กํŠธ๋Š” V๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ View๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด์ด๋ฉฐ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์‚ฌ์šฉ๋œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ์œผ๋กœ View๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • Virtual DOM์ด๋‹ค.
    • ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•œ๋‹ค.
    • ์„ฑ๋Šฅ๋ณด๋‹ค๋Š” ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

2. create-react-app, JSX

2.1 create-react-app

  ์ƒˆ๋กœ์šด ๋ฆฌ์•กํŠธ ์•ฑ์„ ๋งŒ๋“ค๊ธฐ ์‰ฝ๊ฒŒ ๋„์™€์ค€๋‹ค.

npx create-react-app [app์ด๋ฆ„]

2.2 JSX

  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— XML์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์ด๋‹ค. UI๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒจ์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฏธ class๊ฐ€ ์˜ˆ์•ฝ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— HTML์˜ class๋ถ€๋ถ„์— className์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
  • ์ตœ์ƒ์œ„๊ฐ€ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.
  • ํ‘œํ˜„์‹์ด๋‚˜ ์กฐ๊ฑด๋ฌธ๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์ค‘๊ด„ํ˜ธ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

3. ์ปดํฌ๋„ŒํŠธ

  ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜์ด๋‹ค. UI๋ฅผ ์ถ”์ƒ์ ์œผ๋กœ ๋ฐ”๋ผ๋ณด๊ณ  ๊ณตํ†ต์ ์„ ์ฐพ์•„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

4. Props

  props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.

// props.size => ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น
function Button({ size = 30 }) {
    return (
        <button style={ width: size }></button>
    )
}
import Button from './Button.js'

function App() {
    return (
        ...
        <Button size={50} />
    )
}

4.1 children

props์— children์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ ๋‚ด๋ถ€์˜ ๋‚ด์šฉ์ด children์— ์ „๋‹ฌ๋œ๋‹ค.

function Paragraph({ children }) {
    return (
        <p>{ children }</p>
    )
}
import Paragraph from './Paragraph.js'

function App() {
    return (
        ...
        <Paragraph>
            <code>App.js</code> is running.
        </Paragraph>
    )
}

๋ถ„๊ธฐ์™€ ๋ฐ˜๋ณต

1. ๋ถ„๊ธฐ

  ์ƒํƒœ ๊ฐ’์ด true์ธ์ง€ false์ธ์ง€์— ๋”ฐ๋ผ ์š”์†Œ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๋ง์ง€๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋…ผ๋ฆฌ๊ณฑ(&&)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

2. ๋ฐ˜๋ณต

  map์ด๋‚˜ filter ๋“ฑ์˜ ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. map์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ผญ ์š”์†Œ์— key ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.


์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ, ๋ฆฌ์•กํŠธ ํ›…

1. ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง€์—ญ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ•

  useState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์—์„œ count๊ฐ€ ์ƒํƒœ์ด๊ณ , setCount๊ฐ€ ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

const [count, setCount] = useState(0)

2. ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ

  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์š”์†Œ์˜ ์ด๋ฒคํŠธ์— ๋ฐ”์ธ๋”ฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

...

const handleIncrease = () => {
    setCount(count + 1)
}

return (
    ...
    <button onClick={handleIncrease}>+</button>
)

3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฉ”์„ธ์ง€ ์ „๋‹ฌํ•˜๊ธฐ

  props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์—์„œ๋Š” props๋กœ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด๋ณด์ž.

function Counter({ onChange }) {

    const handleIncrease = () => {
        setCount(count + 1)
        if (onChange) onChange(count + 1)
    }

    return (
        ...
        <button onClick={handleIncrease}>+</button>
    )
}

4. useEffect

  ๋ฌด์–ธ๊ฐ€ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ ๊ฐ์ง€ํ•˜์—ฌ ๋ฐ˜์‘ํ•˜๋Š” hook์ด๋‹ค. useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค. ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ์ „์—ญ์ ์ธ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋‹ค. return์œผ๋กœ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.

5. useRef

  DOM์— ์ง์ ‘ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ useState๋กœ๋„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • useState๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํ•œ๋‹ค.
  • useRef๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค.