1. External Store
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
Layered Architecture
Flux Architecture
useReducer
useCallback
๊ฐ์ ์ ๋ฆฌ
Separation of Concerns
๊ด์ฌ์ฌ๋ฅผ ๋๋๋ ๊ฒ
๋ฆฌ์กํธ ์ฑ์ ๋ง๋ค๋ฉด์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํ๊ณ ์์๋ค.
App
Header
Main
Greeting
Counter
Posts
PostForm
TextField
Footer
App์ TextField๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์๊ณ ์ถ์ง ์๋ค. TextField๋ Posts๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์๊ณ ์ถ์ง ์๋ค.
์๋ก ๊ด์ฌ์ฌ๊ฐ ๋ค๋ฅด๊ณ ๊ธฐ๋ฅ๋ค์ด ๋ค๋ฅด๋ค. ์์ ์์๋ ๊ธฐ๋ฅ์ด ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋๋ด์ง๋ง ์ค๊ณ, ์ํคํ ์ฒ ๊ด์ ์์ ๋๋ ์ ์๋ค.
Layered Architecture๋ ๋ฐฑ์๋์์ ๋ง์ด ์ฐ์ด๋๋ฐ, ํ๋ก ํธ์๋์์๋ ๋๊ฐ์ด ์ ์ฉํ ์ ์๋ค. ๋ ์ด์ด๋ ์ํคํ ์ฒ๋ ์ฌ์ฉ์ ๊ด์ ์์ ๋ฐ๋ผ๋ณธ๋ค.
์ฌ๋ - ์ค์์น(UI) -> ๋ชจํฐ -> ๋ฐํด
๊ฐ๊ฐ์ ํ๋์ ์ญํ ์ ํ๋ค. ์ค์์น๋ ON/OFF๋ง ํ๋ค. ์ด๊ฑธ ๋๋ฅด๋ฉด ON์ด ๋๊ณ , ๋ค์ ๋๋ฅด๋ฉด OFF๊ฐ ๋๋ค. ๋ชจํฐ๊ฐ ์ด๋ป๊ฒ ๋๋์ง๋ ์๊ดํ์ง ์๋๋ค. ๋ณต์ก๋๊ฐ ๋ฎ์์ง๋ค. ๋ชจํฐ๋ ์ ๋ฅ๊ฐ ํ๋ฅด๋ฉด ๋์๊ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๊ฐ์ ๋ค๋ฅธ ๊ด์ฌ์ฌ๋ฅผ ๊ฐ์ง๋ค.
๊ฑฐ๋ํ ํ๋ก๊ทธ๋จ์ด ์๋๋ผ๊ณ ํด๋ Input -> Process -> Output 3๋จ๊ณ๋ก ์ฝ๋๋ฅผ ๊ตฌ๋ถํ๋ฉด, ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๋๋ฐ ํฐ ๋์์ด ๋๋ค. What's your name?
Input
Process -> Hello, [name] => ๋ฉ์์ง
function greeting(name: string) {
return `Hello, ${name}`;
}
Output
ํ๋์ Output์ ๋ค์ ์ฌ์ฉ์์๊ฒ Input์ ์์ฒญํ๊ฒ ๋๋๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ด ์ธ์ดํด์ด ๊ณ์ ๋ฐ๋ณต๋๋ค.
Input: ํ๋ก๊ทธ๋จ ์์
Process: ํ๋ก๊ทธ๋จ ์ด๊ธฐํ
Output: ์ฌ์ฉ์์๊ฒ ์ด๊ธฐ UI ๋ณด์ฌ์ฃผ๊ธฐ
Input: ์ฌ์ฉ์์ ์ ๋ ฅ
Process: ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ์ฒ๋ฆฌ
Output: ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ณด์ฌ์ฃผ๊ธฐ
Input: ์ฌ์ฉ์์ ๋ ๋ค๋ฅธ ์ ๋ ฅ
โฆ๋ฐ๋ณตโฆ
์ด ๊ณผ์ ์ MVC๋ก ๊ฑฐ์น ๊ฒ ๋งคํํ๋ฉด ์๋์ ๊ฐ๋ค. (์ค์ ๋ก๋ ์๋์ง๋ง)
Model -> Process
View -> Output
Controller -> Input
์๋ก ์๊ธฐ๊ฐ ํ๋ ์ผ์๋ง ์ ๊ฒฝ์ ์จ์ ๊ทธ๊ฒ๋ง ์ ํ๋ ค๊ณ ํ๋ค.
Flux Architecture
๋ฆฌ์กํธ๋ฅผ ๋ฐํํ๊ณ ๋ค์ ํด์ ๋ฐํ๋ฅผ ํ๋ค.
MVC์ ๋์์ผ๋ก ๋ด์ธ์ด ์ํคํ
์ฒ๋ค. (์๋ฐํ ๋งํ๋ฉด ์์์์ ์ฒ๋ผ MVC๋ฅผ ์ฌ์ฉํ์ง๋ ์๋๋ค)
View์ ๋ณต์กํ ๊ด๊ณ(์ ํต์ ์ธ MVC์์ ์ด๋ฐ ์ํฉ์ ์ง์ํ๋ค)๋ฅผ ๊ฒจ๋ฅํด ๋ช
ํํ unidirectional data flow
๋ฅผ ๊ฐ์กฐํ๋ค.
Action -> ์ด๋ฒคํธ/๋ฉ์์ง ๊ฐ์ ๊ฐ์ฒด.
Dispatcher -> (์ฌ๋ฌ) Store๋ก Action์ ์ ๋ฌ. ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ ์ฌํ๋ค.
Store (์ฌ๋ฌ ๊ฐ) -> ๋ฐ์ Action์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ณ๊ฒฝ. ์ํ ๋ณ๊ฒฝ์ ์๋ฆผ.
View -> Store์ ์ํ๋ฅผ ๋ฐ์.
Redux๋ ๋จ์ผ Store๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ข ๋ ๋จ์ํ ๊ทธ๋ฆผ์ ์ ์ํ๋ค.
Action
Store -> dispatch๋ฅผ ํตํด Action์ ๋ฐ๊ณ , ์ฌ์ฉ์๊ฐ ์ ์ํ reducer๋ฅผ ํตํด State๋ฅผ ๋ณ๊ฒฝํ๋ค.
View -> State๋ฅผ ๋ฐ์.
๋ถ๋ณ์ฑ์ ์ง์ผ์ ์ ๋ฐ์ดํธํ๋ค.
const state = {
name: 'tester',
};
const nextState = { ...state, name: 'New Name' };
reducer๋ฅผ ํตํด์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ค๋ค. reducer๋ ๋ฆฌ์กํธ์๋ ์๊ด์ด ์๋ ๊ฒ์ด๋ค.
Action์ ์ด๋ป๊ฒ ํํํ๋๋๊ฐ Redux๋ฅผ ์ฌ์ฉํจ์ ์์ด ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ ๋ค. Action Creator๋ ์กด์ฌํ๋๋ฐ, Action์ ๋ง๋ค์ด๋ด๋ Helper ํจ์์ ์ญํ ์ ํ๋ค.
ํ์ง๋ง ์ํ๋ฅผ UI์ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋์ผํ๋ค.
3๋จ๊ณ ํ๋ก์ธ์ค
Input -> Action + Dispatch
Process -> reducer
Output -> View(React)
External Store
๋ฆฌ์กํธ๊ฐ ์๋ ๊ฒ, ๋ฆฌ์กํธ์ ๋ฐ๊นฅ์ธ ๊ฒ. ์ผ๋ฐ์ ์ธ ์ํคํ ์ฒ ๊ด์ ์์ ๋ดค์ ๋ UI๊ฐ ์คํ๋ ค ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ, ์ธ๋ถ์ ๊ฐ๊น๋ค. React๋ ์ฌ์ค ๋ฐ๊นฅ์ชฝ์ ์๋ ๊ฒ.
์ฌ๊ธฐ์ External Store์ ์๋ฏธ๋ ์, ๋ฐ์ ์๋ฏธ๋ผ๊ธฐ ๋ณด๋ค๋ React ๋ด๋ถ์ ์์ง ์๋ค๋ ๊ฒ. (React์ ์ ์ฅ์์)
์ํ๊ฐ ๋ฐ๋๋ฉด ํ๋ฉด์ ๊ทธ๋ ค์ค์ผํ๋๋ฐ, useState ํ ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ํ์ ๋ณํ๊ฐ UI์ ๋ฐ์๋์ง ์๋๋ค.
๋ฐ๋ผ์ useState๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ด ๋ณํํ์์ ๋ UI์ ๋ฐ์ํด์ฃผ๋ ค๋ฉด forceUpdate๋ฅผ ์์ผ์ค์ผ ํ๋ค. class component์์๋ ์กด์ฌํ์ง๋ง, function component์์๋ ์ง์ ๋ง๋ค์ด์ ์ฐ๋ฉด ๋๋ค. useState๋ณด๋ค useReducer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๋ณ๋ค๋ ์๊ฒฌ์ด ์๋ค. react-use PR
React๋ ์ฌ์กฐ์ (Reconciliation) ๊ณผ์ ์ ํตํด ์ํ๊ฐ ๋ฐ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ค. setState๊ฐ ๋ด๋ถ์ ์ผ๋ก useReducer๋ฅผ ์ฌ์ฉํ๋ค.
const [, setState] = useState({});
const forceUpdate = () => setState({});
// Custom Hook
function useForceUpdate() {
const [, setState] = useState({});
return useCallback(() => setState({}), []);
}
useState๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ , ์ผ๋ฐ์ ์ธ ๋ณ์๋ก ๊ด๋ฆฌํ๋ฉด์ forceUpdate๋ฅผ ์์ผ์ฃผ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ธ External Store์ ์์ด๋์ด๋ค. forceUpdate๋ฅผ ์์ผ์ค ๋์ ์ฃผ์ํด์ผ ํ ์ ์ state์ ๋ณํ๊ฐ ์์ด์ผ, ๋ฆฌ์กํธ์์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ด๋ค.
Business Logic๊ณผ UI๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค.
React์์ Business Logic์ ๋ถ๋ฆฌํ๊ฒ ๋๋ฉด, React๋ Business Logic์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์๋์ง ์ ํ์ ์์ด ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ง ํ๋ฉด ๋๊ณ , UI์ ๋ถ๋ฆฌ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ Business Logic์ ํ ์คํธ๋ฅผ ํ๊ธฐ๊ฐ ์ฌ์์ง๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ: ๋ด๊ฐ ์๋น ๊ฐ ๋ญ์ผ ๋ผ๋ ์ ๊ฐ ๋ ์ด์ด๋ณ๋ก ๋ ์ด์ด๊ฐ ๋งก์์ผ ํ๋ ์ญํ ๋ง ํ๋ฉด ๋๋ค.
Business Logic์ ์ฝ๊ฒ ๋ฐ๋์ง ์๋๋ค. UI๋ ์์ฃผ ๋ฐ๋๋๋ฐ UI์ Business Logic์ด ํฌํจ๋์ด ์์ผ๋ฉด ํ ์คํธ ์ฝ๋๊ฐ ์ฝ๊ฒ ํฐ์ง๋ค.
Last updated