๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/React

[ํ•œ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ] - React.js ์ž…๋ฌธ 3

by YeonBu 2024. 11. 25.
728x90

 


๊ฐ•์˜ - Section 5 : React.js ์ž…๋ฌธ

์œ ๋ฐ๋ฏธ : https://www.udemy.com/course/winterlood-react-basic/

์ธํ”„๋Ÿฐ : 

 

 

[2024] ํ•œ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ(React.js) : ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ ๊ฐ•์˜ | ์ด์ •ํ™˜ Winterlood - ์ธํ”„๋Ÿฐ

์ด์ •ํ™˜ Winterlood | ๊ฐœ๋…๋ถ€ํ„ฐ ๋…ํŠนํ•œ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ํ•จ๊ป˜ ๋‹ค๋ค„๋ณด๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ์ด ๊ฐ•์˜๋กœ ํ•œ ๋ฒˆ์— ๋๋‚ด์š”. ํ•™์Šต์€ ์งง๊ฒŒ, ์‘์šฉ์€ ๊ธธ๊ฒŒ 17์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ All-in-one ๊ฐ•์˜!, ๋ฆฌ์•กํŠธ, ํ•œ ๊ฐ•์˜๋กœ

www.inflearn.com


 

 

 

React.js ์ž…๋ฌธ

State๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ด€๋ฆฌํ•˜๊ธฐ

 

* ๊ฐ„๋‹จํ•œ ํšŒ์›๊ฐ€์ž… ํผ์„ ๋งŒ๋“ค์–ด ๋ณด์ž. 

/*
  ๊ฐ„๋‹จํ•œ ํšŒ์› ๊ฐ€์ž… ํผ
  1. ์ด๋ฆ„
  2. ์ƒ๋…„์›”์ผ
  3. ๊ตญ์ 
  4. ์ž๊ธฐ์†Œ๊ฐœ
*/

 

import { useState } from "react";

const Register = () => {

    const [name, setName] = useState("์ด๋ฆ„");
    const [birth, setBirth] = useState("");
    const [country, setCountry] = useState("");
    const [bio, setBio] = useState("");

    const onChangeName = (e) => {
        setName(e.target.value);
    }

    const onChangeBirth = (e) => {
        setBirth(e.target.vlaue);
    }

    const onChangeCountry = (e) => {
        setCountry(e.target.value);
    }

    const onChangeBio = (e) => {
        setBio(e.target.value);
    }


    return (
        <div>
            <div>
                <input value={name} onChange={onChangeName} placeholder="์ด๋ฆ„" />
            </div>
            <div>
                <input value={birth} onChange={onChangeBirth} type="date" />
            </div>
            <div>
                <select value={country} onChange={onChangeCountry}>
                    <option value={""}></option>
                    <option value={"kr"}>ํ•œ๊ตญ</option>
                    <option value={"us"}>๋ฏธ๊ตญ</option>
                    <option value={"uk"}>์˜๊ตญ</option>
                </select>
            </div>
            <div>
                <textarea value={bio} onChange={onChangeBio} />
            </div>
        </div>
    )
}

export default Register;

 

 

 

* ์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ๋‹ค์ˆ˜ ๋ฐœ๊ฒฌ๋œ๋‹ค. ๊น”๋”ํ•˜๊ฒŒ ๊ณ ์ณ๋ณด์ž.

 

import { useState } from "react";

const Register = () => {

    const [input, setInput] = useState({
        name : "", 
        birth : "",
        country : "",
        bio : ""
    });

    const onChange = (e) => {
        setInput({
            ...input,
            [e.target.name] : e.target.value
        })
    }

    return (
        <div>
            <div>
                <input name="name" value={input.name} onChange={onChange} placeholder="์ด๋ฆ„" />
            </div>
            <div>
                <input name="birth" value={input.birth} onChange={onChange} type="date" />
            </div>
            <div>
                <select name="country" value={input.country} onChange={onChange}>
                    <option value={""}></option>
                    <option value={"kr"}>ํ•œ๊ตญ</option>
                    <option value={"us"}>๋ฏธ๊ตญ</option>
                    <option value={"uk"}>์˜๊ตญ</option>
                </select>
            </div>
            <div>
                <textarea name="bio" value={input.bio} onChange={onChange} />
            </div>
        </div>
    )
}

export default Register;

 

* ๋ฐ”๋€ ์ 

- ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹ ํ†ตํ•ฉ : ์ž…๋ ฅ ํ•„๋“œ๋ณ„๋กœ ๊ฐ๊ฐ useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„ ๊ด€๋ฆฌ ํ•˜๋˜ ์ƒํƒœ๋“ค์„ ๋‹จ์ผ ๊ฐ์ฒด(input)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ž…๋ ฅ์ƒํƒœ๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •ํ•จ

 - onChange ํ•จ์ˆ˜ ํ†ตํ•ฉ : ํ•„๋“œ๋งˆ๋‹ค ๋ณ„๋„๋กœ ์ •์˜ํ–ˆ๋˜ onChange ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜์—ฌ, name ์†์„ฑ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ๊ฐœ์„ 

 - ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹ : ์ „๊ฐœ ์—ฐ์‚ฐ์ž(...)๋กœ ๊ธฐ์กด ์ƒํƒœ ๋ณต์‚ฌํ›„ [e.target.name]์˜ ๊ฐ’์— ๋”ฐ๋ผ ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ

 

 

 

React.js ์ž…๋ฌธ

useRef - ์ปดํฌ๋„ŒํŠธ ๋ณ€์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ

 

 

* useRef ๋ž€? ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ DOM ์š”์†Œ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๋ณ€ํ™” ์—†์ด ๊ฐ’์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ. 

 

* useRef์˜ ํŠน์ง• 

 - DOM ์š”์†Œ ์ ‘๊ทผ : ํŠน์ • DOM ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ์ง์ ‘ ์กฐ์ž‘(ํฌ์ปค์Šค ์ด๋™, ์Šคํฌ๋กค ์กฐ์ž‘, HTML ์š”์†Œ ํฌ๊ธฐ ๊ณ„์‚ฐ ๋“ฑ)

 - ๊ฐ’ ์ €์žฅ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋”๋ผ๋„ useRef์— ์ €์žฅ๋œ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

*useRef์™€ useState์˜ ์ฐจ์ด์ 

ํŠน์ง• useState useRef
๋ฆฌ๋ Œ๋”๋ง ์ƒํƒœ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•จ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ
์ฃผ์š” ๋ชฉ์  ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ UI ์—…๋ฐ์ดํŠธ DOM ์š”์†Œ ์ ‘๊ทผ ๋˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ์—†์ด ๊ฐ’ ์ €์žฅ
๊ฐ’ ์ดˆ๊ธฐํ™” ์‹œ์  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ ์ดˆ๊ธฐํ™” ๋จ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™” ๋จ
์ €์žฅ ๊ณต๊ฐ„ ๋ฆฌ๋ Œ๋”๋ง ์‹œ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ’์œผ๋กœ ๊ต์ฒด ๋ Œ๋”๋ง ๊ฐ„์— ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์œ ์ง€(current)
๊ฐ’ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹ setState๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝ ref.current ๋ฅผ ์ง์ ‘ ์ˆ˜์ •
๋ Œ๋”๋ง ์—ฌ๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•จ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ™”๋ฉด์— ์˜ํ–ฅ์„ ๋ฏธ์ง€์น˜ ์•Š์Œ
DOM ์กฐ์ž‘ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ DOM ์š”์†Œ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ ๊ฐ€๋Šฅ(ref)
๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ์—ฌ๋ถ€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ ๊ฐ’ ์žฌ์„ค์ • ๋ฆฌ๋ Œ๋”๋ง ์‹œ์—๋„ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์Œ
์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ - ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ
- ์ƒํƒœ์— ๋”ฐ๋ผ UI ๋™๊ธฐํ™”
- ์ƒํƒœ ๋ณ€๊ฒฝ ํŠธ๋ฆฌ๊ฑฐ
- DOM ์š”์†Œ ํฌ์ปค์Šค
- ๊ฐ’ ์ €์žฅ ๋ฐ ์ด์ „ ๊ฐ’ ์ถ”์ 
- ๋ Œ๋”๋ง ์—†์ด ๊ฐ’ ์œ ์ง€

 

 

* useRef์™€ ๋ฆฌ๋ Œ๋”๋ง

const Register = () => {

    const refObj = useRef(0);
    console.log("Register ๋ Œ๋”๋ง");

    return (
        <div>
            <button onClick={() => {
                refObj.current++;
                console.log(refObj.current);
            }}>++</button>
        </div>
    )
}

export default Register;

 

 

- ์œ„์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  console ์ฐฝ์„ ๋ณด๋ฉด, ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ "Register ๋ Œ๋”๋ง"์€ ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ์ถœ๋ ฅ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  ์ฆ‰, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

* useRef์™€ DOM ์ œ์–ด

const Register = () => {

    const inputRef = useRef();

    const onSubmit = () => {
        if(input.name === ""){
            // ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š” DOM ์š”์†Œ ํฌ์ปค์Šค
            inputRef.current.focus();
        }   
    }

    return (
        <div>
            <div>
                <input ref={inputRef} name="name" value={input.name} onChange={onChange} placeholder="์ด๋ฆ„" />
            </div>
            <button onClick={onSubmit}>์ œ์ถœ</button>
        </div>
    )
}

export default Register;

 

 

- ์œ„์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  name ๊ฐ’์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ ์ œ์ถœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, ์ด๋ฆ„ ์ž…๋ ฅ ํ•„๋“œ์— ํฌ์ปค์Šค๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ 

  ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” useRef๋ฅผ ์‚ฌ์šฉํ•ด DOM ์š”์†Œ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์ž…๋ ฅ๊ฐ’์ด ๋น„์–ด ์žˆ์–ด๋„ ๋ฆฌ๋ Œ๋”๋ง ์—†์ด 

  ์ฆ‰์‹œ ํฌ์ปค์Šค๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด useRef์˜ ์ฃผ์š” ํŠน์„ฑ์ด๋‹ค.

 

 

* ๊ทธ๋ ‡๋‹ค๋ฉด JavaScript ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋ ๊นŒ?

  ์ž…๋ ฅ์„ ํ•˜๋ฉด ์นด์šดํŠธ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž

const countRef = useRef(0); // ์ดˆ๊ธฐ๊ฐ’์ด 0์ธ ref
let count = 0;	// ์ดˆ๊ธฐ๊ฐ’์ด 0์ธ ์ผ๋ฐ˜ ๋ณ€์ˆ˜

const onChange = (e) => {
    countRef.current++;
    count++;
    console.log("ref : " + countRef.current);
    console.log("count : " + count);
    setInput({
        ...input,
        [e.target.name] : e.target.value
    })
}

 

- ์ผ๋ฐ˜ ๋ณ€์ˆ˜(count)

 : count๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”๋จ. ์ด์œ ๋Š”, ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ๋ Œ๋”๋ง๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง. ์ฆ‰, ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ์ ์šฉ๋˜์ง€๋งŒ ์ง€์†์„ฑ์ด ์—†์Œ.

- useRef(countRef)

 : useRef๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด๋„ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์Œ. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ์ดํ›„์— ๊ณ„์† ๊ฐ’์ด ๋ˆ„์ ๋จ.

 

 

 

React.js ์ž…๋ฌธ

React Hooks

 

React Hooks ๋ž€? ๋ฆฌ์•กํŠธ ๋ฒ„์ „ 16.8์—์„œ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ์™€ ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

* Hooks์˜ ํŠน์ง•

- ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋Œ€์ฒด : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ state์™€ lifecycle์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋Œ€์ฒด ๊ฐ€๋Šฅ

- ์ˆœ์ˆ˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ง ์ž‘์„ฑ์— ์ ํ•ฉ

- ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต : ๊ธฐ์กด์— ์—†๋˜ '์ปค์Šคํ…€ ํ›…(Custom Hooks)'์„ ํ†ตํ•ด ๋กœ์ง ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- ํ˜ธ์ถœ ์ˆœ์„œ ๋ณด์žฅ : React๋Š” ํ›… ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ๋ Œ๋”๋ง์ด ์•ˆ์ •์ ์ž„

 

* Hooks ์‚ฌ์šฉ ๊ทœ์น™

- ์ตœ์ƒ์œ„์—์„œ๋งŒ ํ˜ธ์ถœ : ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋˜๋ฉฐ ํ•ญ์ƒ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—์„œ ํ˜ธ์ถœํ•ด์•ผ ํ•จ.

- React ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ : ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

- ์ปค์Šคํ…€ ํ›… ์ƒ์„ฑ ๊ฐ€๋Šฅ : ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด use๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•