Jieunny์˜ ๋ธ”๋กœ๊ทธ

[React] ๋ฆฌ๋•์Šค๋ž€ ๋ฌด์—‡์ผ๊นŒ? ๋ณธ๋ฌธ

Study/React

[React] ๋ฆฌ๋•์Šค๋ž€ ๋ฌด์—‡์ผ๊นŒ?

Jieunny 2023. 8. 24. 16:15

๐Ÿ’ก ๋ฆฌ๋•์Šค๋ž€?

โžฐ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

โžฐ Store๋ผ๋Š” ๊ณณ์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

โ“ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

โžฐ ๋ฆฌ์•กํŠธ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ๋‹จ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

โžฐ ๋ถ€๋ชจ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๊นŠ์ด๊ฐ€ ์งง๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ๊ธธ๋‹ค๋ฉด props drilling์ด ๋ฐœ์ƒํ•œ๋‹ค.

โžฐ Props Drilling - props๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์—๊นŒ์ง€ props๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š” ํ˜„์ƒ

(์ขŒ) ๊นŠ์ด๊ฐ€ 1์ผ ๊ฒฝ์šฐ / (์šฐ) ๊นŠ์ด๊ฐ€ 3์ผ ๊ฒฝ์šฐ

 

โœ๏ธ  ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…

1. Action

โžฐ ์ƒํƒœ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•  ์ง€ ํ–‰๋™์„ ์ ์–ด๋†“์€ ๊ฐ์ฒด

โžฐ ์•ก์…˜ ๊ฐ์ฒด๋Š” type ํ•„๋“œ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•˜๊ณ  ๊ทธ ์™ธ์˜ ๊ฐ’๋“ค์€ ๊ฐœ๋ฐœ์ž ๋งˆ์Œ๋Œ€๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

{
  type: "TOGGLE_VALUE"
}

 

2. Action Creator

โžฐ ์•ก์…˜์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋กœ, ๋‹จ์ˆœํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์•ก์…˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

export function addTodo(data) {
  return {
    type: "ADD_TODO",
    data
  };
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
export const changeInput = text => ({ 
  type: "CHANGE_INPUT",
  text
});

 

3. Dispatch

โžฐ ์ƒํƒœ๊ฐ’ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜

โžฐ ์•ก์…˜์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ˜ธ์ถœ์„ ํ•˜๋ฉด, ์Šคํ† ์–ด๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์„œ ํ•ด๋‹น ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋‹ค๋ฉด ์•ก์…˜์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

//๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ธ ์•ก์…˜๊ณผ ๊ทธ ์•ก์…˜์„ ๋ฆฌ๋“€์„œ๋กœ ๋ณด๋‚ด์ค„ ๋””์ŠคํŒจ์น˜
store.dispatch({ type: 'ADD_TODO' })
store.dispatch({ type: 'CHANGE_INPUT' })

 

4. Reducer

โžฐ ์•ก์…˜์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜

โžฐ ํ˜„์žฌ์˜ ์ƒํƒœ์™€, ์ „๋‹ฌ ๋ฐ›์€ ์•ก์…˜์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

function reducer(state, action) {
  // ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง
  return alteredState;
}

 

5. Store

โžฐ ์ƒํƒœ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„

โžฐ ์Šคํ† ์–ด ์•ˆ์—๋Š” ํ˜„์žฌ์˜ ์•ฑ ์ƒํƒœ์™€ ๋ฆฌ๋“€์„œ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ๋ช‡๊ฐ€์ง€ ๋‚ด์žฅ ํ•จ์ˆ˜๋“ค์ด ์žˆ๋‹ค.

import { createStore } from 'redux';

//์ƒํƒœ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ธ ์Šคํ† ์–ด
let store = createStore(reducer)

//์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ธŒ
// ๊ตฌ๋… ๋˜ํ•œ ์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜
// ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜จ๋‹ค.
// subscribe ํ•จ์ˆ˜์— ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋ฉด, ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜ ๋˜์—ˆ์„ ๋•Œ ๋งˆ๋‹ค ์ „๋‹ฌํ•ด์ค€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
store.subscribe(() => console.log(store.getState())))

โ—๏ธ ๋ฆฌ์•กํŠธ์—์„œ๋Š” subscribe๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  useSelector Hook ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋•์Šค ์Šคํ† ์–ด์˜ ์ƒํƒœ์— ๊ตฌ๋…ํ•œ๋‹ค.

 

๐Ÿ“Œ  ๋ฆฌ๋•์Šค์˜ ๊ทœ์น™

1. ๋‹จ์ผ ์Šคํ† ์–ด ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

โžฐ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

2. ์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด์–ด์•ผ ํ•œ๋‹ค.

โžฐ  ๊ธฐ์กด์˜ ์ƒํƒœ๋Š” ๊ฑด๋“ค์ด์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด์ฃผ๋ฉด, ๋‚˜์ค‘์— ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด์„œ ๋’ค๋กœ ๋Œ๋ฆด ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค์‹œ ์•ž์œผ๋กœ ๋Œ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

โžฐ  ๋ฆฌ๋•์Šค์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ๋˜๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ shallow equality ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โžฐ  ์ด๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ์ฒด์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ ํ•  ๋•Œ ๊ฐ์ฒด์˜ ๊นŠ์ˆ™ํ•œ ์•ˆ์ชฝ๊นŒ์ง€ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฒ‰ํ•ฅ๊ธฐ ์‹์œผ๋กœ ๋น„๊ต๋ฅผ ํ•˜์—ฌ ์ข‹์€ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ shallow equality : obejct๋“ค์„ ๋น„๊ตํ• ๋•Œ ๊ทธ๋“ค์˜ attribute๋“ค์„ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋“ค์˜ reference๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

3. ๋ฆฌ๋“€์„œ๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.

โžฐ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ :  ๋™์ผํ•œ ์ž…๋ ฅ์„ ๋ฐ›์•˜์„ ๋•Œ ์–ธ์ œ๋‚˜ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ๋‚ด๋Š” ํ•จ์ˆ˜

โžฐ ๋˜‘๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜ธ์ถœ๋œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.

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

[React] ๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด  (2) 2023.08.22