๐Ÿ“ฐ Front-end/์ƒํƒœ๊ด€๋ฆฌ

[Redux] createStore๋ฅผ ํ•ด๋ณด์ž

s2ylvia 2024. 5. 27. 15:45

Redux๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋ญ๋ถ€ํ„ฐ ํ•ด์•ผํ• ๊นŒ?

๋ฐ”๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ๊ณต๊ฐ„์ธ store๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

์ตœ๊ทผ ๋ฉด์ ‘๊ณผ์ •์—์„œ ๋ผ์ด๋ธŒ์ฝ”๋”ฉ์œผ๋กœ Redux์˜ store๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”๋‹ค.

์•„์ด๊ณ .. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•ด์„œ ์‚ฌ์šฉํ•  ์ค„๋งŒ ์•Œ์•˜์ง€..

์•ˆ์— ๋Œ์•„๊ฐ€๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ž์„ธํžˆ ์•Œ๋ ค๊ณ ํ•˜์ง€์•Š์•˜๋˜ ๋‚ด ์ง€๋‚œ ๊ณผ์˜ค๊ฐ€ ๋จธ๋ฆฟ์†์—์„œ ์ขŒ๋ฅด๋ฅต ํ˜๋Ÿฌ๊ฐ”๋‹ค.

 

๋„ค.. ๊ทธ๋ ‡๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ๋ฉด์ ‘์€ ๋์ด๋‚ฌ๊ณ , ์•„์‰ฝ์ง€๋งŒ ์–ด์ฉŒ๊ฒ ๋‚˜.

์ง€๊ธˆ๋ถ€ํ„ฐ ํ•ด๋ณด์ž.

 

 

Store

์šฐ์„ , store๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.

const store = {
	getState,
	subscribe,
	dispatch,
}

 

๊ทธ๋ฆฌ๊ณ  ์ „์—ญ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๋Š” getState, ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ตฌ๋…(์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์ „๋‹ฌ)ํ•  ์ˆ˜ ์žˆ๋Š” subscribe, action์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  reducer๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ  ๋‚˜์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” dispatch API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

 

CreateStore

createStore๋Š” ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ reducer๋ฅผ ๋ฐ›๋Š”๋ฐ ์ด reducer๋Š” state๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

store๋Š” ์˜ค๋กœ์ง€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ธ reducer๋ฅผ ํ†ตํ•ด state๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

function createStore(reducer){	
    function getState(){}
    function subscribe(){}
    function dispatch(){}
    
    const store = {
    	getState,
        subscribe,
        dispatch,
    }
    
    return store;
}

 

 

getState

function createStore(reducer) {
    let state = undefined;

    function getState() {
        return state;
    }
    ...
}

 

state๋ฅผ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  getState๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

createStore๊ฐ€ ํด๋กœ์ €์ด๊ธฐ๋•Œ๋ฌธ์— getState๋Š” ๊ณ„์†ํ•ด์„œ state๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

subscribe

์ „์—ญ ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋กœ,

๊ตฌ๋…์ž ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๊ตฌ๋…์ž๋Š” ๋“ฑ๋กํ•ด์ฃผ๊ณ  ๊ตฌ๋…์„ ํ•ด์ œํ•˜๋Š” ์ž๋Š” ์‚ญ์ œ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด store๋Š” ๊ตฌ๋…์ž ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฐ๋‹ค.

function createStore(reducer){
    let state = undefined;
    //๊ตฌ๋…์ž ๋ฐฐ์—ด
    const subscribers = [];
    
    function subscribe(subscriber){
    	//๊ตฌ๋…์ž ๋“ฑ๋ก
    	subscribers.push(subscriber);
        
        //๊ตฌ๋… ํ•ด์ œ
        return unsubscribe(){
            //๊ตฌ๋…์ž ์ž๊ธฐ ์ž์‹ ์„ ์‚ญ์ œ
            subscribers.splice(subscribers.indexOf(subscriber), 1);
        }
    }
    ...
}

 

 

 

dispatch

dispatch๋Š” action์„ ์ „๋‹ฌ๋ฐ›์•„ reducer๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ action์„ ๋ฐ˜ํ™˜ํ•ด ๋‹ค์Œ dispatch ํ•จ์ˆ˜๊ฐ€ action์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

function createStore(reducer){
    let state = undefined;
    const subscribers = [];
    
    function dispatch(action){
    	//๋ณ€๊ฒฝ๋œ ์ƒํƒœ ์ƒˆ๋กœ ๋“ฑ๋ก
    	state = reducer(state, action);
        //๊ตฌ๋…์ž๋“ค์—๊ฒŒ ์ „๋‹ฌ?
        subscribers.forEach(subscriber => subscriber())
	return action;
    }
    ...
}

 

 

 


์ฐธ์กฐ

[Redux] createStore - ๊ตฌํ˜„ํŽธ (velog.io)