3. React Hook
keyword
React Hook ์ด๋
Hooks
useState
useEffect
useContext
useRef
useLayoutEffect
React StrictMode ๋
1. React Hook?
React Hooks๋ ๋ฒ์ 16.8์ ๋์ ๋ API๋ก ํด๋์ค ์ปดํฌ๋ํธ๋ง ๊ฐ๋ฅํ๋ ์ํ๊ด๋ฆฌ๊ฐ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ๊ฐ๋ฅํ๋ฉฐ, ์ฝ๋๋ฅผ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ํจ๋ฌ๋ค์์ ์ ๊ณตํ๋ค.
๊ธฐ์กด ๋ฐฉ์์ ๋ฌธ์ ์
Wrapper Hell (HoC) -> ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ ์ค์ฒฉ์ผ๋ก ๋ฐ์ํ๋ ์ฝ๋์ ๋ณต์ก์ฑ
Huge Components -> ํฌ๊ธฐ๊ฐ ํฐ ๋ณต์กํ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ปดํฌ๋ํธ
Confusing Classes -> ํด๋์ค์ ๋ฉ์๋, ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋, ์ํ ๊ด๋ฆฌ ๋ฑ์ด ์์ฌ ํผ๋ ์ผ๊ธฐ (ex. this ๋ฐ์ธ๋ฉ)
React Hooks์ ๋์
Functional Component๋ง ์ฌ์ฉ -> ํจ์ํ ์ปดํฌ๋ํธ๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๊ณ ๊ฐ๋ ์ฑ์ ๋์ธ๋ค.
์ํ ๊ด๋ฆฌ ์ ๋ฌด๋ฅผ ๋ฐ๋ก ์๊ธฐ ์ด๋ ค์ -> React๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋ฅผ ์ํํ๋ฏ๋ก ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค.
๋ณต์กํ ์์๋ ์ ๋ถ Hook์ผ๋ก ๊ฒฉ๋ฆฌ ๋ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ. -> custom hook์ผ๋ก ๋ก์ง ์ฌ์ฌ์ฉ
2. Hooks
2.1 useState
useState -> state๋ฅผ ์ฌ์ฉํ๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ Hook, useState() ํจ์์ ์ธ์๋ก ์ํ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ๋ค. ์ฒซ๋ฒ์งธ ์์๋ ์ํ๊ฐ, ๋๋ฒ์งธ ์์๋ ์ํ ์ ๋ฐ์ดํธ ํจ์
2.2 useEffect
useEffect -> Side-effect๋ฅผ ๋ค๋ฃฌ๋ค. Side-effect๋ React ์ปดํฌ๋ํธ์ ๋ ๋๋ง๊ณผ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์๋ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ ์ธ๋ถ ์์คํ ๋๊ธฐํ ๊ฐ์ ์์ ๋ค์ ์๋ฏธํ๋ค. ํด๋์ค ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋์ ์ ์ฌํ ์ญํ ์ Hook, useEffect() ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์๋ ํจ์๋ฉฐ, ๋๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด๋ก ์์กด์ฑ ๋ฐฐ์ด์ด๋ผ ๋ถ๋ฅธ๋ค. ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ๋ค์ด ๋ณ๊ฒฝ๋๋ฉด ์ฒซ๋ฒ์งธ ํจ์๊ฐ ํธ์ถ๋๋ค. ์ฒซ๋ฒ์งธ ํจ์๋ ํจ์๋ฅผ ๋ฐํํ๋๋ฐ ์ด๋ฅผ cleanup์ด๋ผ ๋ถ๋ฅด๋ฉฐ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋๋ ์ธ๋ง์ดํธ๋ ๋ ์ด ํจ์๊ฐ ์คํ๋๋ค.
useEffect(() => {
// ๋ถ์ ํจ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋
// cleanup ํจ์
return () => {
// cleanup ์ฝ๋
};
}, []);
๋ง์ฝ ์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ๋ฉด ๋งค ๋ ๋๋ง๋ง๋ค Side-effect ํจ์์ cleanup ํจ์๊ฐ ์คํ๋๋ค. ํจ์๊ฐ ๊ณ์ ํธ์ถ๋ผ ๋ฌดํ๋ฃจํ๋ก ์ธํ overflow๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
2.3 useContext
Context API์ ํจ๊ป ์ฌ์ฉ๋๋ Hook์ผ๋ก ์ปดํฌ๋ํธ์ ์ ์ญ ์ํ๋ฅผ ๊ณต์ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ ๊ณผ์ , ์ฆ Props driling์ ํด๊ฒฐํ ์ ์๋ค.
import React, { useContext } from 'react';
const UserContext = React.createContext();
function App() {
return (
<UserContext.Provider value="John">
<UserProfile />
</UserContext.Provider>
);
}
function UserProfile() {
const user = useContext(UserContext);
return <p>Welcome, {user}!</p>;
}
Context ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ Provider์ ์ ์ญ ์ํ๋ฅผ ๊ณต์ ํ ํ์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๋ฉด ๊ฐ ํ์ ์ปดํฌ๋ํธ์์ useContext hook์ ์ฌ์ฉํด Context ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
2.4 useRef
ref -> reference(์ฐธ์กฐ) ์ฐธ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ Hook ๊ฐ(current)์ด ๋ฐ๋์ด๋ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ผ๋ฉฐ, ์ปดํฌ๋ํธ ๋ ๋๋ง๊ณผ ๊ด๋ จ์์ด ๊ฐ์ ์ ์งํ๋ค. useRef() ํจ์๋ DOM์ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ ์ ์๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ์ผ๋ก input์ focus๋ฅผ ์ค ์ ์๋ค.
function Component() {
const inputRef = useRef(null);
const focusInput = () => {
// input ์์์ ํฌ์ปค์ค๋ฅผ ์ค๋ค.
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={focusInput}>Focus Input</button>
</div>
);
}
2.5 useLayoutEffect
useLayoutEffect๋ ์ปดํฌ๋ํธ ๋ ๋๋ง ์ , ๋ ์ด์์๊ณผ ํ์ธํธ ๊ณผ์ ์ด ์ผ์ด๋๊ธฐ ์ง์ ์ ์คํ๋๋ค. ๋ผ์ฐ์ ๋ ๋๋ง ์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฑฐ์ด ์์ ์ ์ํํ๋ค๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ๊ฒ ์ด๋ค. ์ค๋ฌด์์ ๊ฑฐ์? ์ฌ์ฉํ์ง ์์๋ hook
3. React StrictMode?
React ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๊ณ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๋ํผ ์ปดํฌ๋ํธ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ํ์ฑํ๋๋ฉฐ, ํ๋ก๋์ ์์๋ ๋ฌด์๋๋ค. ๋ง์ฝ, Effect ๋ด๋ถ์์ console.log() ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ปดํฌ๋ํธ ๋ง์ดํธ์ ๋ธ๋ผ์ฐ์ ์ฝ์์ฐฝ์ ๋ก๊ทธ๊ฐ ๋ ๋ฒ ์ฐํ๋ค๋ฉด StrictMode๋ฅผ ์ฌ์ฉํ๊ณ ์์ ํ๋ฅ ์ด ๋๋ค.
์ค๋ณต๋ Props ๊ฐ์ง, ๋ ๊ฑฐ์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ์ฌ์ฉ, ๋ถ์์ฉ์ ์ ๋ฐํ๋ ๋ ๋๋ง์ ๋ํ ๊ฒฝ๊ณ
์ถ๊ฐ ํค์๋
HoC
HOC
Higher Order Component = ๊ณ ์ฐจ ์ปดํฌ๋ํธ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ ์ปดํฌ๋ํธ๋ก ํน์ ๋ก์ง์ ์ฌํ์ฉํ๊ธฐ ์ํ ํจํด์ผ๋ก, ์ธ์๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๊ณ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค. ์ ์ ๊ถํ์ ๋ฐ๋ฅธ ํ์ด์ง ์ ๊ทผ์ ์ ํํ๋ ๋ผ์ฐํ ์ฒ๋ฆฌ๋ก HOC ํจํด์ ์ฌ์ฉํ ๊ฒฝํ์ด ์๋ค.
์ฌ์ฉ ์์
import { useEffect } from 'react';
const withLogger = WrappedComponent => props => {
useEffect(() => {
console.log(WrappedComponent.name);
}, []);
return <WrappedComponent {...props} />;
}
Last updated