ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react hook

useInsertionEffect

dev_been94 2024. 12. 14. 12:07
728x90
๋ฐ˜์‘ํ˜•

useInsertionEffect

๐ŸŽฏ useInsertionEffect๋ž€ ๋ฌด์—‡์ผ๊นŒ?

**useInsertionEffect**๋Š” React 18๋ถ€ํ„ฐ ๋“ฑ์žฅํ•œ ํŠน์ˆ˜ํ•œ ํ›…์ด์—์š”.
์ฃผ๋กœ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์Šคํƒ€์ผ๋ง ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•ด์š”.

์ด ํ›…์˜ ํ•ต์‹ฌ ์—ญํ• ์€ **"DOM์ด ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ „์— ์Šคํƒ€์ผ ๊ฐ™์€ ๋ถ€๊ฐ€ ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ"**์ด์—์š”.
๊ฐ„๋‹จํžˆ ๋งํ•ด, ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ๋ฏธ๋ฆฌ ํ•„์š”ํ•œ ์ž‘์—…(์Šคํƒ€์ผ ์‚ฝ์ž… ๋“ฑ)์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค˜์š”.

 

๐Ÿงต ์‹ค์ƒํ™œ ๋น„์œ : ์˜ท ์ž…ํžˆ๊ธฐ

์˜ท์„ ์ž…์„ ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”? ๐Ÿ‘—

  • ํ™”๋ฉด์— ์š”์†Œ(์‚ฌ๋žŒ)๊ฐ€ ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์˜ท(์Šคํƒ€์ผ)์„ ๋ฏธ๋ฆฌ ์ž…ํ˜€์•ผ ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ด๊ฒ ์ฃ ?
  • ๋งŒ์•ฝ ์˜ท์„ ์ž…ํžˆ๋Š” ํƒ€์ด๋ฐ์ด ๋Šฆ์–ด์„œ ํ™”๋ฉด์— ์š”์†Œ๊ฐ€ ๋จผ์ € ๋‚˜ํƒ€๋‚˜๋ฒ„๋ฆฌ๋ฉด, ์ž ๊น์ด๋ผ๋„ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ๋ชจ์Šต์ด ๋ณด์ผ ์ˆ˜ ์žˆ์–ด์š”.

**useInsertionEffect**๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์Šคํƒ€์ผ์ด ๋จผ์ € ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”.

 

๐Ÿ› ๏ธ useInsertionEffect ์‚ฌ์šฉ ์˜ˆ์‹œ

React์—์„œ useInsertionEffect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

๐Ÿงฉ CSS ์‚ฝ์ž… ์‹œ๋‚˜๋ฆฌ์˜ค

useInsertionEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— CSS ์Šคํƒ€์ผ์„ ๋™์ ์œผ๋กœ ์‚ฝ์ž…ํ•˜๋Š” ์˜ˆ์ œ์˜ˆ์š”.

import React, { useInsertionEffect, useState } from "react";

function StyledBox() {
  const [color, setColor] = useState("blue");

  // ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€
  useInsertionEffect(() => {
    const style = document.createElement("style");
    style.innerHTML = `
      .dynamic-box {
        width: 200px;
        height: 200px;
        background-color: ${color};
        border: 2px solid black;
      }
    `;
    document.head.appendChild(style); // ์Šคํƒ€์ผ์„ <head>์— ์ถ”๊ฐ€
    return () => {
      document.head.removeChild(style); // ์ •๋ฆฌ(clean-up) ์ž‘์—…
    };
  }, [color]); // color ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

  return (
    <div>
      <div className="dynamic-box"></div>
      <button onClick={() => setColor("red")}>๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ</button>
      <button onClick={() => setColor("green")}>์ดˆ๋ก์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ</button>
    </div>
  );
}

export default StyledBox;

 

๐Ÿ” ์ฝ”๋“œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?

  1. useInsertionEffect
    • ์ด ํ›…์€ DOM์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์‹คํ–‰๋ผ์š”.
    • ์Šคํƒ€์ผ(<style>)์„ <head> ํƒœ๊ทธ์— ๋ฏธ๋ฆฌ ์‚ฝ์ž…ํ•ด์„œ ํ™”๋ฉด์— ํ‘œ์‹œ๋  ๋•Œ ์Šคํƒ€์ผ์ด ์ด๋ฏธ ์ ์šฉ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์š”.
  2. ๋™์  ์Šคํƒ€์ผ ์ถ”๊ฐ€
    • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด color ๊ฐ’์ด ๋ฐ”๋€Œ๊ณ , ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ํ™”๋ฉด์ด ๊นœ๋นก์ด๊ฑฐ๋‚˜ ์Šคํƒ€์ผ์ด ๋Šฆ๊ฒŒ ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ๋ฏธ๋ฆฌ CSS๋ฅผ ์‚ฝ์ž…ํ•ด์š”.
  3. ์ •๋ฆฌ ์ž‘์—…
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์งˆ ๋•Œ ๊ธฐ์กด์˜ <style> ํƒœ๊ทธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿงฉ useEffect์™€ useInsertionEffect์˜ ์ฐจ์ด์ ์€?

  • useEffect:
    • ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋œ ํ›„ ์‹คํ–‰๋ผ์š”.
    • ์Šคํƒ€์ผ ์‚ฝ์ž… ๊ฐ™์€ ์ž‘์—…์„ ํ•˜๋ฉด ์ž ๊น ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ๋ชจ์Šต์ด ๋ณด์ผ ์ˆ˜ ์žˆ์–ด์š”.
  • useInsertionEffect:
    • ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์‹คํ–‰๋ผ์š”.
    • ์Šคํƒ€์ผ์ด ๋ฏธ๋ฆฌ ์ ์šฉ๋˜๋ฏ€๋กœ ํ™”๋ฉด์ด ๊นœ๋นก์ด์ง€ ์•Š์•„์š”.

 

๐Ÿš€ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

  1. CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:
    • ์Šคํƒ€์ผ์„ ๋™์ ์œผ๋กœ ์‚ฝ์ž…ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ด์š”.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, styled-components๋‚˜ emotion ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋ผ์š”.
  2. ์„ฑ๋Šฅ ์ตœ์ ํ™”:
    • ํ™”๋ฉด ๊นœ๋นก์ž„์ด๋‚˜ ์Šคํƒ€์ผ ์ ์šฉ ์ง€์—ฐ์„ ๋ง‰์•„์•ผ ํ•  ๋•Œ.

 

๐ŸŒŸ ์ •๋ฆฌํ•˜์ž๋ฉด!

useInsertionEffect๋Š” ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ํŠน์ˆ˜ํ•œ ํ›…์œผ๋กœ, ์ฃผ๋กœ ์Šคํƒ€์ผ ์‚ฝ์ž… ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ด ๋•๋ถ„์— ๊นœ๋นก์ž„ ์—†์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์Šคํƒ€์ผ์ด ์ ์šฉ๋ผ์š”!

728x90
๋ฐ˜์‘ํ˜•

'web > react hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

useMemo  (2) 2024.12.14
useLayoutEffect  (0) 2024.12.14
useImperativeHandle  (0) 2024.12.14
useId  (0) 2024.12.14
useEffect  (1) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250