wam
w__am ๊ฐœ๋ฐœ๋…ธํŠธ
wam
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (165)
    • CS ์ง€์‹ (10)
      • ์ž๋ฃŒ๊ตฌ์กฐ (0)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ (0)
      • ์šด์˜์ฒด์ œ (0)
      • ๋„คํŠธ์›Œํฌ (7)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
      • ๋””์ž์ธ ํŒจํ„ด (3)
    • Frontend (131)
      • Three.js (64)
      • NPM (1)
      • Nest.js (19)
      • React (10)
      • Apollo (7)
      • TypeScript (2)
      • JavaScript (12)
      • HTML, CSS (1)
      • Jest (3)
      • E2E (5)
      • Cypress (7)
    • Database (12)
      • TypeORM (12)
    • IT ์ง€์‹ (8)
      • ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค (3)
      • ๋„คํŠธ์›Œํฌ (1)
      • ๋ฐ์ดํ„ฐ ํฌ๋งท (2)
      • ๊ธฐํƒ€ (2)
    • IT Book (2)
    • ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ (1)

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

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก
  • ๐Ÿฑ Github

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • type-graphql
  • reactive variables
  • e.preventdefault()
  • threejs ๊ฐœ๋ฐœ ํ•  ๋•Œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ
  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
  • mapped types
  • math.sin()
  • ๋””์ž์ธ ํŒจํ„ด
  • gridhelper
  • ์›ํ˜•์ ์ธ ์›€์ง์ž„
  • Interface
  • ํ•จ์ˆ˜์˜ ๋ฒ”์œ„
  • ์˜คํ”„-ํ”„๋ ˆ๋ฏธ์Šค(off-premise) ๋ฐฉ์‹
  • Decorators
  • ์‚ผ๊ฐํ•จ์ˆ˜
  • isabstract
  • react ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • math.cos()
  • three.js ๊ตฌ์„ฑ ์š”์†Œ
  • ์ดˆ๊ธฐ ํ™˜๊ฒฝ์„ค์ •
  • API
  • ์Šค์ฝ”ํ”„
  • ๋ฐ์ดํ„ฐ ํฌ๋งท
  • axeshelper
  • getdelta()
  • ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  • getelapsedtime()
  • joi ์—๋Ÿฌ

์ตœ๊ทผ ๊ธ€

๊ด€๋ฆฌ์ž

๊ธ€์“ฐ๊ธฐ / ์Šคํ‚จํŽธ์ง‘ / ๊ด€๋ฆฌ์žํŽ˜์ด์ง€
hELLO ยท Designed By ์ •์ƒ์šฐ.
wam

w__am ๊ฐœ๋ฐœ๋…ธํŠธ

React์—์„œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด๊ณผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•
Frontend/React

React์—์„œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด๊ณผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

2024. 5. 9. 02:52
๐Ÿง ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด

1. ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์†๋ฐ›์€ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ ๊ฒฝ์šฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง



๐Ÿง๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

1. hook (useMemo, useCallback)
useMemo - ๊ณ„์‚ฐ์˜ ์žฌ์‹คํ–‰์„ ๋ฐฉ์ง€
useCallback - ํ•จ์ˆ˜์˜ ์žฌ์ƒ์„ฑ์„ ๋ฐฉ์ง€


2. ContextAPI, ๊ธฐํƒ€ ์ƒํƒœ ๊ด€๋ฆฌํˆด
ContextAPI - ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ฐ’์„ ๊ณต์œ , ์ฃผ๋กœ ์ „์—ญ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ
- ํ•ด๋‹น ๊ฐ’์ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ „๋‹ฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ
recoil - ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


3. windowning - ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋ง ํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ (๋Œ€ํ‘œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : React-Virtualized)  

 

 

๋ Œ๋”๋ง์ด๋ž€?

 

์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜„์žฌ props์™€ state์˜ ์ƒํƒœ์— ๊ธฐ์ดˆํ•ด UI๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€, ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ž‘์—…์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

React์˜ ๋ Œ๋”๋ง ๊ณผ์ •

 

๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง ๊ฐœ๋…์€ ๋ฃจํŠธ <div id="root"></div> DOM๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„์„œ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

 

  • root id๋Š” public/index.html์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •์ด ๋˜์–ด์žˆ๋‹ค.
  • DOM์€ HTML parser์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ Node ๊ฐ์ฒด ๋ชจ๋ธ์ด๋‹ค.
const root = ReactDOM.createRoot(
  document.getElementById('root')
);
const element = <h1>Hello, world</h1>;
root.render(element);

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง์€ ์ด๋Ÿฌํ•œ DOM ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ReactDOM.createRoot()์— ์ „๋‹ฌํ•œ ๋‹ค์Œ, ๊ทธ React Element๋ฅผ root.render()์— ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

 

 

React Element

// createElement๋ฅผ ์ด์šฉํ•ด์„œ React Element ๋งŒ๋“ค๊ธฐ
// ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ , ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค.
// React Element๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ ์ž‘์šฉ
// ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ƒ์„ฑ๋œ ์ดํ›„์—๋Š” ํ•ด๋‹น ์—˜๋ฆฌ๋จผํŠธ์˜ ์†์„ฑ๊ณผ ์ž์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
React.createElement(
  'div',
  { className: 'name' },
  'React'
)

// ์œ„์™€ ๊ฐ™์€ ์˜๋ฏธ (JSX ๋ฌธ๋ฒ•)
<div className='name'>React</div>

// createElement๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ React Element ๊ฐ์ฒด
{
  type: 'div',
  props: {
    className: 'name',
    children: 'React'
  }
}
  • ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ๋Š” type๊ณผ props๋ฅผ ๊ฐ€์ง€๋Š” React๋งŒ์˜ ๊ฐ์ฒด์ด๋‹ค.
  • React.creatElement()๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • type์œผ๋กœ HTML ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„๋‹ค.
  • ๊ทธ ์ด์™ธ์˜ ํŠน์ง•์„ props๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ •์˜๋œ๋‹ค.

 

 

React์—์„œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด

 

  1. ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
  2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์†๋ฐ›์€ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
  3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ ๊ฒฝ์šฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง

 

 

  • ๋ฆฌ์•กํŠธ์—์„œ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋ฉด UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๋Š” ์ž‘์—…์„ ์‹ค์‹œํ•œ๋‹ค.
  • ๋ฆฌ๋ Œ๋”๋ง์ด ์ž์ฃผ ์ผ์–ด๋‚˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋ชจ๋˜๊ณ  ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ์ตœ์ ํ™” ์ž‘์—…์„ ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

 

๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

 

useMemo (react hook) : ๊ณ„์‚ฐ์˜ ์žฌ์‹คํ–‰์„ ๋ฐฉ์ง€

 

๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)์€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ €์žฅํ•ด ๋‘๊ณ , ๋™์ผํ•œ ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋  ๋•Œ ์ด์ „์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ค‘๋ณต๋œ ๊ณ„์‚ฐ์„ ํ”ผํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค.

 

 

์˜ˆ์‹œ : ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜

function calculateTotal(array) {
  console.log('๊ณ„์‚ฐ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.');
  return array.reduce((acc, curr) => acc + curr, 0);
}
  • ๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐ
  • ๊ฐ ํ˜ธ์ถœ ์‹œ์— '๊ณ„์‚ฐ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.'๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ

 

 

// ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ์˜ˆ์‹œ

import React, { useState } from 'react';

function MyComponent({ data }) {
  const [array, setArray] = useState(data);
  const total = calculateTotal(array);

  return (
    <div>
      <p>๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„: {total}</p>
      <button onClick={() => setArray([...array, Math.random() * 10])}>๊ฐ’ ์ถ”๊ฐ€</button>
    </div>
  );
}
  • ์ด ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” calculateTotal ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐ
  • ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค calculateTotal ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜์–ด ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋จ
  • ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

 

// useMemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

import React, { useState, useMemo } from 'react';

function MyComponent({ data }) {
  const [array, setArray] = useState(data);
  const total = useMemo(() => calculateTotal(array), [array]);

  return (
    <div>
      <p>๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„: {total}</p>
      <button onClick={() => setArray([...array, Math.random() * 10])}>๊ฐ’ ์ถ”๊ฐ€</button>
    </div>
  );
}

  • useMemo ํ›…์€ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ์—๋งŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์ด ์žฌ๊ณ„์‚ฐ
  • ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ calculateTotal ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค.

 

 

useCallback (react hook) : ํ•จ์ˆ˜์˜ ์žฌ์ƒ์„ฑ์„ ๋ฐฉ์ง€

 

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

์ฃผ๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ props๋กœ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

// ์˜ˆ์‹œ

import React, { useState, useCallback } from 'react';

function ChildComponent({ onClick }) {
  return (
    <button onClick={onClick}>ํด๋ฆญ</button>
  );
}

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

  const handleClick = useCallback(() => {
    setCount(count + 1);
  }, [count]); // count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ handleClick์ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ

  return (
    <div>
      <p>ํด๋ฆญ ์ˆ˜: {count}</p>
      <ChildComponent onClick={handleClick} />
    </div>
  );
}
  • handleClick ํ•จ์ˆ˜๋Š” count ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
  • ์ด ํ•จ์ˆ˜๋Š” useCallback ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋จ.
  • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ [count]๋ฅผ ์ „๋‹ฌํ•จ์œผ๋กœ์จ, count ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ , ์ด์ „์— ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ContextAPI

 

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ฐ’์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ฃผ๋กœ ์ „์—ญ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ฆฌ์•กํŠธ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ ํ•˜๋‚˜์˜ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š”๋ฐ ๊นŠ์ด๊ฐ€ ๊นŠ๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

Context API ํ†ตํ•ด prop ์ „๋‹ฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๊นŠ์€ ๊ณณ์—์„œ๋„ ๋ฐ์ดํ„ฐ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

  1. ์ตœ์ ํ™”๋œ ๊ฐ’ ์ „๋‹ฌ
    • ์ „์—ญ์ ์ธ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ, ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ ๊ฐ’๋งŒ์„ context์— ํฌํ•จ์‹œํ‚จ๋‹ค.
    • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐ’์„ context์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ ,
    • ํ•ด๋‹น ๊ฐ’์ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ „๋‹ฌํ•œ๋‹ค.


  2. ๋ Œ๋”๋ง ๋ฒ”์œ„ ์ตœ์ ํ™”
    • ์‹ค์ œ๋กœ ํ•ด๋‹น context ๊ฐ’์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—๋งŒ ํ•ด๋‹น context๋ฅผ ์ „๋‹ฌํ•˜์ž
    • ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ „๋‹ฌํ•˜์ง€ ๋ง์ž


  3. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์‚ฌ์šฉ
    • context ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด useMemo ๋‚˜ useCallback์„ ์‚ฌ์šฉํ•˜์ž
    • ์ด๋ฅผ ํ†ตํ•ด context ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.


  4. ์ปจํ…์ŠคํŠธ ๊ฐ’์˜ ๋ณ€๊ฒฝ ์ตœ์†Œํ™”
    • context ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ์ง€๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ , ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ์ˆ˜ํ–‰ํ•˜์ž.
    • ๋ถˆํ•„์š”ํ•œ ๋ณ€๊ฒฝ์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


  5. React DevTools ํ™œ์šฉ
    • React DevTools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง์„ ๋ถ„์„ํ•˜์ž
    • ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•˜์ž
    • ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ : ์–ธ์–ด ์„ค์ • ๊ฐ’์„ context์— ์ €์žฅํ•˜์—ฌ ๋‹ค๊ตญ์–ด ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ

// LanguageContext.js

import React, { createContext, useState, useContext } from 'react';

const LanguageContext = createContext();

export const LanguageProvider = ({ children }) => {
  const [language, setLanguage] = useState('en');

  const changeLanguage = (newLanguage) => {
    setLanguage(newLanguage);
  };

  return (
    <LanguageContext.Provider value={{ language, changeLanguage }}>
      {children}
    </LanguageContext.Provider>
  );
};

export const useLanguage = () => {
  return useContext(LanguageContext);
};
  • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์–ด ์„ค์ • ๊ฐ’์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, Header์™€ Footer ์ปดํฌ๋„ŒํŠธ๋งŒ ์–ธ์–ด ์„ค์ • ๊ฐ’์„ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

// Header.js

import React from 'react';
import { useLanguage } from './LanguageContext';

const Header = () => {
  const { language } = useLanguage();

  return (
    <header>
      <h1>{language === 'en' ? 'Hello' : '์•ˆ๋…•ํ•˜์„ธ์š”'}</h1>
    </header>
  );
};

export default Header;

// Footer.js

import React from 'react';
import { useLanguage } from './LanguageContext';

const Footer = () => {
  const { language } = useLanguage();

  return (
    <footer>
      <p>{language === 'en' ? '© 2024 MyWebsite. All rights reserved.' : '© 2024 ๋‚ด์›น์‚ฌ์ดํŠธ. ํŒ๊ถŒ ์†Œ์œ .'}</p>
    </footer>
  );
};

export default Footer;

  • ์œ„ ์ฝ”๋“œ์—์„œ๋Š” Header์™€ Footer ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์–ธ์–ด ์„ค์ • ๊ฐ’์„ ํ•„์š”
  • ๋”ฐ๋ผ์„œ ์ด ๋‘ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ํ•ด๋‹น ๊ฐ’์„ ์ „๋‹ฌ
  • ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋งŒ ์–ธ์–ด ์„ค์ • ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์žฌ๋ Œ๋”๋ง๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

// App.js

// App.js
import React from 'react';
import { LanguageProvider } from './LanguageContext';
import Header from './Header';
import Footer from './Footer';

const App = () => {
  return (
    <LanguageProvider>
      <div className="App">
        <Header />
        <main>
          {/* ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค */}
        </main>
        <Footer />
      </div>
    </LanguageProvider>
  );
};

export default App;

  • LanguageProvider ์ปดํฌ๋„ŒํŠธ๋กœ ์–ธ์–ด ์„ค์ • ๊ฐ’์„ ์ œ๊ณต
  • Header์™€ Footer ์ปดํฌ๋„ŒํŠธ๋Š” LanguageProvider ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— useLanguage ํ›…์„ ํ†ตํ•ด ์–ธ์–ด ์„ค์ • ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Header์™€ Footer ์ปดํฌ๋„ŒํŠธ๋งŒ ์–ธ์–ด ์„ค์ • ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์žฌ๋ Œ๋”๋ง๋œ๋‹ค.
  • ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

 

useContext

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„  Consumer๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ useContext hook์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

context๋ฅผ ์ฝ๊ณ  ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Provider๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ context ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ค˜์•ผ ํ•œ๋‹ค.

const value = useContext(MyContext);

 

 

Context API์˜ ์น˜๋ช…์  ๋‹จ์ 

  • Context API๋Š” Provider ํ•˜์œ„์˜ ๋ชจ๋“  Consumer๋“ค์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋žœ๋”๋ง์ด ๋œ๋‹ค.
  • ์ฆ‰, Context๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ!

 

 

Context ๋‚ด์šฉ๋ฌผ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ

์˜ˆ์‹œ : ๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ด๋ฉด ์ƒํƒœ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธ

const App = () => {
  const [mousePosition, setMousePosition] = useState<[number, number]>([0, 0]);

  // ๋งˆ์šฐ์Šค ์›€์ง์ž„์„ ๊ฐ์ง€ํ•˜์—ฌ mousePosition ์ƒํƒœ ๊ณ„์† ์—…๋ฐ์ดํŠธ
  useEffect(() => {
    document.addEventListener('mousemove', (event) => {
      setMousePosition([event.clientX, event.clientY]);
    });
  }, []);

  return (
    <MouseMovementContext.Provider value={mouseMovementContextValue}>
      <Header />

      <Article title="์˜ค๋Š˜๋„ ์ฆ๊ฑฐ์šด ํ•˜๋ฃจ" content="์˜ค๋Š˜ ์ƒˆ๋ฒฝ์— ์ข€ ๋งŽ์ด ์ถ”์›Œ์„œ ๊ทธ๋Ÿฐ์ง€ ์•„์นจ์— ํž˜๋“ค์—ˆ์–ด์š”. ์ผ๊ต์ฐจ๊ฐ€ ํฌ๋‹ˆ ์กฐ์‹ฌํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค.">
        <MousePositionMeter />
      </Article>
      <Article title="๋ƒ‰๋™ํ”ผ์ž๊ฐ€ 4์ฒœ์›์ด๋ฉด ๊ฝค ๊ดœ์ฐฎ์€๋ฐ?" content="ํ”ผ์ž์น˜์ฆˆ ์–น์–ด๋จน์œผ๋ฉด ๋”๋”์šฑ ๋ง›์žˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ง‘์— ํ”ผ์ž์น˜์ฆˆ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค." />
      <Article title="ํž˜๋“ค์—ˆ๋˜ ์ผ์ฃผ์ผ์ด ๋“œ๋””์–ด ๋" content="๋„ˆ๋ฌด ๋นก์„ผ๊ฑฐ๊ฐ™๋‹ค. ์•ผ๊ทผ๋„ ์ ๋‹นํžˆ ํ•ด์•ผ์ง€!!" />

      <Footer />
    </MouseMovementContext.Provider>
  );
};
  • MouseMovementContext๊ฐ€ ์žˆ๊ณ  ๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ด๋ฉด ์ƒํƒœ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธ
  • MouseMovementContext๋กœ๋ถ€ํ„ฐ ๋งˆ์šฐ์Šค์˜ ์œ„์น˜ ์ƒํƒœ ๊ฐ’์„ ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” MousePositionMeter ๋ฐ–์— ์—†๋‹ค.

 

์œ„ ์ฝ”๋“œ๋Š” ์ „์ฒด๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.

 

  • App์—์„œ setState๋ฅผ ํ•จ์œผ๋กœ์จ App์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒ
  • ํ•จ์ˆ˜์—์„œ ๋˜ Header, Article, Footer๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.

 

 

// ๋‚ด์šฉ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ๋ฅผ ์ ์šฉํ•œ ์ฝ”๋“œ

const MouseMovementProvider = ({ children }: PropsWithChildren) => {
  const [mousePosition, setMousePosition] = useState<[number, number]>([0, 0]);

  // ๋งˆ์šฐ์Šค ์›€์ง์ž„์„ ๊ฐ์ง€ํ•˜์—ฌ mousePosition ์ƒํƒœ ๊ณ„์† ์—…๋ฐ์ดํŠธ
  useEffect(() => {
    document.addEventListener('mousemove', (event) => {
      setMousePosition([event.clientX, event.clientY]);
    });
  }, []);

  return (
    <MouseMovementContext.Provider value={mouseMovementContextValue}>
      {children}
    </MouseMovementContext.Provider>
  );
}

const App = () => {
  return (
    <MouseMovementProvider>
      <Header />

      <Article title="์˜ค๋Š˜๋„ ์ฆ๊ฑฐ์šด ํ•˜๋ฃจ" content="์˜ค๋Š˜ ์ƒˆ๋ฒฝ์— ์ข€ ๋งŽ์ด ์ถ”์›Œ์„œ ๊ทธ๋Ÿฐ์ง€ ์•„์นจ์— ํž˜๋“ค์—ˆ์–ด์š”. ์ผ๊ต์ฐจ๊ฐ€ ํฌ๋‹ˆ ์กฐ์‹ฌํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค.">
        <MousePositionMeter />
      </Article>
      <Article title="๋ƒ‰๋™ํ”ผ์ž๊ฐ€ 4์ฒœ์›์ด๋ฉด ๊ฝค ๊ดœ์ฐฎ์€๋ฐ?" content="ํ”ผ์ž์น˜์ฆˆ ์–น์–ด๋จน์œผ๋ฉด ๋”๋”์šฑ ๋ง›์žˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ง‘์— ํ”ผ์ž์น˜์ฆˆ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค." />
      <Article title="ํž˜๋“ค์—ˆ๋˜ ์ผ์ฃผ์ผ์ด ๋“œ๋””์–ด ๋" content="๋„ˆ๋ฌด ๋นก์„ผ๊ฑฐ๊ฐ™๋‹ค. ์•ผ๊ทผ๋„ ์ ๋‹นํžˆ ํ•ด์•ผ์ง€!!" />

      <Footer />
    </MouseMovementProvider>
  );
};
  • Header, Article, Footer๋ฅผ children์„ ํ†ตํ•ด์„œ ์ „๋‹ฌ
  • ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์€ App์ด ๋ Œ๋”๋ง ํ•˜์—ฌ MouseMovementProvider์— ๋„˜๊ฒจ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— App์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š” ์ด์ƒ Header, Article, Footer์€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค
  • ์ฆ‰ MouseMovementProvider๊ฐ€ ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง ๋˜์–ด๋„ Header, Article, Footer๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • MousePositionMeter์—์„œ๋Š” useContext(MouseMovementContext)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

 

 

์œˆ๋„๋‹(Windowing)

 

๋Œ€๊ทœ๋ชจ ๋ชฉ๋ก์ด๋‚˜ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์€ ํฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ง„ ๋ชฉ๋ก์„ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

 

๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•œ ๋ฒˆ์— ๋งŽ์€ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ , ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋ง ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์œˆ๋„๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ธ React-Virtualized๊ฐ€ ์žˆ๋‹ค.

 

 

์˜ˆ์‹œ : ๋ฌดํ•œ ์Šคํฌ๋กค ํŽ˜์ด์ง€

import React from 'react';
import { List } from 'react-virtualized';

const MyListComponent = ({ data }) => {
  const rowRenderer = ({ index, key, style }) => {
    return (
      <div key={key} style={style}>
        {data[index]}
      </div>
    );
  };

  return (
    <List
      width={300}
      height={500}
      rowCount={data.length}
      rowHeight={30}
      rowRenderer={rowRenderer}
    />
  );
};

export default MyListComponent;

  • react-virtualized์˜ List ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ๋ชฉ๋ก์„ ๋ Œ๋”๋ง ํ•œ๋‹ค.
  • List ์ปดํฌ๋„ŒํŠธ๋Š” data ๋ฐฐ์—ด์˜ ๊ฐ ํ•ญ๋ชฉ์„ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด rowRenderer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
  • rowRenderer ํ•จ์ˆ˜๋Š” ๊ฐ ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ์—ญํ• 

 

 

์ด์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ๊ฐ€์ง„ ๋ชฉ๋ก์ด๋ผ๊ณ  ๊ฐ€์ •

  • ์œ„์˜ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์ œ๋กœ ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋ง ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค์„ ํ•  ๋•Œ๋งˆ๋‹ค List ์ปดํฌ๋„ŒํŠธ๋Š” ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•ด ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด๊ฒƒ์ด ์œˆ๋„๋‹์„ ์‚ฌ์šฉํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์ด๋‹ค. ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ €์ž‘์žํ‘œ์‹œ

'Frontend > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React Router: push์™€ replace์˜ ์ฐจ์ด์   (0) 2024.10.15
React Hook Form์˜ handleSubmit์œผ๋กœ ํผ ์ œ์ถœ ์‹œ ํŽ˜์ด์ง€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€ํ•˜๊ธฐ  (0) 2024.09.26
React Router v6  (0) 2024.09.26
Hook์˜ ๊ทœ์น™  (0) 2024.05.08
๋ฆฌ์•กํŠธ๋ฒ„์ „ 18๋ถ€ํ„ฐ ๋“ฑ์žฅํ•˜๋Š” Batching ๊ฐœ๋…  (0) 2024.05.03
    'Frontend/React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • React Hook Form์˜ handleSubmit์œผ๋กœ ํผ ์ œ์ถœ ์‹œ ํŽ˜์ด์ง€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€ํ•˜๊ธฐ
    • React Router v6
    • Hook์˜ ๊ทœ์น™
    • ๋ฆฌ์•กํŠธ๋ฒ„์ „ 18๋ถ€ํ„ฐ ๋“ฑ์žฅํ•˜๋Š” Batching ๊ฐœ๋…
    wam
    wam

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