TIL - 21.08.12 πŸ‘¨β€πŸ’» - Redux

μ„±ν›ˆΒ·2021λ…„ 8μ›” 12일
0

TIL

λͺ©λ‘ 보기
50/59
post-thumbnail

TIL - 21.08.12 πŸ‘¨β€πŸ’»


Side Effect

μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” ν•¨μˆ˜ (λ˜λŠ” μ»΄ν¬λ„ŒνŠΈ)의 μž…λ ₯ 외에도 ν•¨μˆ˜μ˜ 결과에 영ν–₯을 λ―ΈμΉ˜λŠ” μš”μΈμ„ λœ»ν•œλ‹€.
ex) API호좜과 같은 λ„€νŠΈμ›Œν¬ 호좜


State

State의 두가지 ꡬ뢄

둜컬 - νŠΉμ • μ»΄ν¬λ„ŒνŠΈ μ•ˆμ—μ„œλ§Œ κ΄€λ¦¬λ˜λŠ” μƒνƒœ
μ „μ—­ - ν”„λ‘œλ•νŠΈ 전체 ν˜Ήμ€ 볡수의 μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ΄€λ¦¬λ˜λŠ” μƒνƒœ

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ „μ—­ λ³€μˆ˜λ₯Ό λ‚¨μš©ν•˜λ©΄ 쒋지 μ•Šμ§€λ§Œ μ‚¬μš©ν•΄μ•Όν•  λ•Œκ°€ μžˆλŠ” 것 처럼 μ „μ—­ μƒνƒœ μ—­μ‹œλ„ μ‚¬μš©ν•΄μ•Όν•  λ•Œκ°€ μžˆλ‹€.
λŒ€ν‘œμ μΈ μ˜ˆκ°€ 같은 μƒνƒœλŠ” ν•œ μΆœμ²˜μ—μ„œ λ‚˜μ™€μ•Ό ν•œλ‹€λŠ” 원칙을 μ§€ν‚¬λ•ŒμΈλ°, 같은 μƒνƒœλ₯Ό λ‹€λ₯Έ μΆœμ²˜μ—μ„œ λ°›μ•„μ˜¬ 경우, 이 λ³„λ„μ˜ 두 μƒνƒœλ₯Ό 동기화(sync)ν•˜λŠ” 과정이 μΆ”κ°€μ μœΌλ‘œ λ°œμƒν•˜κ³  이 κ³Όμ •μ—μ„œ 좔가적인 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆκΈ°μ— μ „μ—­ μƒνƒœλ‘œ ν•œλ²ˆμ— κ΄€λ¦¬ν•΄μ£ΌλŠ” 것이닀.

이λ₯Ό 쑰금 μ–΄λ €μš΄ 말둜 데이터 무결성을 μœ„ν•΄ 동일 λ°μ΄ν„°λŠ” 항상 λ™μΌν•œ κ³³μ—μ„œ 가지고 μ˜€λ„λ‘ν•œλ‹€κ³  ν•˜κ³ , 이λ₯Ό μœ„ν•œ 방법둠을 Single Source of Truth(μ‹ λ’°ν•  수 μžˆλŠ” 단일 좜처)원칙이라 ν•œλ‹€.

  • 데이터 무결성 - λ°μ΄ν„°μ˜ 정확성을 보μž₯ν•˜κΈ° μœ„ν•΄ λ°μ΄ν„°μ˜ λ³€κ²½μ΄λ‚˜ μˆ˜μ • μ‹œ μ œν•œμ„ 두어 μ•ˆμ •μ„±μ„ μ €ν•΄ν•˜λŠ” μš”μ†Œλ₯Ό 막고 데이터 μƒνƒœλ“€μ„ 항상 옳게 μœ μ§€ν•˜λŠ” 것.

μ „μ—­μœΌλ‘œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 예
1. 라이트 λͺ¨λ“œ, 닀크 λͺ¨λ“œ ν…Œλ§ˆμ„€μ •
2. μ•±μ˜ μ–Έμ–΄μ„€μ •


μƒνƒœ 관리 라이브러리

μ΄λ ‡κ²Œ μ „μ—­ μƒνƒœλ₯Ό μ‚¬μš©ν• λ•Œ, κ΄€λ¦¬ν•˜κ²Œ νŽΈν•˜κ²Œ ν•΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μžˆλŠ”λ°, λŒ€ν‘œμ μΈ 라이브러리 세가지가 React Context, Redux, MobX 이며 Reduxλ₯Ό κ³΅λΆ€ν•΄λ³΄λ €ν•œλ‹€.

이 λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ˜ λŒ€ν‘œμ μΈ κΈ°λŠ₯은 μ „μ—­ μƒνƒœλ₯Ό μœ„ν•œ μ €μž₯μ†Œλ₯Ό μ œκ³΅ν•˜λŠ” 것이닀.
이둜 인해 props drilling 문제 등을 ν•΄κ²°ν•  수 μžˆλ‹€.

μ—¬κΈ°μ„œ props drillingμ΄λž€, 예둜 A μ»΄ν¬λ„ŒνŠΈμ— μžˆλŠ” μƒνƒœλ₯Ό A의 μžμ‹ μ»΄ν¬λ„ŒνŠΈμΈ B의 μžμ‹ μ»΄ν¬λ„ŒνŠΈμΈ Cμ—μ„œ ν™œμš©ν•˜κ³  μ‹Άμ„λ•Œ, BλŠ” ν•΄λ‹Ή μƒνƒœκ°€ ν•„μš”μ—†μŒμ—λ„ C둜 props ν•΄μ€˜μ•Ό ν•˜λ―€λ‘œ Aλ‘œλΆ€ν„° μƒνƒœλ₯Ό λ°›μ•„μ™€μ•Όν•œλ‹€. μ—¬κΈ°μ„œ Cκ°€ Aλ‘œλΆ€ν„° μ „λ‹¬λ˜λŠ” μƒνƒœλ₯Ό λ°›λŠ” 것이 μ•„λ‹Œ, μ „μ—­ μƒνƒœμ—μ„œ λ°›κ²Œλœλ‹€λ©΄ ν•΄λ‹Ή λ¬Έμ œκ°€ ν•΄κ²°λœλ‹€.


Redux

λ¦¬λ•μŠ€λŠ” μƒνƒœλ₯Ό νŽΈν•˜κ²Œ κ΄€λ¦¬ν•˜κ²Œ λ„μ™€μ£ΌλŠ” λŒ€ν‘œμ μΈ λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.

createStore()

storeλŠ” dataλ₯Ό μ €μž₯ν•˜λŠ” 곳이닀.
createStore()λŠ” λ¦¬λ•μŠ€μ˜ λ©”μ†Œλ“œμ΄κ³  데이터λ₯Ό μ°Ύκ³  μˆ˜μ •ν•˜λŠ” reducer ν•¨μˆ˜λ₯Ό 인자둜 μš”κ΅¬ν•œλ‹€. 그리고 이 store μ•ˆμ˜ dataλŠ” reducer ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œλ§Œ μˆ˜μ •ν•  수 μžˆλ‹€.

이 λ¦¬λ“€μ„œκ°€ λ¦¬ν„΄ν•˜λŠ” 것이 데이터가 되고, λ¦¬λ“€μ„œκ°€ 인자둜 μžˆλŠ” createStore의 μΈμŠ€ν„΄μŠ€μ—μ„œ getState()λ₯Ό μ΄μš©ν•΄ μƒνƒœ 값을 λ°›μ•„μ˜¬ 수 μžˆλ‹€.

import {createStore} from 'redux';

const reducer = () => {
  return 'hello'
}

const store = createStore(reducer);

console.log(store.getState()) // 'hello' 

action & dispatch()

λ¦¬λ“€μ„œμ˜ 첫번째 μΈμžλ‘œλŠ” ν•΄λ‹Ή λ¦¬λ“€μ„œκ°€ λ‹€λ£° 데이터가 λ³€μˆ˜λ‘œ λ“€μ–΄κ°€κ³  λ‘λ²ˆμ§Έ μΈμžλ‘œλŠ” action이 μ˜€λŠ”λ° 이 ν•΄λ‹Ή μΈμžλŠ” 객체 ν˜•νƒœλ‘œ dispatch({type:'value'}) λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄ λ¦¬λ“€μ„œ μ•ˆμ—μ„œ 객체 action을 톡해 데이터λ₯Ό μ‚¬μš©ν•˜κ²Œ ν•  수 μžˆλ‹€.
μœ„μ™€ 같이 store.dispatch({type: 'value'}) 와 같이 μ‚¬μš©ν–ˆλ‹€λ©΄, λ¦¬λ“€μ„œ μ•ˆμ—μ„œ action 객체 μ•ˆμ— ν‚€κ°€ type이고 값이 'value'인 ν”„λ‘œνΌν‹°κ°€ μƒκΈ°λŠ” 것이닀.

그리고 dispatch ν•΄μ€„λ•Œ 항상typeμ΄λΌλŠ” ν‚€ 값이 μžˆμ–΄μ•Όν•œλ‹€.

import {createStore} from 'redux';

const reducer = (data, action) => {
  data = action.type
  return data;
}

const store = createStore(reducer);
store.dispatch({type: 'hello'});

console.log(store.getState()) // 'hello'

subscribe()

subscribeλŠ” 인자둜 μ½œλ°±ν•¨μˆ˜λ₯Ό λ°›λŠ” createStore의 λ©”μ†Œλ“œμ΄λ‹€.
λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œ createStore μΈμŠ€ν„΄μŠ€λ₯Ό κ°μ‹œν•˜λ©° ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ 데이터에 λ³€ν™”κ°€ μƒκ²Όμ„λ•Œ 가지고 μžˆλŠ” μ½œλ°±ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.

import {createStore} from 'redux';

const reducer = (data, action) => {
  data = action.type
  return data;
}

const store = createStore(reducer);

store.subscribe(()=>{
  console.log(store.getState())
})

store.dispatch({type: 'hello'}); // 'hello'
// dispatch μ‹œμΌœμ€ŒμœΌλ‘œ reducer ν•¨μˆ˜κ°€ 호좜되고 결과적으둜 store의 데이터가 λ³€ν•œλ‹€.
// subscribe λ©”μ†Œλ“œλ‘œ storeλ₯Ό κ°μ‹œμ€‘μ΄μ—ˆμœΌλ―€λ‘œ λ°”λ€ŒλŠ” μˆœκ°„μ— μ½œλ°±ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  
// μ €μž₯된 데이터가 μ½˜μ†”μ— 둜그둜 λ‚¨λŠ”λ‹€.

팁

  1. reducer λ‚΄μ—μ„œ action을 μ΄μš©ν• λ• 쑰건문 if elseλ₯Ό μ΄μš©ν•΄λ„ λ˜μ§€λ§Œ, dispatch둜 λ³΄λ‚΄λŠ” λ°μ΄ν„°λŠ” 항상 action.typeκ³Ό ν•¨κ»˜ λ°›μ•„μ˜€κΈ°μ— λ§Žμ€ κ°œλ°œμžλ“€μ΄ switchλ₯Ό μ‚¬μš©ν•œλ‹€.
const reducer = (data, action) =>{
 switch(action.type){
   case "name":
     return data = 'sunghoon';
    case "future-job":
     return data = 'dev';
 } 
}

const reducer = (data, action) => {
	if(action.type === 'name'){
    	return data = 'sunghoon';   
    } else if(action.type === 'future-job'){
    	return data = 'dev'
    }
}

이 두 λ¦¬λ“€μ„œλŠ” κ°™λ‹€.

  1. κ³ μ •λœ λ¬Έμžμ—΄μ„ μ‚¬μš©ν• λ•Œ 같은 문자λ₯Ό const둜 μ„ μ–Έν•˜κ³  ν•΄λ‹Ή κΈ€μžλ₯Ό ν• λ‹Ήν•˜λ©΄ μ°¨ν›„ μ˜€νƒ€λ‘œ μΈν•œ μ—λŸ¬λ₯Ό λΉ λ₯΄κ²Œ 감지할 수 μžˆλ‹€.
    μ™œλƒλ©΄ μ„ μ–Έλ˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν• λ• μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€λ§Œ, λ¬Έμžμ—΄μ˜ 경우 μ½”λ“œκ°€ μž‘λ™λ˜μ§€ μ•Šλ”λΌλ„ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.
    κ²Œλ‹€κ°€ const둜 μ„ μ–Έν–ˆκΈ°μ— 쀑볡도 λ°©μ§€λœλ‹€.

TO DO πŸ”₯

  • λ…Έλ§ˆλ“œμ½”λ” λ§ˆμ € λ“£κΈ°
  • λ¦¬μ•‘νŠΈ ν›… 곡뢀
  • λ¦¬λ•μŠ€ 좔가곡뢀

Reference πŸ™‡

λ¦¬λ•μŠ€ κ³΅λΆ€ν•œ λΆ€λΆ„ - https://nomadcoders.co/

profile
μ–΄λ–»κ²Œ 이걸 ν’€μ–΄λ‚Ό 수 μžˆμ„κΉŒ

0개의 λŒ“κΈ€