1. FLUX๋
2. ๋ฆฌ๋์ค๋
3. React์์ state ๋ถ๋ณ์ฑ
4. ๋ฆฌ๋์ ๋ด๋ถ์ ๋ถ๋ณ์ฑ๊ณผ ...์ฐ์ฐ์์ ๋จ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
5. side effect ๋ฌธ์ ์
1. FLUX ๋ โญ๏ธโญ๏ธ
- FLUX๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๊ฐ ์๋ ์ถ์์ ์ธ ๊ฐ๋ ์
- MVC ํจํด์์ ์๋ฐฉํฅ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์กฐํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ FLUX ํจํด์์๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์กฐํจ
- MVC ํจํด
- ์ฌ์ฉ์์ ์ด๋ ํ ํ์(์ก์ )๊ฐ ์์ ๋, ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ค๊ณ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ๋ชจ๋ธ์ ๋ณํํ๊ณ ์ด๋ฅผ ๋ทฐ์ ๋ฐ์ํจ
- ๋ณด์ฌ์ ธ์ผ ํ ๋ทฐ๊ฐ ์ ๊ฑฐ๋, ๋ณ๊ฒฝ๋ ๋ชจ๋ธ์ด ๋ง์ง ์๋ค๋ฉด ๋งค์ฐ ํจ์จ์ ์ธ ๊ตฌ์กฐ์
- ํ์ง๋ง, ๋ชจ๋ธ๊ณผ ๋ทฐ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ ์๋ค๋ฉด ์ด๋ค ๋ชจ๋ธ์ด ๋ณํ๋์ด ๋ทฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ์ ๋๋ก ํ์ธํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๊น
- FLUX ํจํด
- MVC ํจํด์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ดํ๋ ํจํด
- ๋จ๋ฐฉํ์ ๋ฐ์ดํฐ ํ๋ฆ ๊ตฌ์กฐ๋ฅผ ํตํด ์ด๋ค ์ก์ ์ด ๋์คํจ์ฒ์ ์ํด ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ณ ๋ณํ๋๋์ง ๋ช ํํ ํ์ ํ๊ณ ์์๋ณผ ์ ์์
- ์ฌ์ฉ์์ ํ์(์ก์ )์ ๋์คํจ์ฒ์ ์ํด ํต์ ๋จ
- ๋์คํจ์ฒ๊ฐ ์คํ ์ด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ณ๊ฒฝ๋ ์คํ ์ด์ ๋ํ ๋ทฐ๋ฅผ ๋ฆฌ๋ ๋๋งํจ
- ๋ทฐ์์๋ ์คํ ์ด์ ์ง์ ์ ๊ทผํ์ง ์์ผ๋ฉฐ, ๋์คํจ์ฒ๋ก ๋ค์ ์ก์ ์ ๋ณด๋ด๊ณ ์คํ ์ด๋ฅผ ์ ๋ฐ์ดํธํ ๋ค, ๋ค์ ๋ทฐ๋ฅผ ๋ฆฌ๋ ๋๋ง
2. ๋ฆฌ๋์ค๋ โญ๏ธโญ๏ธ
- ๋ฆฌ๋์ค(Redux)
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก ์ฌ๋ฌ ๊ฐ์ง ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ
- Store(์คํ ์ด)๋ผ๋ ๋ณ์๋ฅผ ์ด์ฉํด ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๊ฒ ๋จ
- ์ ์ญ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ props <-> state๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก, ์์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ด๋ ค์ฃผ์ง ์์๋ ์ฌ์ฉํ ์ ์์
- ๋ฆฌ๋์ค์ ๊ธฐ๋ณธ ์์น
- ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ญ ์ํ๋ ๋จ์ผ ์ ์ฅ์ ๋ด์ ํธ๋ฆฌ์ ์ ์ฅ๋จ
- ์ํ(state)๋ ์ฝ๊ธฐ ์ ์ฉ์
- ์์ ํจ์(๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ์๋ ํจ์)์ ์ํด์ ๋ณ๊ฒฝ๋์ด์ผ ํจ
3. React์์ state์ ๋ถ๋ณ์ฑ ์ ์ง โญ๏ธ
- ๊ฐ์ฒด๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ด ์๋ ์ฐธ์กฐ ๊ฐ์ ๊ฐ์ง
- ๋ฐ๋ผ์ ๋ณต์ฌํ์ฌ ๋์ผํ ์ฐธ์กฐ ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ฒด ์ค ํ๋๋ผ๋ ๋ณ๊ฒฝ๋๋ค๋ฉด, ๋ชจ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ์
- `...(spread) ์ฐ์ฐ์`๋ฅผ ํตํด ๋ณต์ฌํ ๊ฒฝ์ฐ A์ B๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋น ๋ฐ์ ์ํ๋จ
- ๋ฐ๋ผ์ A์ B ๋ด๋ถ์ ๊ฐ์ ๊ฐ๋๋ผ๋(๊ฐ์ ๋ณด์ด๋๋ผ๋) ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ ์ ์์
- ์ด๋ฏธ ๋ณต์ฌ๋ฅผ ํ ํ๋ฆฐํธ๋ฌผ์ A ์ธ์๋ฌผ์ ๋์๋ฅผ ํ๋๋ผ๋ B ์ธ์๋ฌผ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ๊ณผ ๊ฐ์
- ๋ฆฌ์กํธ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ๊ฐ์ฒด ํ์ ๋๋ ๋ฐฐ์ด ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ๋ค๋ฃจ๊ฒ ๋๋๋ฐ, ์๋ณธ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์๋ํ ๋์๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์์ผ๋ฉฐ, ์ด๋ค ํจ์์ ์ํด ๋ถ์ ํจ๊ณผ(side effect)๊ฐ ๋ฐ์ํ๋์ง ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์
4. ๋ฆฌ๋์ ๋ด๋ถ์์ ๋ถ๋ณ์ฑ & ์ ๊ฐ(spread) ์ฐ์ฐ์์ ๋จ์ ํด๊ฒฐ ๋ฐฉ๋ฒ โญ๏ธ
- ์ปดํฌ๋ํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ด ๋ค ๊ฐ์ง ๊ฒฝ์ฐ์ ์
๋ฐ์ดํธํจ
- props๊ฐ ๋ฐ๋ ๋
- state๊ฐ ๋ฐ๋ ๋
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋
- this.forceUpdate๋ก ๊ฐ์ ๋ก ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ ๋
- ๋ฆฌ๋์์ initial state์๋ ์๋ฒ์์ ๋๊ฒจ๋ฐ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ ์ญ์ผ๋ก ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ ์ฅ์ ์ญํ ์ ํจ
- Q) ๋ฆฌ๋์ ๋ด๋ถ์์ ๋ถ๋ณ์ฑ์ ์งํค๋ ์ด์ ?
- A) ๋ถ๋ณ์ฑ์ ์งํด์ผ๋ก์จ ๊ฐ๊ฐ์ ๊ณ ์ ํ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ ์ฌ์ฉํจ์ผ๋ก์จ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋์ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค๋ฉด ์๊ธธ ์ ์๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง๊ณผ ๋ถ์ํจ๊ณผ๋ฅผ ์ค์ผ ์ ์์
- ํ์ง๋ง `...(spread) ์ฐ์ฐ์`๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ๊น์ด์ ๋ฐ๋ผ, ๋ก์ง ๊ตฌ์ฑ์ด ๋งค์ฐ ์ด๋ ค์ธ ์ ์์
- Q) `...(spread) ์ฐ์ฐ์`์ ๋จ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์?
- A) immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ, produce, drafe ๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ณธ์ `...(spread) ์ฐ์ฐ์`๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ถ๋ณ์ฑ์ ์ ์งํด์ฃผ๋ฉฐ ๋ถํ์ํ ๋ถ์ํจ๊ณผ(side effect)๋ฅผ ๋ง์์ค
/* ๊ธฐ์กด์ ...(spread)์ฐ์ฐ์ ์ฌ์ฉ */
const nextState = {
...state,
posts: state.posts.map((post) =>
post.id === 1
? {
...post,
comments: post.comments.concat({
id: 3,
text: '์๋ก์ด ๋๊ธ',
}),
}
: post
),
};
/* immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ */
const nextState = produce(state, (draft) => {
const post = draft.posts.find((post) => post.id === 1);
post.comments.push({
id: 3,
text: '์ ์ ๋ง ์ฝ๋ค!',
});
});
5. ๋ฆฌ์กํธ ์ฌ์ฉ์ ๋ถ์ํจ๊ณผ(side effect)๋ก ์ธํด ์๊ธฐ๋ ๋ฌธ์ ์ โญ๏ธโญ๏ธ
- ๋ถ์ํจ๊ณผ
- ํจ์๊ฐ ๋ง๋ค์ด์ง ๋ชฉ์ ๊ณผ๋ ๋ค๋ฅธ ํจ๊ณผ ๋๋ ๋ถ์์ฉ
- ๋ถ์ํจ๊ณผ๋ฅผ ์ผ์ผํค๋ ํจ์(๋ถ์ํจ์)
/* ์ฝ๋ ์ฐธ์กฐ (https://maxkim-j.github.io/posts/js-pure-function) */
// http ์์ฒญ์ ๋ณด๋ด๋ ํจ์ : ์์ํจ์ ๋ ์ ์์
const getData = () => {
axios.get('http://data.url')
.then(...)
.catch(...)
}
// ์
๋ ฅ ๋ดํฌํ ํจ์ : ์์ํจ์ ๋ ์ ์์
const typeInput = () => {
const input = prompt("Message");
return input;
}
// ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ ํจ์ : ์์ํจ์ ๋ ์ ์์
const changeParams = (arr, elem) => {
arr.push(elem);
return arr;
}
- ๋ถ์ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ์๋ ํจ์(์์ ํจ์)
/* ์ฝ๋ ์ฐธ์กฐ (https://maxkim-j.github.io/posts/js-pure-function) */
const num_arr = [1, 2, 3, 4, 5];
// ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๋ ๋ถ์ํจ์
const addSixImpure = (arr) => {
// ๋งค๊ฐ๋ณ์์ ์ง์ 6 ์ถ๊ฐ
arr.push(6);
return arr;
};
// ๋งค๊ฐ๋ณ์๋ฅผ ๋ณต์ฌํ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์ํจ์
const addSixPure = (arr) => {
// ํผ์นจ ์ฐ์ฐ์๋ก ์๋ก์ด ๋ฐฐ์ด์ 6 ์ถ๊ฐ
newArr = [...arr, 6];
return newArr;
};
// ๋งค๊ฐ๋ณ์ arr์ 6์ด ์๋์ง ํ์ธํ๋ ํจ์
const hasSix = (arr) => {
if (arr.includes(6)) {
return true;
} else {
return false;
}
};
const new_arr = addSixImpure(num_arr);
console.log(hasSix(num_arr)); // true
- addSixPure()๊ณผaddSixInpure()๋ ์ธ๋ป ๋ณด๋ฉด ๋ณ ์ฐจ์ด๊ฐ ์์ด ๋ณด์ด์ง๋ง addSixInpure()๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๋ ๋ถ์ํจ์์ด๊ณ , addSixPure()๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ณต์ฌํด์ ๋ณ๊ฒฝํ๋ ์์ํจ์์
- addSixInpure()๋ num_arr์ ์ง์ ๋ฐ๊ฟจ๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ์คํ๋๋ฉด num_arr์ ๊ฐ์ด [1,2,3,4,5,6]์ผ๋ก ์๊ตฌํ ๋ฐ๋. ๊ทธ๋์ hasSix()ํจ์์ ๊ฒฐ๊ณผ๋ก๋ true๋ฅผ ๋ฐํํ๊ฒ ๋๋ ๊ฒ
- ํ์ง๋ง ๊ฐ๋ฐ์์ ์๋๊ฐ ๋ณ์ new_arr์ addSix ํจ์๋ฅผ ํธ์ถํ ์๋ก์ด ๋ฐฐ์ด์ ํ ๋นํ๊ณ ๋ ํ, ๊ฐ์ด [1,2,3,4,5]์ธ num_arr์ ๋ํด์ 6์ด ์๋์ง ํ๋จํ๊ณ ์ถ์๋ ๊ฑฐ์๋ค๋ฉด ์ฝ๋๋ ์๋๋๋ก ์คํ๋์ง ์์์
- addSixInpure()๋ num_arr์ ์ง์ ๋ฐ๊ฟจ๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ์คํ๋๋ฉด num_arr์ ๊ฐ์ด [1,2,3,4,5,6]์ผ๋ก ์๊ตฌํ ๋ฐ๋. ๊ทธ๋์ hasSix()ํจ์์ ๊ฒฐ๊ณผ๋ก๋ true๋ฅผ ๋ฐํํ๊ฒ ๋๋ ๊ฒ
- ์์ฝ!
- react state๋ ์ง์ ์กฐ์์ ํผํ๋ ๋ฐฉ์์ผ๋ก ๋ถ์ํจ๊ณผ๋ฅผ ๋ฐฉ์งํจ(state, props๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฆฌ๋ ๋๋ง์ด ๋๊ธฐ ๋๋ฌธ์ ์๋์น ์๊ฒ ๋ถ์ํจ๊ณผ๋ฅผ ๊ฐ์ง ํจ์๋ค๋ก ์ธํด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ฆ์์ง ์ ์์)
- Redux์ reducer๋ ์์ํจ์์ฌ์ผ๋ง ํ๋๋ฐ, store๊ฐ์ ๋ณ๊ฒฝํ๋ ํจ์๊ฐ ๋ถ์ํจ๊ณผ๋ฅผ ๋๋ฐํ์ง ์์์ผ store ๋ด๋ถ์ ๊ฐ๋ค์ด ์์ ํ๊ฒ ๋ณดํธ๋ ์ ์๊ธฐ ๋๋ฌธ
'Frontend ๐ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] useLayoutEffect, ์ด๋ฒคํธ ํธ๋ค๋ง etc. (1) | 2024.07.05 |
---|---|
[React] ์ปดํฌ๋ํธ ๋ผ์ดํ ์ฌ์ดํด, Hooks etc. (1) | 2024.07.04 |
[React] ํจ์ ์ปจํฌ๋ํธ, props, state etc. (1) | 2024.06.27 |
[React] virtual DOM, react fiber etc. (0) | 2024.06.27 |
๋ฌผํ๋์ฌ ์๋น์ค ๊ฐ์ธํ๋ก์ ํธ (0) | 2024.06.19 |