์ปดํฌ๋ํธ๊ฐ ํน์ ์ ๋ณด๋ฅผ โ๊ธฐ์ตโํ๋๋ก ํ๊ณ ์ถ์ง๋ง ํด๋น ์ ๋ณด๊ฐ ์ ๋ ๋๋ง์ ์ด๋ฐํ์ง ์๋๋ก ํ๋ ค๋ ๊ฒฝ์ฐref
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
import { useRef } from โreactโ;
ref.current
์์ฑ์ ํตํด ํด๋น ref์ ํ์ฌ ๊ฐ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ ์๋์ ์ผ๋ก ๋ณ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ฝ๊ธฐ์ ์ฐ๊ธฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค. React๊ฐ ์ถ์ ํ์ง ์๋ ์ปดํฌ๋ํธ์ ๋น๋ฐ ์ฃผ๋จธ๋์ ๊ฐ์ต๋๋ค.์ปดํฌ๋ํธ๋ ref๊ฐ ์ฆ๊ฐํ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ค
ref ์ state์ ์ฐจ์ด์
refs | state |
useRef(initialValue) ๋ย { current: initialValue } ์ ๋ฐํ | useState(initialValue) ๋ state ๋ณ์์ ํ์ฌ๊ฐ๊ณผ state ์ค์ ์ํจ์([value, setValue] )๋ฅผ ๋ฐํ |
๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง์ ์ด๋ฐํ์ง ์์ | ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง์ ์ด๋ฐํจ |
Mutableโ ๋ ๋๋ง ํ๋ก์ธ์ค ์ธ๋ถ์์ current ๊ฐ์ ์์ ํ๊ณ ์
๋ฐ์ดํธํ ์ ์์ | โImmutableโโ state setting ํจ์๋ฅผ ์ฌ์ฉํ์ฌ state ๋ณ์๋ฅผ ์์ ํด ๋ฆฌ๋ ๋๋ง์ ๋๊ธฐ์ด์ ์ถ๊ฐํด์ผํจ |
๋ ๋๋ง ์ค์๋ย current ย ๊ฐ์ ์ฝ๊ฑฐ๋ ์ฐ์ง ์์์ผ ํจ | ์ธ์ ๋ ์ง state๋ฅผ ์ฝ์ ์ ์์. ๊ฐ ๋ ๋๋ง์๋ ๋ณ๊ฒฝ๋์ง ์๋ ์์ฒด stateย snapshot์ด ์์ |
ref๋ ๋ด๋ถ์์ ์ด๋ป๊ฒ ์๋ํ๋์?
// Inside of React function useRef(initialValue) { const [ref, unused] = useState({ current: initialValue }); return ref; }
์ฒซ ๋ฒ์งธ ๋ ๋๋ง ์ค์useRef
๋{current: initialValue}
๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ React์ ์ํด ์ ์ฅ๋๋ฏ๋ก ๋ค์ ๋ ๋๋ง ์ค์ ๋์ผํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค.
ref๋ก DOM ์กฐ์ํ๊ธฐ
React ๋ ๋ ๋๋ง ์ถ๋ ฅ๊ณผ ์ผ์นํ๋๋ก DOM์ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ฏ๋ก ์ปดํฌ๋ํธ๊ฐ ์์ฃผ ์กฐ์ํ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง ๋๋ก๋ ๋ ธ๋์ ์ด์ ์ ๋ง์ถ๊ฑฐ๋ ์คํฌ๋กคํ๊ฑฐ๋ ํฌ๊ธฐ์ ์์น๋ฅผ ์ธก์ ํ๊ธฐ ์ํด React๊ฐ ๊ด๋ฆฌํ๋ DOM ์์์ ์ ๊ทผํด์ผ ํ ์๋ ์์ต๋๋ค.
๋ ธ๋์ ๋ํ ref ๊ฐ์ ธ์ค๊ธฐ
- React๊ฐ ๊ด๋ฆฌํ๋ DOM ๋
ธ๋์ ์ ๊ทผํ๋ ค๋ฉด, ๋จผ์
useRef
ํ ์ ๋ถ๋ฌ์ค๊ธฐ
import { useRef } from 'react';
- ์ปดํฌ๋ํธ ๋ด๋ถ์์ ref๋ฅผ ์ ์ธ
const myRef = useRef(null);
- DOM ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ฌ JSXํ๊ทธ์
ref
์์ฑ์ผ๋ก ์ฐธ์กฐ๋ฅผ ์ ๋ฌ
<div ref={myRef}>
Effect๋ ๋ฌด์์ด๋ฉฐ ์ด๋ฒคํธ์๋ ์ด๋ค๊ฒ ๋ค๋ฅธ๊ฐ์?
- ๋ ๋๋ง ์ฝ๋๋ ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ props์ state๋ฅผ ๊ฐ์ ธ์ ๋ณํํ๊ณ ํ๋ฉด์ ํ์ํ JSX๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์๋ ํจ์๋ก, ๊ณ์ฐ๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ๋ณ๋์ ์์ ๋ ์ํํฉ๋๋ค.
Effect ์์ฑ ๋ฐฉ๋ฒ
- Effect๋ฅผ ์ ์ธํฉ๋๋ค.
- Effect์ ์์กด์ฑ์ ๋ช ์ํฉ๋๋ค.
- ํ์ํ ๊ฒฝ์ฐ ํด๋ฆฐ์ ์ ์ถ๊ฐํฉ๋๋ค.
Step 1 : Declare an Effect
import { useEffect } from 'react';
function MyComponent() { useEffect(() => { // ์ฌ๊ธฐ์ ์ฝ๋๋ ๋งค ๋ ๋๋ง ํ์ ์คํ๋ฉ๋๋ค. }); return <div />;
- React์์
useEffect
ํ ์ importํฉ๋๋ค.
- ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์์ ํธ์ถํ๊ณ Effect ๋ด๋ถ์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค React๋ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๊ณ useEffect ๋ด๋ถ์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ์ฆ,useEffect
๋ ํด๋น ๋ ๋๋ง์ด ํ๋ฉด์ ๋ฐ์์ด ๋ ๋๊น์ง ์ฝ๋ ์กฐ๊ฐ์ ์คํ์ โ์ง์ฐโํฉ๋๋ค.
Step 2 : Specify the Effect dependencies
- ๋๋ก๋ ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค. ์ธ๋ถ ์์คํ ๊ณผ์ ๋๊ธฐํ๊ฐ ํญ์ ์ฆ๊ฐ์ ์ธ ๊ฒ์ ์๋๋ฏ๋ก ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋๊ธฐํ๋ฅผ ๊ฑด๋๋ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋๋ก๋ ์๋ชป๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
useEffect(() => { // ... }, []);
useEffect
ํธ์ถ์ ๋ ๋ฒ์งธ ์ธ์๋ก ์์กด์ฑ ๋ฐฐ์ด์ ์ง์ ํ์ฌ React๊ฐ ๋ถํ์ํ๊ฒ Effect๋ฅผ ๋ค์ ์คํํ์ง ์๋๋ก ์ง์ํ ์ ์์ต๋๋ค.
useEffect(() => { // This runs after every render // ๋ ๋์๋ง๋ค ์คํ๋ฉ๋๋ค. }); useEffect(() => { // This runs only on mount (when the component appears) // ์ค์ง ๋ง์ดํธ์(์ปดํฌ๋ํธ๊ฐ ๋ํ๋ ๋)์๋ง ์คํ๋ฉ๋๋ค. }, []); useEffect(() => { // This runs on mount *and also* if either a or b have changed since the last render // ๋ง์ดํธ์ ๋ฟ๋ง ์๋๋ผ a ๋๋ b๊ฐ ์ง์ ๋ ๋์ ๋ฌ๋ผ์ก์ ๋์๋ ์คํ๋ฉ๋๋ค. }, [a, b]);
Step 3 : Add cleanup if needed
useEffect(() => { const connection = createConnection(); connection.connect(); }, []);
Effect๋ ๋ง์ดํธ ์์๋ง ์คํ๋๋ฏ๋ก ์ฝ์์์๋ ํ๋ฒ๋ง ์ธ์๋ ๊ฒ์ผ๋ก ์์๋์ง๋ง ๋๋ฒ ์ถ๋ ฅ๋จ
useEffect(() => { const connection = createConnection(); connection.connect(); return () => { connection.disconnect(); }; }, []);
React๋ Effect๊ฐ ๋ค์ ์คํ๋๊ธฐ ์ ์ ๋งค๋ฒ ํด๋ฆฐ์
ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋ ๋ ๋ง์ง๋ง์ผ๋ก ํ๋ฒ ๋ ํธ์ถํฉ๋๋ค.
Effect์ ์๋ช ์ฃผ๊ธฐ
- ์ปดํฌ๋ํธ๋ ํ๋ฉด์ ์ถ๊ฐ๋ ๋ ๋ง์ดํธ๋ฉ๋๋ค.
- ์ปดํฌ๋ํธ๋ props๋ state๋ฅผ ๋ฐ์ผ๋ฉด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ํ๋ฉด์์ ์ ๊ฑฐ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋ฉ๋๋ค.