React์์ ์ํ๋ DOM ๋ณ๊ฒฝ ํ์ ์คํํ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ค ๋
์ฐ๋ฆฌ๋ ๋ณดํต useEffect
๋ฅผ ๋ง์ด ์ฐ๋๋ฐ,
๋น์ทํ ์ด๋ฆ์ useLayoutEffect
๋ ์๊ณ , ์ธ์ ์ด๋ค ๊ฑธ ์จ์ผ ํ ์ง ๊ณ ๋ฏผ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
๊ทธ๋์ ์ด๋ฒ์ ์ค์ ์ฐจ์ด์ ๊ณผ ์ฌ์ฉ ๊ธฐ์ค์ ์ ๋ฆฌํด๋ดค๋ค.
Hook | ์คํ ํ์ด๋ฐ |
---|---|
useEffect | ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ ์ค์ ๋ก ํ๋ฉด์ ๋ฐ์๋ ํ ์คํ |
useLayoutEffect | ๋ ๋๋ง์ด ์๋ฃ๋๊ธฐ ์ง์ , DOM์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์คํ |
์ฆ, useLayoutEffect
๋ ์๊ฐ์ ์ผ๋ก ๊ทธ๋ ค์ง๊ธฐ ์ ์ DOM ์กฐ์์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ ํต์ฌ์ด๋ค.
function MyComponent() {
useEffect(() => {
console.log('โ
useEffect ์คํ');
});
useLayoutEffect(() => {
console.log('โ ๏ธ useLayoutEffect ์คํ');
});
return <div>๋ ๋๋ง ์ค...</div>;
}
์ถ๋ ฅ ์์:
โ ๏ธ useLayoutEffect ์คํ
โ
useEffect ์คํ
useLayoutEffect
๊ฐ ๋จผ์ ์คํ๋๊ณ โ ๊ทธ ๋ค์์ ํ๋ฉด์ด ๊ทธ๋ ค์ง โ ๊ทธ ์ดํ useEffect
useLayoutEffect
๋ ๋ค์์ฒ๋ผ ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ๋ ์ด์์ ์กฐ์ ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์จ์ผ ํ๋ค.
useLayoutEffect(() => {
const width = boxRef.current.offsetWidth;
boxRef.current.style.left = `${width / 2}px`;
}, []);
useLayoutEffect
๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด ๊ทธ๋ฆฌ๊ธฐ(painting)๋ฅผ ๋ฉ์ถ๊ณ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
๊ทธ๋์ ๋ถํ์ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง์ด ๋๋ ค์ง๊ณ ,
ํนํ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์๋ ํ๋ ์ ๋๋์ด ์๊ธฐ๊ธฐ๋ ํ๋ค.
useEffect(() => {
document.title = 'ํ์ด์ง ์ ๋ชฉ ๋ฐ๊พธ๊ธฐ';
}, []);
useEffect
๋ก ์ฒ๋ฆฌํ๋ฉด ์ถฉ๋ถํ๋ค.ํญ๋ชฉ | useEffect | useLayoutEffect |
---|---|---|
์คํ ์์ | ํ๋ฉด ๊ทธ๋ ค์ง ํ | ํ๋ฉด ๊ทธ๋ ค์ง๊ธฐ ์ง์ |
๋น๋๊ธฐ ์ฌ๋ถ | ๋น๋๊ธฐ์ | ๋๊ธฐ์ |
์ฑ๋ฅ ์ํฅ | ๊ฑฐ์ ์์ | ์ฃผ์ ํ์ (๋ ๋๋ง ๋ธ๋กํน) |
์ฃผ ์ฌ์ฉ ๋ชฉ์ | ๋ฐ์ดํฐ ํจ์นญ, ๋ฆฌ์ค๋ ๋ฑ๋ก ๋ฑ | DOM ์์น, ์ฌ์ด์ฆ ์กฐ์ |
๊ฐ์ธ ํ๋ก์ ํธ์์๋ useEffect
๋ง์ผ๋ก๋ ๋๋ถ๋ถ์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์๋ค.
๊ทธ๋ฐ๋ฐ ํดํ UI๋ฅผ ๋ง๋ค๋ฉด์ useLayoutEffect
๋ก ์์น ๊ณ์ฐ์ ์ ํ๋ฉด
ํดํ์ด ๊น๋นก์ด๋ฉฐ ์์ง์ด๋ ํ์์ด ์๊ฒผ๊ณ ,
๊ทธ์ ์ผ "์ ์ด๊ฒ ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ๋ผ์ผ ํ๋ ๊ฑฐ๊ตฌ๋" ํ๊ณ ์ค๊ฐํ๋ค.
์ด์ ๋ โ์ ๋ง DOM ๊ณ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง useLayoutEffect
๋ฅผ ์ฐ์โ๋ ์์น์ด ์๊ฒผ๋ค.
๐งฉ "๋ ๋ค ์ดํํธ์ง๋ง, '์ธ์ ์คํ๋๋๋'๋ ์ ํ ๋ค๋ฅด๋ค."