side effect๋ฅผ ๋ฒ์ญํ์๋ฉด ๋ถ์์ฉ ์ ๋๋ก ๋ฒ์ญ์ด ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์์์ ๋ถ์์ฉ์ ์ฝ๋๊ฐ ์๋ํ ์ฃผ๋ ํจ๊ณผ ์ธ์ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ํจ๊ณผ๋ผ๊ณ ํ ์ ์๋ค.
ํนํ, ํ๋ก๊ทธ๋จ์ ์ด๋ฃจ๋ ๊ฐ์ฅ ์์ ๋จ์์ธ ํจ์์์ ์ฐ์ด๋ ์ฉ์ด์ด๋ค.
ํ๋ก๊ทธ๋๋ฐ์์ ํจ์์ ์ฃผ๋ ๋ชฉ์ ์ Input์ ๋ฐ์์ output์ ์ฐ์ถํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ํจ์์ ๋ถ์์ฉ์ด๋ ํจ์์ ๋ชฉ์ ์ธ Input์ ๋ฐ์์ output์ ์ฐ์ถํ๋ ๊ฒ ์ด์ธ์ ๋ชจ๋ ํ์๋ฅผ ์๋ฏธํ๋ค.
์ ๋ฆฌํ์๋ฉด,
ํ๋ก๊ทธ๋๋ฐ์์ side effect๋ ํจ์๊ฐ input์ ๋ฐ์์ output์ ์ฐ์ถํ๋ ๊ณผ์ ์์,
1. ์ธ๋ถ์ ๊ฐ์ ์ฝ์ด์ค๋ ํ์
2. ์ธ๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ํ์ ๋ฅผ ์๋ฏธํ๋ค.
const sum = (x) => {
return x + 1;
};
์์ ์์์์ sum ํจ์๋ x๋ผ๋ input์ ๋ฐ์์ x+1์ด๋ผ๋ Output์ ์ฐ์ถํ๋ ํจ์์ด๋ค.
์ด ํจ์๋ input์ ๋ฐ์์ output์ ๋ด๋ ํ์ ์ธ์ ๋ค๋ฅธ ํ์๋ฅผ ํ์ง ์์ผ๋ฏ๋ก sice effect๊ฐ ์๋ค๊ณ ํ ์ ์๋ค.
์ด์ฒ๋ผ side effect๊ฐ ์๋ ํจ์๋ฅผ ์์ ํจ์๋ผ๊ณ ํ๋ค.
let num;
const sum = (x) => {
num = x+1;
};
์์ ์ฝ๋๋ ๋ณ์ num์ด ์๊ณ , sum ํจ์๋ x๋ฅผ ์ธ์๋ก ๋ฐ์์ num์ x+1์ ํ ๋นํ๋ค.
์ด ํจ์๋ ํจ์๊ฐ ์ธ๋ถ์ ๊ฐ์ธ num์ ๋ณ๊ฒฝ์ํค๊ณ ์๊ธฐ ๋๋ฌธ์ side effect๋ฅผ ๋ฐ์์ํจ๋ค.
const printNum = (x) => {
console.log(x);
};
const changeTitle = (newTitle) => {
const title = document.getElementById('title');
title.innerText = newTitle;
};
์ ๋๊ฐ์ง ์ฝ๋๋ค๋ ๋ชจ๋ side effect๋ฅผ ๋ฐ์์ํจ๋ค.
DOM์ ์กฐ์ํ๊ณ , console์ ํน์ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ ํ์ ๋ํ ํจ์ ์ธ๋ถ์ ์กด์ฌํ๋ DOM๊ณผ console์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๊ฒ์ด๊ธฐ์ side effect๊ฐ ๋ฐ์ํ๋ค๊ณ ํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ํ๋ก๊ทธ๋๋ฐ์์ side effect๋ ๊ธฐํผํด์ผ ํ๋ ๋์์ผ๊น ? ์ ๋ต์ ๊ทธ๋ ๋ค ์ด๋ค.
side effect๊ฐ ์๋ ํจ์๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๊ธฐ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค
const sum = x => x+1์ด๋ ํจ์๋ ํญ์ 1์ ์ธ์๋ก ๋ฃ์ผ๋ฉด 2๊ฐ return ๋ ๊ฒ์ด๋ผ ์์ธกํ ์ ์์ง๋ง const sum = x => x+num์ด๋ ํจ์๋ num ๊ฐ์ด ์ด๋ป๊ฒ ๋ณํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
๋ฐ๋ผ์, ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ฉด์ ์ด๋ฌํ side effect๋ค์ ์ ์ฌ์ ์์ ์ฌ์ฉํ๊ณ , ๊ด๋ฆฌํ๋ฉด์ ์์ธก ๊ฐ๋ฅํ๊ณ ์ ์ง ๋ณด์ํ๊ธฐ ์ฉ์ดํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์ ํด์ผํ๋ค.
React์์ rendering์ด๋ state, props๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI ์์๋ฅผ ๊ทธ๋ ค๋ด๋ ํ์์ด๋ค.
ํจ์ ์ปดํฌ๋ํธ๋ state์ props๋ฅผ ํตํด์ JSX๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ด ๋ณธ์ง์ ์ธ ์ญํ ์ด๋ค.
๋ฐ๋ผ์, ํจ์ ์ปดํฌ๋ํธ์ input์ state, props์ด๋ฉฐ output์ JSX์ด๋ค.
UI๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ณผ์ ์์ ๋ฐ์์์ผ์ผ ํ๋ side effect์ ๋ํ์ ์ธ ์ฌ๋ก๋ค์ ๋ํด ์์๋ณด์.
Data Fetching
ํ๋ ๊ฐ๋ฐ์์ ํ๋ก ํธ์๋๋ ๋ณต์กํ UI๋ฅผ ๋ณํ์ํค๋ ๋ฐ์ ์ด์ ์ ๋๊ณ ์๊ณ , ๋ฐฑ์๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๊ณ ๊ฐ๊ณตํ๋ ์ญํ ์ ๋งก๊ณ ์๋ค.
์ด๋ฐ ๊ตฌ์กฐ ์์์ ใ
๋ก ํธ์๋๊ฐ ๋ฐฑ์๋ API๋ฅผ ํตํด ๊ธฐ์กด์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํ์๋ ํ์์ ์ผ๋ก ๋ฐ์ํ๊ฒ ๋๋ค.
DOM ์ ๊ทผ ๋ฐ ์กฐ์
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก์ ์น ๊ฐ๋ฐ์ ํ๋ ์ด์ DOM์ ์ ๊ทผํ๊ณ ์กฐ์ํ๋ ํ์๋ ํ์์ ์ด๋ค.
๋ฌผ๋ก React๋ DOM์ ์ง์ ์ ๊ทผํ ์ผ์ด ๋ง์ง๋ ์๊ณ ๋๋ถ๋ถ์ ์ํฉ์์ ๊ถ์ฅ๋์ง ์์ง๋ง ํน์ ์ํฉ์์๋ DOM์ ์ ๊ทผํ๊ณ ์ง์ ์กฐ์์ ํด์ผํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค,
๊ตฌ๋
(Subscribe)
ํ๋ก๊ทธ๋๋ฐ์์ ๊ตฌ๋
์ด๋ ์ด๋ค ๊ฒ์ ๋ณํ๋ฅผ ์ง์ผ๋ณด๋ค๊ฐ ๋ณํ๊ฐ ๋ฐ์ํ๋ฉด ํน์ ํ ์ก์
์ ์ทจํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ฐ๋ฐ์์ ๊ตฌ๋
์ด๋ ๊ฐ๋
์ ์ด์ฉํด์ ์ฌ๋ฌ ๊ฐ์ง ๋์์ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์น ๊ฐ๋ฐ์์ ํํ ๊ตฌ๋
ํ๋ ๊ฒ์ ์๊ฐ์ด๋ค.
์๊ฐ์ ๊ณ์ํด์ ํ๋ฅด๊ณ ์๋ค. ๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๊ฐ์ ๊ตฌ๋
ํ๋ฉด์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ํน์ ๋์์ ์ํํด ์ฃผ๋ ๋ฉ์๋์ธ setTimeout, ์ผ์ ์๊ฐ๋ง๋ค ํน์ ๋์์ ์ํํด์ฃผ๋ setInterval๋ฉ์๋๋ฅผ ์ ๊ณตํด์ฃผ๊ณ ์ด๋ฅผ ์ด์ฉํด์ ์๊ฐ์ ๋ณํ์ ๋ฐ๋ผ ์ํ๋ ๋์์ ์ดํ์ํฌ ์ ์๋ค.