React ํ›‘๊ธฐ

์ฝ”๋”ฉ๋•ยท2024๋…„ 4์›” 23์ผ

๐Ÿ“™ ๋ชฉ์ฐจ

1. ์™œ React๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
2. React์˜ ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ
3. React์˜ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์š”์ฒญ
4. React Hooks


์™œ React๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

๊ธฐ์ˆ  ์Šคํƒ์ด ํ”„๋กœ์ ํŠธ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

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

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

ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ˆ  ์Šคํƒ์—์„œ์˜ React

1. ์‹œ์žฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋ฆฌ์†Œ์Šค
GitHub์—์„œ ์ƒ์œ„ 5๊ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๋Œ€๊ทœ๋ชจ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ง€์›์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Fortune 500๋Œ€ ๊ธฐ์—…( Netflix, Uber, Amazon, Airbnb ๋“ฑ)์—์„œ๋„ ์„ ํ˜ธํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

2. ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜
JSX ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ UI ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

3. React Native
๋ฆฌ์•กํŠธ์˜ UI๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜์—ฌ ์›น์ด ์•„๋‹Œ ํ”Œ๋žซํผ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ์ˆ ์„ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. React Native๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ(Android)์™€ ์•„์ดํฐ(iOS)์˜ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ๋งŒ๋“œ๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๋†’์€ ํ˜ธํ™˜์„ฑ
๋ฆฌ์•กํŠธ๋Š” ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ฃผ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ(React Router)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๊ฐ„์˜ ์ „ํ™˜์„ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฆฌ๋•์Šค(Redux)๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์ ํ•ฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ์ด ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค.


React์˜ ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ

1. Redux

Redux๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” React ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
๋‹จ์ผ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Redux๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ํŒจํ„ด์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. MobX

MobX๋Š” ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„๋‹จํ•œ API๋ฅผ ๊ฐ€์ง„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Observable ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. MobX๋Š” Redux์™€ ๋น„๊ตํ•˜์—ฌ ๋” ์œ ์—ฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. React Context API

React์— ๋‚ด์žฅ๋œ Context API๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํŒŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ž‘์€ ๊ทœ๋ชจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ๋‹จ์ˆœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” Redux๋‚˜ MobX๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Recoil

Facebook์—์„œ ๊ฐœ๋ฐœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ๊ณต์œ ๋˜๋Š” ์ƒํƒœ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ์˜ ๋ณ€๊ฒฝ ๋ฐ ์ฝ๊ธฐ๊ฐ€ ๊ฐ„๋‹จํ•˜๋ฉฐ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ์˜ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

5. Zustand

Zustand์€ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ React ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ํ•จ์ˆ˜๋กœ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ณ , ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Zustand๋Š” Context API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๊ฐ„๋‹จํ•œ API์™€ ํ•จ๊ป˜ ์ƒํƒœ์˜ ๊ตฌ๋…๊ณผ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


React์˜ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์š”์ฒญ

1. Redux-toolkit

Redux์™€ ํ•จ๊ป˜ thunk ๋ฏธ๋“ค์›จ์–ด(RTK Query)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Redux๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•ด์•ผํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์บ์‹ฑ์˜ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2. React-query, swr

๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ฐ ์บ์‹ฑ์— ์œ ๋ฆฌ, ๋งŽ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๋ฐ์ดํ„ฐ ํŒจ์นญ์ด ์žˆ์œผ๋ฉด ์ ํ•ฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ React ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์บ์‹ฑํ•˜๊ณ , ๋™๊ธฐํ™”ํ•˜๊ณ , ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.


React Hooks

Hook์„ ํ†ตํ•ด ๋ผ์ดํ”„ ์‚ฌ์ดํด ๊ธฐ๋Šฅ๊ณผ state ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

์ƒํƒœ ๋ณ€๊ฒฝ, ์ฆ‰ ๊ฐ€์ƒ๋”์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ๊ทธ์— ๋”ฐ๋ฅธ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

โœ… useState

  • Hooks ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ํ•จ์ˆ˜
  • ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ”๋€Œ๋Š” ๊ฐ’์„ ๊ด€๋ฆฌ
  • ๊ฐ€์ƒ๋”์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋ฐ”๋€ ๊ฒƒ์„ ๊ฐ์ง€ํ•˜์—ฌ ๋ฆฌ๋žœ๋”๋ง ์‹œ์ผœ์•ผ์ค˜์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜

โœ… useCallBack

  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

โœ… useEffect

  • ๋งˆ์šดํŠธ / ์–ธ๋งˆ์šดํŠธ ์‹œ ํŠน์ • ์ž‘์—…(ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ)๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ๋„ ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰

(3-2) useLayoutEffect

  • useEffect์™€ ๋™์ผํ•˜์ง€๋งŒ, DOM์ด ๊ทธ๋ ค์ง€๊ธฐ ์ด์ „ ์‹œ์ ์— ๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
  • ๋•Œ๋ฌธ์— DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„, ์‚ฌ์šฉ์ž๋Š” ๊นœ๋นก์ž„์„ ๋ณด์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • ๊ฐ€๋Šฅํ•œ useEffect๋ฅผ ์“ฐ๊ณ  ๊ตฌํ˜„์ด ์•ˆ๋ ๋•Œ๋งŒ ์‚ฌ์šฉ ๊ถŒ์žฅ

โœ… useMemo

  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ์—ฐ์‚ฐ๋œ ๊ฐ’(๊ฒฐ๊ณผ)๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ Œ๋”๋ง ๋˜์—ˆ์„ ๋•Œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜(์‹คํ–‰๋ฌธ)
  • ํ•จ์ˆ˜์— return๊ฐ’์ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ
import { useMemo, useEffect, useState } from "react";

export default function UseMemo() {
  const [val, setVal] = useState("");
  const [isKorea, setIsKorea] = useState(true);
  
  // useMemo๋ฅผ ์‚ฌ์šฉ์•ˆํ•˜๋ฉด isKorea ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ val๊ฐ’์ด ๋ณ€ํ•ด๋„ useEffect() ์‹คํ–‰๋Œ
  // const location = { country: isKorea ? "ํ•œ๊ตญ" : "์ผ๋ณธ" };
  
  const location = useMemo(() => {
    return {
      country: isKorea ? "ํ•œ๊ตญ" : "์ผ๋ณธ",
    };
  }, [isKorea]); // isKorea๊ฐ’์ด ๋ฐ”๊ทˆ๋•Œ๋งŒ ์‹คํ–‰

  useEffect(() => {
    console.log("useEffect... ํ˜ธ์ถœ"); 
  }, [location]);   

  const onChange = (event: React.FormEvent<HTMLInputElement>) => {
    const {
      currentTarget: { value },
    } = event;
    setVal(value);
  };

  return (
    <header>
      <div>UseMemo๐Ÿ˜Š</div>
      <h2>ํ•˜๋ฃจ์— ๋ช‡ ๋ผ ๋จน์–ด์š”?</h2>
      <input value={val} onChange={onChange} />
      <h2>์–ด๋А ๋‚˜๋ผ์— ์žˆ์–ด์š”?</h2>
      <p>๋‚˜๋ผ: {location.country}</p>
      <button onClick={() => setIsKorea(!isKorea)}>Update</button>
    </header>
  );
}

โœ… useRef

  • Js์—์„œ DOM SELECTOR ํ•จ์ˆ˜์ฒ˜๋Ÿผ React์—์„œ DOM์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋Š” ์ผ์ด ์ƒ๊ธด๋‹ค๋ฉด ์ ‘๊ทผํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” Hooks ํ•จ์ˆ˜
  • ref ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์€ render์™€ ์ƒ๊ด€์—†์ด ์œ ์ง€๋จ
export default function UseRef() {
  const nameFocus = useRef<HTMLInputElement>(null);  // useRef๋กœ inputํƒœ๊ทธ ์ ‘๊ทผ
  const [inputs, setInputs] = useState("");
 
  const onFocus = () => {
    if (nameFocus.current) {
      nameFocus.current.focus();  // useRef๋กœ inputํƒœ๊ทธ ํฌ์ปค์‹ฑ
    }
  };

  return (
    <div>
      <input
        name="์ด๋ฆ„"
        value={inputs}
        ref={nameFocus}
      />
      <button onClick={onFocus}>ํฌ์ปค์Šค ์ฃผ๊ธฐ</button>
    </div>
  );
}

๐Ÿค” useRef , useMemo์™€ Callbcack์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๋ฉ”๋ชจ์ด์ œ์ด์…˜

๋งŒ์•ฝ ์–ด๋– ํ•œ ์—ฐ์‚ฐ์ด๋‚˜ ํ•จ์ˆ˜๊ฐ€ ๋ณต์žกํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค (30์ดˆ)
๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋žœ๋”๋ง, ํ•˜์ง€๋งŒ ๋žœ๋”๋ง ๋  ๋•Œ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด๋ผ๋ฉด ํ•œ๋ฒˆ ๋” ์‹คํ–‰ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์•ˆ๋ฐ”๋€Œ๋Š” ์—ฐ์‚ฐ์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋žœ๋”๋ง์ด ๋˜๋”๋ผ๋„ ์žฌ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ๊ฐ’์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉ
์ฆ‰, ๋žœ๋”๋ง ์‹œ ํ•„์š” ์—†๋Š” ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„์„ ์ค„์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

0๊ฐœ์˜ ๋Œ“๊ธ€