1. ๋ฆฌ์กํธ๋ฅผ ์ ์ฌ์ฉํ๋ ๊ฑธ๊น?
๋ฐ๋ก ์ ์ ์ธํฐ๋์ (์ํ ๋ณํ) ์ฒ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํด์์ ๋๋ค.
"DOM ์์ ๋ณํ๋ฅผ ์ด๋ป๊ฒ ์ ์ฉํ ๊ฒ์ธ๊ฐ ๐ง"
์ด์ ๋ฐฉ์
- JS๋ฅผ ์ฌ์ฉํด์ HTML๋ก ๊ตฌ์ฑ๋ UI ์ ์ด
- ๋ธ๋ผ์ฐ์ ์ DOM Selector API ๋ฅผ ์ฌ์ฉํด์ ํน์ DOM ์ ์ ํํ๋ค, ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ณํ๋ฅผ ์ค
- ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ด๋ฆฌ ํ๋ฆ. ๋ฐ์ดํฐ / ๋ ์ด์์ ๋ ์ด์ด ๊ตฌ๋ถ ์ด๋ ค์์ง
- ๋ช ๋ นํ ์ ๊ทผ๋ฐฉ์์ ์ฝ๋ ์ฌํ์ฉ์ด ์ด๋ ค์ ⇒ ๋ฆฌ์กํธ๋ ์ฝ๋๋ฅผ ์์ ์ปดํฌ๋ํธ๋ค๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ์ ์ง๋ณด์์ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํจ(์ ์ธํ ๋ฐฉ์)
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ VS ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ๋น๊ต๋ฅผ ์ด๋์ ๊ฐ ํ ๋ฒ์ฏค์ ์ ํด๋ดค์ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋์ด ์ค์ ๋ก ๋ฌด์์ ์๋ฏธํ๋์ง ๊ฒ์์ ํด๋ณด์ จ๋ค๋ฉด ์๋ง ์๋์ ๊ฐ์ ์ ์๋ฅผ
boxfoxs.tistory.com
- Virtual DOM๊ณผ ์ค์ DOM ๋น๊ตํด์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ค์ ๋์ ๋ฐ์ํ๋ค.
- Virtual DOM์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์์ผ๋ก ์กด์ฌํ๋ ๋์ผ๋ก์จ, js๊ฐ์ฒด๋ผ ์ค์ ๋ธ๋ผ์ฐ์ ๋์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ
2. JSX
- syntactic sugar ์ผ์ข / xmlํํ๋ก ์ ์ธ ์ BABEL์ ํตํด JS๋ก ๋ณํ๋จ
Babel · Babel
The compiler for next generation JavaScript
babeljs.io
React.createElement(
type, // ํ๊ทธ ์ด๋ฆ ๋ฌธ์์ด | ๋ฆฌ์กํธ ์ปดํฌ๋ํธ | React.Fragment
[props], // ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๋ฃ์ด์ฃผ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด
[ ... children] // ์์์ผ๋ก ๋ฃ์ด์ฃผ๋ ์์๋ค
);
3. SPA
- ์น ์ฑ์ ํ์ํ ๋ชจ๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฑ์ด ์ฒ์ ๋ก๋ฉ๋ ๋ ๋ค์ด๋ก๋
- ํ์ด์ง ๊ฐ ์ด๋ ์, ํ์ด์ง ๊ฐฑ์ ์ ํ์ํ ๋ฐ์ดํฐ๋ง์ JSON์ผ๋ก ์ ๋ฌ๋ฐ์ ํ์ด์ง๋ฅผ ๊ฐฑ์ (์๋ก๊ณ ์นจ X)
- ⇒ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต
๋จ์ : ์ด๊ธฐ ๊ตฌ๋์๋๊ฐ ๋๋ฆฌ๋ค. SEO ๋ฌธ์
๐ก Hydration
- ์ฒซ ํ์ด์ง๋ SSR๋ฐฉ์์ผ๋ก HTML ์ ์ก
- ๋ธ๋ผ์ฐ์ ์์ JS ๋ค์ด๋ฐ๊ณ React ์คํ
- ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ ์, CSRํ๋ ๋ฐฉ์.
#CSR #SSR #react-helmet #Next.js #Hydration#CSR #SSR #react-helmet #Next.js #Hydration
๋ฆฌ์กํธ์ hydration์ด๋?
hydration = ์ํ ์ํ๋ ์ฐ๋ฆฌ ๋ชธ์ ์๋ถ์ ๋ณด์ถฉํ๋ ํ์๋ฅผ ๋ปํ๋ค. ๋ฆฌ์กํธ์์ ์ hydration์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋๊ฑด์ง๋ ์๋ ๋ด์ฉ์ ์ดํด๋ณด๊ณ ๋ค์ ํ๋ฒ ์๊ฐํด๋ณด์. ๋ฆฌ์กํธ๋ DOM์ ๋ฆฌ์กํธ ์ปดํฌ
simsimjae.tistory.com
4. React ์ํ๊ด๋ฆฌ์ Side Effect
โ useState
์ const ์์๋ก ํ ๋นํ ๊น?
const [title, setTitle] = useState(title);
- ์ํ๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค ๋จ์๋ก (๋ ๋ฆฝ์ ์ผ๋ก) ์์ฑ๋๋ค.
- ์ปดํฌ๋ํธ ํจ์ ์ฌ์คํ๋๋ฉด useStateํจ์๋ ์ฌ์คํํ๋๋ฐ, ์ด๊ธฐ๊ฐ์ ์ฒ์ ํธ์ถ๋์ ๋๋ง ์ฌ์ฉ๋๊ณ ๊ทธ ์ดํ ์ฌ์คํ๋ ๋๋ ์ํ๋ฅผ ์ฌ ์ด๊ธฐํํ์ง ์์. ๋์ ์ํ๊ฐ์ ์ถ์ ํด์ ์ต์ ์ํ๋ฅผ ์ ๊ณต
- ์ปดํฌ๋ํธ ํจ์๊ฐ ์ฌ์คํ๋๋ฉด ์ํ๊ฐ์ ์๋ก์ด snapshot์ ์ป๊ฒ ๋จ.
- ํจ์ ์ปดํฌ๋ํธ๋ด์ ์ง์ setterํจ์ ์ฌ์ฉํ๋ฉด ์๋จ!
- state๋ ๊ผญ setterํจ์ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ ๊ฒ.
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ์ด์ ๊ฐ๊ณผ ๋ฐ๋ ๊ฐ์ ํ์ธํ ๋ ์ผ์ผํ ๊ฐ์ ๋น๊ตํ๋ ๊ฒ ์๋๋ผ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด ์๋ก์ด ๊ฐ์ฒด ์์ฑ ํ ๋ณ๊ฒฝํ๋ ์์ ์ ํจ.
- ๊ทธ๋ฅ ๋ณ์๊ฐ์ ๋ฐ๊พธ๊ณ setter์ ์ง์ด๋ฃ์ ๊ฒฝ์ฐ, state์ ๊ฐ์ ๋ฐ๋์ด๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ ์ฌ์ ํ ๋ฐ๋์ง ์์๊ณ , setState์ ๋ฃ์ด์ฃผ๋ state์ ์ฐธ์กฐ๊ฐ๋ ์ด์ ์ ์ฐธ์กฐ ๊ฐ๊ณผ ๋์ผํ๋ค
โ Context API์ Redux
๐ก Props Drilling
1) Context API
- Context.Provider๋ value๋ก ์ ์ฅ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด useContext(Context)๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ๊ฐ์ด ๋ ๋๋ง์ ํ๋ค.
2) Redux
- ์ํ๋ฅผ ์ ์ฅํ๋ store๋ฅผ ๋ฐ๋ก ์ค์
- thunk, sage์ ๊ฐ์ ๋ฏธ๋ค์จ์ด
- boilerplate code & ๋์ ๋ฌ๋ ์ปค๋ธ
#react-query #recoil #mobx
Side Effect๋?
๋ฆฌ์กํธ์ ์๋ฌด๋ ๊ฒฐ๊ตญ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ผ UI๋ฅผ ๋ ๋๋งํ๋ ๊ฒ. ์ฌ์ด๋ ์ดํํธ๋ ์ด๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ฅผ ์๋ฏธํจ
Ex) http request, ๋ก์ปฌ์ ์ฅ์์ ์ ์ฅ, ์ค๋ฅ ์ฒ๋ฆฌ …
- ๋ฆฌ์กํธ๋ state๋ฑ์ด ๋ณํํ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง. ๊ทธ๋๋ง๋ค ์๋ต์ ๋ณด๋ธ๋ค๋ฉด => ๐ฒ ∞์ด๋ฌํ ์์ ๋ค์ useEffect๋ก ๊ด๋ฆฌ
- ์ง์ ์ปดํฌ๋ํธ ํจ์์ ๋ค์ด๊ฐ๋๊ฑด ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ๋์.
useEffect๋?
5. React ์ต์ ํ
1. useMemo - ์ด์ ๊ฐ ์ฌ์ฌ์ฉ
ํน์ ๊ฐ์ด ๋ฐ๋์์ ๋๋ง ํน์ ํจ์๋ฅผ ํธ์ถํด์ ์ฐ์ฐ ์คํ.
์) ํ์ฑ ์ฌ์ฉ์์๋ฅผ ์ธ๋ ํจ์๊ฐ ์์ ๋, ์๊ด์๋ ์ธํ๊ฐ์ด ๋ฐ๋ ๋๋ ํจ์๊ฐ ์คํ๋จ → ์ํ๋๊ฐ(ํ์ฑ ์ฌ์ฉ์ ์)์ด ๋ฐ๋ ๊ฒ ์๋๋ผ๋ฉด ๋ฆฌ๋ ๋๋งํ ๋ ์ด์ ์ ์ ์ฅํ๋ ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ
const count = useMemo(()=>{ํธ์ถํ ํจ์},[์์กด๋ฐฐ์ด])
//์์กด ๋ฐฐ์ด์ ์ํ๋ ๊ฐ ๋ฃ์ด์ค(countํ ๊ฐ์ฒด)
2. useCallback - ํจ์ ์ฌ์ฌ์ฉ
๋งค๋ฒ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก์ด ํจ์ ๋ง๋ฆ → ์ํ๋ ๊ฐ์ด ๋ฐ๋๋๋ง ์๋ก ๋ง๋ค์ด์ง ๊ทธ๋ ์ง์์ผ๋ฉด ๊ธฐ์กด ํจ์ ์ฌ์ฌ์ฉ
//ํจ์๋ฅผ useCallback์ผ๋ก ๊ฐ์ธ์ค
const onChange = useCallback(()=>{
const {name,value} = e.target;
setInputs({
...inputs,
[name]:value
});
},[inputs]); //inputs ๊ฐ์ด ๋ฐ๋ ๋๋ง ์๋ก ๋ง๋ค์ด์ง
- depth ๋ฐฐ์ด์ ์ ์ด์ฃผ์ง ์์ผ๋ฉด ๊ฐ์ฅ ์ต์ ์ํ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ ์๋๋ผ ์ด์ ์, mounted๋ ๋ ์ํ ์ฐธ์กฐํ๊ฒ ๋จ ⇒ depth๋ฐฐ์ด์ []๋ก ์์ฑํ ๊ฒฝ์ฐ, mounted๋ ์ํ๋ฅผ ๊ณ์ ์ฌ์ฌ์ฉํ๊ฒ๋๋ค.(ํจ์๊ฐ ์๋ก๋ง๋ค์ด์ง๊ณ ์ต์ ์ํ ์ฐธ์กฐํ์ง ์์. ์ฐธ์กฐํ ๊ฐ์ด ์์ ๋ ๋น๋ฐฐ์ด๋ก ์์ฑ)
3. useReducer - useState๋ณด๋ค ๋ณต์กํ ์ํ๊ด๋ฆฌ
useState๋ณด๋ค ์จ์ผํ๋ ์ฝ๋๊ฐ ๋ง์ง๋ง, ์ํ๊ด๋ฆฌ๋ฅผ ํด์ผํ ๋ณ์๊ฐ ๋ง๋ค๋ฉด useReducer๋ฅผ ๊ณ ๋ ค
//1. ์ด๊ธฐ๊ฐ ์์ฑ
const initialUserState = {
isAdmin: false,
nickname:'',
email: ''
}
//2. Reducer ์์ฑ
const userReducer = (state, action) => {
switch (action.type) {//action type์ ๋ฐ๋ผ ๋ค๋ฅธ ์
๋ฐ์ดํธ ์งํ
case 'reset' : {
return initialUserState;
}
case 'toggleToBeAdmin': {
return {...state, isAdmin:!state.isAdmin}
}
...
}
}
//3. ์ปดํฌ๋ํธ ๋ด์์ Reducerํจ์ ์คํ
const User = () => {
const [user, dispatchUser] = useReducer(userReducer, initialUserState)
// useReducer(reducerํจ์, ์ด๊ธฐ๊ฐ) => useState์ฒ๋ผ state, setStateํจ์๋ฅผ return
const reset = () => dispatchUser({type:'reset'}) //dispatch ํจ์์ type์ ์ธ์๋ก
const toggleTobeAdmin = () => dispatchUser({ type: 'toggleToBeAdmin' })
const updateNickname = event => dispatchUser({ type: 'updateNickname', nickname: event.target.value })
...
}
๋ฆฌ์กํธ๋ ์๋ฒฝํ ํ๋ ์์ํฌ์ผ๊น? ๐ง
๊ด์ฌ๋ & ๋ง์กฑ๋ 1์ ์ค๋ฒจํธ https://2020.stateofjs.com/en-US/technologies/front-end-frameworks/
- ์ค๋ฒจํธ๋ ๊ฐ์๋์ ์ฌ์ฉํ์ง ์์ ์ด์ ์ค๋ ์ท์ ๋น๊ตํ๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ง ์์.
- ๋น๋๊ณผ์ ์์ ๋ณ๋์ ์ ๋ฐ์ดํธ ๋ก์ง ์คํ