2. React State

1. Thinking in React

๐Ÿ“Œ Thinking in React ๋ฆฌ์•กํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ธฐ์ดˆ

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

Step 3: Find the minimal but complete representation of UI state

UI ์ƒํƒœ์˜ ์ตœ์†Œํ•œ์˜, ์™„๋ฒฝํ•œ ํ‘œํ˜„ ์ฐพ๊ธฐ

Step 4: Identify where your state should live

์ƒํƒœ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ์œ„์น˜ ํ™•์ธ

Step 5: Add inverse data flow

์—ญ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ถ”๊ฐ€

2. React state

React state

React์˜ state๋Š” ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์š”์†Œ

Re-render

state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋ฆฌ๋ Œ๋”๋ง์€ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ render๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์ง€, React๊ฐ€ ์–ธ๋งˆ์šดํŠธ์‹œํ‚ค๊ณ  ๋‹ค์‹œ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

state์˜ ๊ธฐ์ค€

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ€์ง€๋Š” state โ—๏ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋‹ค state์ธ ๊ฒƒ์€ ์•„๋‹˜

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด

  • ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐ’

๐Ÿ“Œ React State์˜ ์กฐ๊ฑด

  1. ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š”๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค.

  2. ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค. โ†’ ๋ณ€๊ฒฝ๋˜์•ผ ํ•จ

  3. ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ๋‹ค๋ฅธ state๋‚˜ props๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค. โ†’ โœจ ๊ณ„์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

์ฃผ์˜์ 

  1. ๐Ÿ’ก DRY ์›์น™์ด ํ•ต์‹ฌ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ๋งŒ๋“ค์–ด๋„ ๋˜์ง€๋งŒ, ์ผ๊ด€์„ฑ๊ณผ ํšจ์œจ์„ ์œ„ํ•ด DRY ์›์น™์„ ๋”ฐ๋ฅด๋Š” SSOT๋ฅผ ๋งŒ๋“ค๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐ€์žฅ ์ตœ์†Œํ•œ์˜ state๋ฅผ ์ฐพ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๊ฒƒ๋“ค์ด ํ•„์š”์— ๋”ฐ๋ผ ๊ทธ๋•Œ๊ทธ๋•Œ ๊ณ„์‚ฐ๋˜๋„๋ก ๋งŒ๋“ค ๊ฒƒ

  2. TypeScript ์ด์šฉํ•˜๊ธฐ ๋‹ค๋ฃจ๋Š” ์ƒํƒœ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ๋ณต์žกํ•จ interface, type ๋“ฑ TypeScript๋ฅผ ์ž˜ ํ™œ์šฉํ•ด์„œ ์ƒํƒœ๋ฅผ ๋ฌถ์œผ๋ฉด, ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์˜ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

    • props๋ฅผ ๋„˜๊ฒจ์ฃผ๊ธฐ ์‰ฌ์›€

    • ์žฌ์‚ฌ์šฉ ํŽธ๋ฆฌ

3. DRY ์›์น™

DRY (Donโ€™t Repeat Yourself)

์ค‘๋ณต ๋ฐฐ์ œ(Don't repeat yourself) ๋ชจ๋“  ํ˜•ํƒœ์˜ ์ •๋ณด ์ค‘๋ณต์„ ์ง€์–‘ํ•˜๋Š” ์›๋ฆฌ ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ ˆ๋Œ€ Copy&Paste(๋ฐ˜๋ณต)ํ•˜์ง€ ๋ง๋ผ๋Š” ์›์น™

๐Ÿ“œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ 3๊ฐ€์ง€ ์›์น™

DRY - Don't Repeat Yourself : ์ค‘๋ณต ๋ฐฐ์ œ KISS - Keep It Simple, Stupid : ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ, SRP, ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ์ง€์–‘ YAGNI - You Ain't Gonna Need it : ์‹ค์ œ๋กœ ํ•„์š”ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๊ตฌํ˜„ํ•˜์ง€ ๋ง ๊ฒƒ

4. SSOT(Single Source of Truth)

SSOT (Single Source of Truth)

๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›

๋ชจ๋“  ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ํ•œ ๊ณณ์—์„œ๋งŒ ์ œ์–ด ๋˜๋Š” ํŽธ์ง‘ํ•˜๋„๋ก ์กฐ์งํ•˜๋Š” ๊ฒƒ ๋ชจ๋“  ์ „์—ญ ์ƒํƒœ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด(์Šคํ† ์–ด) ์•ˆ์— ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ์ €์žฅ ๋ฐ์ดํ„ฐ ์š”์†Œ๋กœ์˜ ๊ฐ€๋Šฅํ•œ ์—ฐ๊ฒฐ์€ ๋ชจ๋‘ ์ฐธ์กฐ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง

์žฅ์ 

  • ๋ชจ๋“  ์ƒํƒœ๊ฐ€ ํ•˜๋‚˜์˜ ์Šคํ† ์–ด์— ์ €์žฅ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹จ์ˆœํ•ด์ง€๊ณ , ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›€

  • Undo, Redo ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ง

5. Lifting State Up

Lifting State Up

๋” ์ด์ƒ ์˜ฌ๋ผ๊ฐˆ ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ์ƒํƒœ๋ฅผ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ , ์†Œ์œ ํ•ด์•ผ ํ• ๊นŒ?

(React๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ) ํ•ด๋‹น ์ƒํƒœ์— ์˜์กด์ ์ธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒํƒœ๋ฅผ ์†Œ์œ ํ•ด์•ผ ํ•จ

6. useState

useState

React ๋ฒ„์ „ 16.8๋ถ€ํ„ฐ React ์š”์†Œ๋กœ ์ƒˆ๋กœ ์ถ”๊ฐ€ Hook์„ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด Class ๋ฐ”ํƒ•์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์ƒํƒœ ๊ฐ’๊ณผ ์—ฌ๋Ÿฌ React์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

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

// "state"๋ผ๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ’์„ ์ •์˜
const [state, setState] = useState(initialState);

์ƒํƒœ๊ฐ’๊ณผ ๊ทธ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ ์ตœ์ดˆ๋กœ ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๋™์•ˆ, ๋ฐ˜ํ™˜๋œ state๋Š” ์ดˆ๊ธฐ๊ฐ’(initialState)๊ณผ ๊ฐ™์Œ

setState(newState);

setState ํ•จ์ˆ˜๋Š” state๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ์‚ฌ์šฉ ์ƒˆ state ๊ฐ’์„ ๋ฐ›์•„ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์„ ํ์— ๋“ฑ๋ก useState๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋ฐ›์€ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ ํ•ญ์ƒ ๊ฐฑ์‹ ๋œ ์ตœ์‹  state

setState((prevState) => prevState + 1);

๊ธฐ์กด ์ƒํƒœ๋ฅผ ์–ป๊ณ ์‹ถ์„ ๋•Œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์คŒ

setState์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

์ฐธ๊ณ  ์ž๋ฃŒ

  1. setState๊ฐ€ ์ฝœ์Šคํƒ์— ๋“ค์–ด๊ฐ

    • ์ฝœ์Šคํƒ์—๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋งŒ ๋“ฑ๋ก

  2. ๋น„๋™๊ธฐ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ Web APIs๋กœ ๋„˜์–ด๊ฐ(์ฝœ์Šคํƒ์—์„œ ๋น„์›Œ์ง)

    • Web APIs์—์„œ time ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚จ

  3. ๊ฐ’์ด ์ฝœ๋ฐฑ ํ๋กœ ๋“ค์–ด๊ฐ

  4. ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ๋‹ค์‹œ ์ฝœ์Šคํƒ์— ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”๋ฐ, ์ฝœ์Šคํƒ์— ์ด๋ฏธ console.log() ์กด์žฌ

  5. ์ฝœ ์Šคํƒ์ด ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ๋“ค์–ด๊ฐ

7. Inverse Data Flow

์—ญ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ถ”๊ฐ€ํ•˜๊ธฐ

๊ณ„์ธต ๊ตฌ์กฐ์˜ ํ•˜์œ„์— ์žˆ๋Š” ํผ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ state ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” setState()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์•ฑ์„ ์—…๋ฐ์ดํŠธ

๋ฐ์ดํ„ฐ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋ณด๋‚ผ ๋•Œ๋Š” props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ โฌ‡๏ธ ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜์—์„œ ์œ„๋กœ ๋ณด๋‚ผ ๋•Œ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ props๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ(์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜) โฌ†๏ธ

TypeScript(์ •ํ™•ํžˆ๋Š” JavaScript)์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰(first-class) ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๊ฑฐ๋‚˜, ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ ์ต๋ช… ํ•จ์ˆ˜, ํด๋กœ์ € ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๋„ˆ์ง€๊ฐ€ ํผ

8. 1๊ธ‰ ๊ฐ์ฒด(first-class object)

1๊ธ‰ ๊ฐ์ฒด

๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ธฐ๊ธฐ, ์ˆ˜์ •ํ•˜๊ธฐ, ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๊ธฐ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ง€์›ํ•  ๋•Œ ์ผ๊ธ‰ ๊ฐ์ฒด๋ผ๊ณ  ๋ถ€๋ฆ„ JavaScript์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ 1๊ธ‰ ๊ฐ์ฒด

์ผ๊ธ‰ ํ•จ์ˆ˜

์ผ๊ธ‰ ํ•จ์ˆ˜

ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ์–ธ์–ด๋Š” ์ผ๊ธ‰ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์กŒ๋‹ค๊ณ  ํ‘œํ˜„ ์ผ๊ธ‰ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์–ธ์–ด์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณ€์ˆ˜์—๋„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ : ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜(์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ค€ ํ•จ์ˆ˜)

  • ๊ณ ์ฐจ ํ•จ์ˆ˜ : ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

Last updated