1. External Store

1. External Store

๋ฆฌ์•กํŠธ์˜ ์™ธ๋ถ€์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์ด ์•„๋‹ˆ๋ผ, ์Šคํ† ์–ด๊ฐ€ ๋ฆฌ์•กํŠธ ๋ฐ–(External)์— ์žˆ๋‹ค๋Š” ์˜๋ฏธ ๊ธฐ์กด์—๋Š” useState ๋“ฑ์˜ hook์„ ์ด์šฉํ•ด ์ฒ˜๋ฆฌ

์™ธ๋ถ€์˜ ์Šคํ† ์–ด์—์„œ ๋ฐ”๋€ ์ƒํƒœ๋ฅผ ํ™”๋ฉด์— ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ปก forceUpdate์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • forceUpdate๋Š” Class component์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์˜ˆ์‹œ

๐Ÿ”— ์‹ค์Šต ๋งํฌ

1. ๊ธฐ์กด์˜ useState

const [count, setCount] = useState(0);

2. useReducer ์ด์šฉ

const [, forceUpdate] = useReducer(reducer, {x: 0});

// Reducer ํ•จ์ˆ˜
function reducer(state) {
    return {...state, x: state.x + 1};
}

3. useForceUpdate ์ปค์Šคํ…€ ํ›… ์‚ฌ์šฉ โœ…

export default function useForceUpdate() {
    const [, setState] = useState({});

    // useState์™€ forceUpdate ํ•จ์ˆ˜๋กœ useReducer์™€ ๋™์ผ ํšจ๊ณผ
    const forceUpdate = () => {
        setState({}); // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
    };

    return forceUpdate;
}

๋ช…ํ™•ํ•œ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

import useForceUpdate from '../hooks/useForceUpdate';

// Business Logic

const state = {
    count: 0,
};

function increase() {
    state.count += 1;
}

// UI

export default function Counter() {
    const forceUpdate = useForceUpdate();

    const handleClick = () => {
        increase();
        forceUpdate();
    };

    return (
        <div>
            <p>{state.count}</p>
            <button
                type='button'
                onClick={handleClick}
            >
                Increase
            </button>
        </div>
    );
}

React๊ฐ€ UI๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , ์ˆœ์ˆ˜ํ•œ TypeScript(JavaScript)๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹น

์žฅ์ 

์ž์ฃผ ๋ฐ”๋€Œ๋Š” UI ์š”์†Œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๋Œ€์‹ , ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š”(๋ฐ”๋€Œ๋ฉด ์น˜๋ช…์ ์ธ) ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์œ ์ง€๋ณด์ˆ˜์— ๋„์›€์ด ๋˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์น˜๋ฐ€ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

2. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ(separation of concerns, SoC)๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋ณ„๋œ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” ๋””์ž์ธ ์›์น™ ๊ด€์‹ฌ์‚ฌ๋ž€ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ •๋ณด์˜ ์ง‘ํ•ฉ์ด๋ฉฐ, ๊ฐ ๋ถ€๋ฌธ์€ ๊ฐœ๊ฐœ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ•ด๊ฒฐ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋Š” ์ •๋ณด๋ฅผ ์ž˜ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„ ์•ˆ์— ์บก์Šํ™”(์ •๋ณด ์ˆจ๊ธฐ๊ธฐ์˜ ํ•œ ์ˆ˜๋‹จ) ์‹œํ‚ด์œผ๋กœ์จ ๋‹ฌ์„ฑ ๊ณ„์ธตํ™”๋œ ๋””์ž์ธ์€ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„ (Ex. ํ‘œํ˜„ ๊ณ„์ธต, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ณ„์ธต, ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต, ํผ์‹œ์Šคํ„ด์Šค ๊ณ„์ธต) ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋Š” ์ถ”์ƒํ™”์˜ ์ผ์ข…

React Component

์ปดํฌ๋„ŒํŠธ๋Š” ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” UI ๋‹จ์œ„ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉ โ†’ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ด€์‹ฌ์‚ฌ(๊ธฐ๋Šฅ) ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ๋œ ๊ฒƒ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ์•„์„œ ๋” ํฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ„

3. Layered Architecture

Software Architecture Patterns - Layered Architecture

๋ฐฑ์—”๋“œ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ํ”„๋ก ํŠธ์—์„œ๋„ ๋น„์Šทํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€ - ์„ค๊ณ„

Layered Architecture์—์„œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€๊นŒ์šด ๊ฒƒ(UI), ์‚ฌ์šฉ์ž์™€ ๋จผ ๊ฒƒ(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง) ์œผ๋กœ ๊ตฌ๋ถ„

๐Ÿ™‹๐Ÿปโ€โ™€๏ธ ์‚ฌ๋žŒ โ†’ ๐Ÿ”˜ ์Šค์œ„์น˜(UI) โ†’ โš™๏ธ ๋ชจํ„ฐ(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง) โ†’ ๐Ÿ ๋ฐ”ํ€ด(DB)

  • ์‚ฌ๋žŒ์ด ์Šค์œ„์น˜๋ฅผ ์กฐ์ข…ํ•˜๋ฉด(UI)

  • ๋ชจํ„ฐ๊ฐ€ ์›€์ง์—ฌ์„œ(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ด์šฉ)

  • ๋ฐ”ํ€ด๋ฅผ ๊ตด๋ฆด ์ˆ˜ ์žˆ์Œ(DB์— ์ ‘๊ทผํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ)

๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€ - ํ”„๋กœ์„ธ์Šค

๊ฐ„๋‹จํ•˜๊ฒŒ Input โ†’ Process โ†’ Output 3๋‹จ๊ณ„๋กœ ์ฝ”๋“œ๋ฅผ ์ ์ ˆํžˆ ๊ตฌ๋ถ„๋งŒ ํ•ด๋„ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š”๋ฐ ํฌ๊ฒŒ ๋„์›€์ด ๋จ ํ•˜๋‚˜์˜ Output์€ ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ Input์„ ์š”์ฒญํ•˜๊ฒŒ ๋˜๊ณ , ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์† ์ˆœํ™˜ํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋จ

  1. Input: ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘

  2. Process: ํ”„๋กœ๊ทธ๋žจ ์ดˆ๊ธฐํ™”

  3. Output: ์‚ฌ์šฉ์ž์—๊ฒŒ ์ดˆ๊ธฐ UI ๋ณด์—ฌ์ฃผ๊ธฐ

  4. Input: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ

  5. Process: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ

  6. Output: ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ณด์—ฌ์ฃผ๊ธฐ

  7. Input: ์‚ฌ์šฉ์ž์˜ ๋˜ ๋‹ค๋ฅธ ์ž…๋ ฅ

  8. ๋ฐ˜๋ณต

์žฅ์ 

๊ฐ๊ฐ์€ ํ•˜๋‚˜์˜ ์—ญํ• (๊ด€์‹ฌ์‚ฌ)๋งŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žก๋„๊ฐ€ ๋‚ฎ์•„์ง

MVC์™€ ๋งคํ•‘

MVC๋กœ ๊ฑฐ์น ๊ฒŒ ๋งคํ•‘ํ•  ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณผ ์ˆ˜ ์žˆ์Œ โš ๏ธ ๋”ฑ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ์–ด๋Š ์ •๋„์˜ ๋ผ์›Œ ๋งž์ถ”๊ธฐ

  • Controller โ†’ Input

  • Model(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จ) โ†’ Process

  • View โ†’ Output

๐ŸŒฟ MVC ํŒจํ„ด

๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํŠธ๋กค๋Ÿฌ(Controller)๋กœ ์ด๋ฃจ์–ด์ง„ ๋””์ž์ธ ํŒจํ„ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ 3๊ฐ€์ง€ ์—ญํ• ๋กœ ๊ตฌ๋ถ„ํ•ด, ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ ์žฌ์‚ฌ์šฉ๊ณผ ํ™•์žฅ์ด ์šฉ์ด

4. Flux Architecture

Flux

MVC ํŒจํ„ด์˜ ํ•œ๊ณ„

๐Ÿšจ View์™€ Model ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•ด์ ธ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ

'์ฝ์€ ํ‘œ์‹œ(mark seen)์— ๊ด€ํ•ด ๋งŽ์€ View๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ?'์— ๋Œ€ํ•œ ํ•ด๋‹ต (์–ด๋–ค ํŽ˜์ด์ง€์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์—ˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์•ˆ ์ฝ์—ˆ๋‹ค๊ณ  ๋œจ๊ธฐ๋„ ํ•˜๋Š” ๋ฌธ์ œ)

View์—์„œ ์ผ์–ด๋‚œ ๊ฒƒ์ด Model์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ๋„ ํ•˜๊ณ , ๊ทธ ๋ฐ˜๋Œ€๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋กœ์ง์ด ์žˆ๋Š” ์ƒํ™ฉ โ†’ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ View์— ๊ณต์œ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€(์‹ค์ œ๋กœ ๋ทฐ๊ฐ€ ๋ชจ๋ธ์„ ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ๊ฑฐ๋‚˜ ํ•˜๋Š” ์ƒํ™ฉ์€ ์—†์Œ) โ‡’ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ๋ฅด๋„๋ก ํ•˜๋Š” flux ํŒจํ„ด์ด ๋“ฑ์žฅ

Flux ํŒจํ„ด์˜ ํƒ„์ƒ

Facebook(ํ˜„ Meta)์—์„œ MVC ํŒจํ„ด์˜ ํ•œ๊ณ„์— ๋Œ€์•ˆ์œผ๋กœ ๋‚ด์„ธ์šด ์•„ํ‚คํ…์ฒ˜ ๊ธฐ์กด์˜ 2-way binding(์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ)์„ ์ผ์„ ๋•Œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” Model-View์˜ ๋ณต์žกํ•œ ๊ด€๊ณ„(์ „ํ†ต์ ์ธ MVC์—์„  ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์ง€์–‘)๋ฅผ ๊ฒจ๋ƒฅ ๋ช…ํ™•ํžˆ unidirectional data flow๋ฅผ ๊ฐ•์กฐ

๐Ÿค ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ

์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ”์ธ๋”ฉ๊ณผ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋ฐ”์ธ๋”ฉ์ด ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ

Action, Dispatcher, Store

  1. Action โ†’ ์ด๋ฒคํŠธ/๋ฉ”์‹œ์ง€ ๊ฐ™์€ ๊ฐ์ฒด, (dispatchEvent ์™€ ๋น„์Šทํ•œ ํ–‰๋™)

  2. Dispatcher โ†’ (์—ฌ๋Ÿฌ) Store๋กœ Action์„ ์ „๋‹ฌ. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์™€ ์œ ์‚ฌ

  3. Store (์—ฌ๋Ÿฌ ๊ฐœ) โ†’ ๋ฐ›์€ Action์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ, ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์•Œ๋ฆผ

  4. View โ†’ Store๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ณ€ํ™”๊ฐ€ ์žˆ์œผ๋ฉด Store์˜ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜, ํ™”๋ฉด์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฑด๋“œ๋ฆฌ๋ฉด ๋‹ค์‹œ action ๋ฐœ์ƒ

์žฅ์ 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ™œ์šฉํ•ด ๋ณต์žกํ•œ ๋ทฐ ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•œ ๋””์ž์ธ ํŒจํ„ด

  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ๋Š˜์–ด๋‚จ

  • ๋ฒ„๊ทธ ์ฐพ๊ธฐ ์‰ฌ์›€

  • ๋‹จ์œ„ ํ…Œ์ŠคํŒ…์ด ์‰ฌ์›€

Redux์˜ FluxํŒจํ„ด ์ ์šฉ์‚ฌ๋ก€

Redux์˜ ํ•ต์‹ฌ

Redux๋Š” ๋‹จ์ผ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ข€ ๋” ๋‹จ์ˆœํ•œ ๊ทธ๋ฆผ์„ ์ œ์•ˆ

  1. Action โ†’ State๋ฅผ ๋ณ€ํ™”์‹œํ‚ด

    • switch๋ฅผ ํ†ตํ•ด action์˜ type์„ ํŒ๋‹จ, ๊ฐ๊ฐ์˜ ํ–‰์œ„๋ฅผ ๊ฒฐ์ •

  2. Store โ†’ dispatch๋ฅผ ํ†ตํ•ด Action์„ ๋ฐ›๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ reducer๋ฅผ ํ†ตํ•ด State๋ฅผ ๋ณ€๊ฒฝ(๊ธฐ์กด ์ƒํƒœ๋Š” ๋†”๋‘๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ)

  3. View โ†’ State๋ฅผ ๋ฐ˜์˜ํ•ด์„œ ๋ณด์—ฌ์คŒ, Action์„ ๋‹ค์‹œ ๋งŒ๋“ฆ

  • ๐Ÿ’ก Action์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋Š๋ƒ๊ฐ€ ์‚ฌ์šฉ์„ฑ์— ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ฆ

    • ๊ฐ์ฒด/๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฒƒ

    • dispatch๋กœ ์ „๋‹ฌ

    • Action creator ํ•จ์ˆ˜ ์ƒ์„ฑ

  • ํ•˜์ง€๋งŒ ์ƒํƒœ๋ฅผ UI์— ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ๋™์ผ โ‡’ React ์‚ฌ์šฉ

3๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค์™€ ๋งคํ•‘

  • Input โ†’ Action + dispatch

  • Process โ†’ reducer

  • Output โ†’ View(React)

5. useReducer

useReducer

useReducer๊ฐ€ ๊ธฐ๋ณธํ˜• setState๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ useReducer๋ฅผ ์‚ฌ์šฉ ๊ฑฐ์˜ ๊ฐ™์€ ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ(useState์˜ ๋Œ€์ฒด ํ•จ์ˆ˜)

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

const [state, dispatch] = useReducer(reducer, initialArg, init);

(state, action) => newState์˜ ํ˜•ํƒœ๋กœ reducer๋ฅผ ๋ฐ›๊ณ  dispatch ๋ฉ”์†Œ๋“œ์™€ ์ง์˜ ํ˜•ํƒœ๋กœ ํ˜„์žฌ state๋ฅผ ๋ฐ˜ํ™˜

6. useCallback

useCallback

useMemo๋ฅผ ์กฐ๊ธˆ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๋ฒ„์ „ ํ•จ์ˆ˜๋ฅผ memoization ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๋™์ž‘์€ ๋™์ผ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

const memoizedCallback = useCallback(() => {
    doSomething(a, b);
}, [a, b]);

useCallback์€ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์€ ์ฝœ๋ฐฑ์˜ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ์—๋งŒ ๋ณ€๊ฒฝ(useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด๊ณผ ๊ฐ™์Œ)

Memoization

ํŠน์ •ํ•œ ๊ฐ’์„ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€, ์ดํ›„์— ํ•ด๋‹น ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ €์žฅํ•ด๋‘” ๊ฐ’์„ ํ™œ์šฉํ•˜๋Š” ํ…Œํฌ๋‹‰ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ’์„ memoization ํ•  ์ˆ˜ ์žˆ๋„๋ก useMemo, useCallback ๋“ฑ์˜ API(๋ฉ”์†Œ๋“œ)๋ฅผ ์ œ๊ณตํ•จ

๐Ÿ”Ž ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ํ•ญ์ƒ ์ข‹์„๊นŒ?

์ €์žฅํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด์„œ ์“ด๋‹ค โ‡’ ํšจ์œจ์ ์ผ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐ๋˜์ง€๋งŒ, โš ๏ธ ๋ฌด์กฐ๊ฑด ์“ฐ๋Š”๊ฒŒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹˜ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ์–ด๋”˜๊ฐ€์— ์ด์ „์˜ ๊ฐ’์„ ์ €์žฅํ•ด๋‘๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์˜์กด์„ฑ์„ ๋น„๊ตํ•ด์„œ ๊ฐ€์ ธ์˜ฌ์ง€ ๋ง์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ๋น„์šฉ์ด ๋” ์ ๊ฒŒ ๋“ค๊นŒ? ๐Ÿ’ก ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ๋ณต์žกํ•˜์ง€ ์•Š๋‹ค๋ฉด, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ๋น„์šฉ์ด ๋” ๋งŽ์ด ๋“ค ์ˆ˜๋„ ์žˆ์Œ!

์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ• ๊นŒ?

  • ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“œ๋Š” ์—ฐ์‚ฐ์ด ๋ณต์žกํ•  ๋•Œ

  • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ด์ „ ํ˜ธ์ถœ๊ณผ, ๋‹ค์Œ ํ˜ธ์ถœ ๊ฐ„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์˜ ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ

    • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ํ˜ธ์ถœ ๊ฐ„ ๊ฐ’๋“ค์˜ ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ

    • ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” React.memo ์™€ ์—ฐ๋™ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด

useNavigate, useState๋“ฑ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋˜์–ด์žˆ์Œ

Last updated